20

gitolite を使用して中央の git リポジトリをセットアップしました。

ユーザーがレポにプッシュするたびに、他の場所でプルを実行し、続いて自動テストを実行するようにフックを設定したいと考えています。

これまでのところ、プルを実行したいだけです。

hooks ディレクトリに、更新後に次のスクリプト名を作成しました。

#!/bin/sh  
cd /home/git/www/epicac
git pull

./post-update を使用してこのスクリプトを呼び出すと、必要なことが正確に実行されます。

ただし、フックすると自動的に呼び出されるたびに、次のようになります。fatal: Not a git repository: '.'

なぜこれが起こっているのでしょうか?

4

4 に答える 4

28

このSO answerで提案されているように、実行するさまざまな診断があります。

特に、の値を確認してくださいGIT_DIRGIT_WORK_TREE

フックが実行されている間、GIT_DIRおよび (ワークツリーが から推測できない場合GIT_DIR)GIT_WORK_TREEが設定されます。
つまり、プルは、変更先のディレクトリ内のリポジトリでは実行されません。


ブログ記事Using Git Inside a Git Hookも参照してください。

最終的に、Linux の第一人者を引き継ぎました。彼は、git ユーザーがフック内で実行する環境がまったく異なることに気付きました。
Gitolite は env に対して多くのことを行いますが、私たちを台無しにしていたのはGIT_DIR.
それを理解した後、解決策は次のように簡単でした。

ENV.delete 'GIT_DIR'

post-receive' ' フックによってトリガーされる ruby​​ スクリプトで。


Git Tipでの同じ取引: post-receive フックを介して作業ツリーを自動更新しますが、これを回避するエレガントな方法があります:

ソリューション?フックは環境変数がフォルダーに設定された
状態で開始されるため、どのパスに「cd」しても、常に次の git コマンドをそこで実行しようとしますpost-receiveGIT_DIRrepo/.git
これを修正するには、設定を解除するだけです(エレガントなソリューションGIT_DIR
を提供 してくれた Ulrich Petri に感謝します):env -i

#!/bin/sh
cd ..
env -i git reset --hard
于 2010-08-22T19:11:54.703 に答える
7

を指定してはいかがでしょうか--git-dir

#!/bin/sh
cd /home/git/www/epicac
git --git-dir=.git pull
于 2012-02-15T06:00:55.407 に答える
1

気にしないで...ここで見つけました:https://serverfault.com/questions/107608/git-post-receive-hook-with-git-pull-failed-to-find-a-valid-git-directory

于 2010-08-22T19:07:34.790 に答える