web-dev-qa-db-ja.com

gitでフェッチまたはプルコマンドの直後にコマンドを実行するにはどうすればよいですか?

GHC(Glasgow Haskell Compiler)リポジトリのクローンを作成しました。コンパイラーをビルドするには、いくつかのライブラリーが必要です。これらのライブラリーはすべて、gitリポジトリーとしても使用できます。ライブを容易にするために、GHCハッカーはスクリプトsync-all実行すると、すべての依存リポジトリが更新されます。

さて、私の質問へ:どうすればgitを実行させることができます./sync-all pullやった後git pull自動的に?フックの使い方について何か聞きましたが、どうすればいいかわかりません。

31
fuz

クライアント側(マシン)でgit pullの後にスクリプトを実行する必要がある場合、信頼できる解決策はありません。

マージ後のクライアント側フックここで言及 )は、すべてのプルによってトリガーされません(たとえば、高速の場合ではなく、プルリベースではトリガーされません)。前方マージ)

したがって、両方のコマンドをラップするエイリアスは、可能な回避策のままです。


元の回答(2011)

サーバー側で必要な場合は、ベアリポジトリをチェックアウトし、(サーバー上の)ベアリポジトリにプッシュするたびに(サーバー上の)作業ツリーからプルします。

post-receiveまたはpost-updateフックは通常、この種のタスクに使用され、各プッシュの後に実行されます。
post-receivepost-updateフックの違いは引数にあります:post-receiveは名前に加えて、すべての参照の古い値と新しい値の両方。

欠けている部分は次のとおりです:フックが実行される場所

ブログの投稿 " Missing git hooks documentation " from(a great)SO contributor Mark Longair これからいくつかの光を放つ:

現在の作業ディレクトリはgitディレクトリになります

  • したがって、これが「/src/git/test.git/」と呼ばれるベアリポジトリの場合、それが現在の作業ディレクトリになります。これが非ベアリポジトリで、作業ツリーの最上位が「/home/mark/test/」の場合、現在の作業ディレクトリは「/home/mark/test/.git/」になります。 」

Chris Johnsen 彼の詳細 SO回答 :「–-git-dirまたはGIT_DIRが指定されているが、-–work-treeGIT_WORK_TREEcore.worktreeのいずれも指定されていない場合、現在の作業ディレクトリがトップディレクトリと見なされます。作業ツリーの。」

言い換えると、作業ツリーは現在のディレクトリ(.gitディレクトリ)にもなりますこれはほぼ確実に望んでいるものではありません

hook/post-receiveスクリプトを作成して実行可能にしたら、GIT_WORK_TREEが正しいディレクトリで実行されるように、./sync-all pullを正しいパスに設定してください(つまり、「xxx.git」ではありません)。

27
VonC

git pullを実行すると、gitは実際にフェッチの後にマージを実行します。つまり、プルが完了したときにpost-mergeフックを使用してスクリプトを実行できます。

これを設定するには、リポジトリの.git/hooks/ディレクトリにpost-mergeという実行可能スクリプトを作成する必要があります。

競合のためにマージが失敗した場合、このスクリプトは実行されないことに注意してください。

16
nullability