GHC(Glasgow Haskell Compiler)リポジトリのクローンを作成しました。コンパイラーをビルドするには、いくつかのライブラリーが必要です。これらのライブラリーはすべて、gitリポジトリーとしても使用できます。ライブを容易にするために、GHCハッカーはスクリプトsync-all
実行すると、すべての依存リポジトリが更新されます。
さて、私の質問へ:どうすればgitを実行させることができます./sync-all pull
やった後git pull
自動的に?フックの使い方について何か聞きましたが、どうすればいいかわかりません。
クライアント側(マシン)でgit pull
の後にスクリプトを実行する必要がある場合、信頼できる解決策はありません。
マージ後のクライアント側フック ( ここで言及 )は、すべてのプルによってトリガーされません(たとえば、高速の場合ではなく、プルリベースではトリガーされません)。前方マージ)
したがって、両方のコマンドをラップするエイリアスは、可能な回避策のままです。
元の回答(2011)
サーバー側で必要な場合は、ベアリポジトリをチェックアウトし、(サーバー上の)ベアリポジトリにプッシュするたびに(サーバー上の)作業ツリーからプルします。
post-receive
またはpost-update
フックは通常、この種のタスクに使用され、各プッシュの後に実行されます。
post-receiveとpost-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-tree
、GIT_WORK_TREE
、core.worktree
のいずれも指定されていない場合、現在の作業ディレクトリがトップディレクトリと見なされます。作業ツリーの。」言い換えると、作業ツリーは現在のディレクトリ(“
.git
”ディレクトリ)にもなりますこれはほぼ確実に望んでいるものではありません。
hook/post-receive
スクリプトを作成して実行可能にしたら、GIT_WORK_TREE
が正しいディレクトリで実行されるように、./sync-all pull
を正しいパスに設定してください(つまり、「xxx.git
」ではありません)。
git pull
を実行すると、gitは実際にフェッチの後にマージを実行します。つまり、プルが完了したときにpost-merge
フックを使用してスクリプトを実行できます。
これを設定するには、リポジトリの.git/hooks/
ディレクトリにpost-merge
という実行可能スクリプトを作成する必要があります。
競合のためにマージが失敗した場合、このスクリプトは実行されないことに注意してください。