デプロイの一部として別のリポジトリのクローンを作成するgitpost-receiveフックを作成しています。リポジトリを特定のフォルダに複製し、-C
後続のgitコマンドのオプションを使用して、ディレクトリをチェックアウトされたリポジトリのディレクトリに設定します(マニュアルページに記載されています)。
フックは、コマンドラインから手動で実行すると期待どおりに機能しますが、フックをgitで実行すると(つまり、プッシュを受信すると)、コマンドはfatal: Not a git repository: '.'
。で失敗します。私はスワップアウトするとき-C
のために--git-dir
それが動作します。
これは、複製、ベアリポジトリの作成、git init --bare
およびコンテンツを使用した実行可能フックの作成が非常に簡単です。
#!/bin/bash
set -xe
SOME_REPO_URL=???? # Some repo that is not this one
repopath=/tmp/somerepo
git clone $SOME_REPO_URL $repopath
# 1: This fails when run through the git hook
git -C $repopath checkout -b somebranch HEAD~1
# 2: This works every time
# git --git-dir $repopath/.git checkout -b somebranch HEAD~1
コマンドラインからスクリプトを実行すると期待どおりに機能しますが、リポジトリにプッシュするとフックは失敗します。コメント1
とコメント解除2
はどちらの場合でも機能します。
これが意図された動作であることを示すドキュメントが見つかりません。説明をいただければ幸いです。
これはUbuntu16.04のgit2.7.4です。
間の文字通りの違い:
git -C directory git-sub-command ...
そして:
git --git-dir directory git-sub-command ...
フロントエンドセットアッププログラムgit
は、最初にOSレベルの「ディレクトリの変更」操作(os.chdir
Python、chdir()
Cなどから)を使用$GIT_DIR
し、2番目に環境変数を設定します。いずれの場合も、サブコマンドを見つけて実行します。(あなたが実際に行うことができます注両方を。)これが文書化され、複数の効果を含め、-C
オプションとの間の相互作用-C
と--git-dir
。
ただし、これは問題を1レベル下げるだけです。ここgit-checkout
で、(git --exec-path
ディレクトリにある)$GIT_DIR
現在の作業ディレクトリとは異なる動作をする必要があります。直接の答えは、トップレベルのgit
コマンドドキュメントの[環境変数]セクションにあります。
GIT_DIR
場合はGIT_DIR
、環境変数が設定されている、それはデフォルトの代わりに使用するパスを指定する.git
リポジトリのベースのために。--git-dir
コマンドラインオプションも、この値を設定します。
ここでJanKrügerのコメントが出てきます。Gitフックを作成するときは、Gitがいくつかの環境変数を設定する可能性があることに注意する必要があります。もし$GIT_DIR
、相対パス名に設定されている、とあなたはそれをオーバーライドしていない、とあなたはチェンジディレクトリを行う、あなたはすべての様々なGitのサブコマンドでは、リポジトリを見つける方法が変更されます。したがって、あなたはどちらかしなければならない国連が(デフォルト得るためにそれを-set $GIT_DIR
-not-セット動作)、または明示的に(ディレクトリの変更を渡ってそれを維持するために)絶対パスに設定、または明示的に設定し、パス、相対または絶対のあなたはどのような行動に応じて、いくつかの他のリポジトリ、したいです。
--work-tree
セット$GIT_WORK_TREE
、および他の同様の変数があることに注意してください。ただし、少なくともこれまでのすべてのGitバージョンで$GIT_DIR
は、Gitフックの「プリセット」(または「煩わしさ」:-))は1つだけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加