デプロイメントの一部として別のレポを複製するgit post-receiveフックを書いています。特定のフォルダにリポジトリをクローンし、その後のgitコマンドで-C
オプションを使用して、チェックアウトされたリポジトリのディレクトリにディレクトリを設定します(man pageに記載されています)。gitフックでrepoを操作するときの-Cと--git-dirの違い
コマンドラインから手動で実行すると、フックが正常に動作しますが、フックがgitによって実行されたとき(つまり、プッシュが受信されたとき)、コマンドはfatal: Not a git repository: '.'
で失敗します。私がを--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
をしていますが、にプッシュするときrepoは失敗するでしょう。 1
にコメントし、2
をコメント解除すると、どちらの場合でも機能します。
これは意図された動作であることを示すドキュメントは見つかりません - 説明は理解できます。
これは、Ubuntu 16.04でgit 2.7.4です。
'GIT_DIR'環境変数がフックで設定されていることがわかります。 checkoutコマンドを実行している間に設定を解除することができます。 –