web-dev-qa-db-ja.com

git-cloneとチェックアウト後のフック

マニュアルによると、post-checkoutフックはgit checkoutの後に実行されます(期待どおり)が、git cloneの後にも実行されます(--no-checkoutを渡さない限り)。

さて、次のことを考慮してください。

  • git cloneの前にローカルリポジトリがありません
  • フックはリモート間で同期されません
  • --templateで使用されるカスタムテンプレートディレクトリに保存されているフックは実行不可能にコピーされるため、git cloneの後にnotは実行されません。 (Jefromiが彼の答えで述べたように、それは実際には真実ではありませんが、フックはまだ実行されていません)

post-checkoutの後にgit cloneフックが実行されることは不可能のようです。それでも、 http://git-scm.com/docs/githooksgithooksのマニュアルページには、実行を回避する方法と、実行された場合に渡されるパラメータが明示的に記載されています。実行されました。これは、git-cloneの後にカスタムフックを実行できることを示します。

それで、どうしてそれは可能ですか?私は明らかにここで何かが欠けています。

判明

29

カスタムインストールを作成できると思います。.../share/git-core/templates/hooksのフックの名前を変更して、.sampleサフィックスを削除します。

リポジトリ内のフックディレクトリへのシンボリックリンクでいっぱいのテンプレートディレクトリを作成することもできます(例:post-checkout -> ../../hooks/post-checkout)。次に、複製されたリポジトリにその特定のフックが含まれている場合、それは実行されます。

あなたは正しいですが、ほとんどの場合、それは起こりません。

編集:テストしたところ、--templateオプションはアクセス許可を保持しているように見えるので、それを実現するためのはるかに簡単な方法です。それがそのビットを取り除いたことを示すためにあなたは何を見ましたか?

バージョンに関する最終決定:使用しているよりも新しいバージョンのgitのドキュメントをオンラインで見ています。この機能はdfa7a6cで追加されました(クローン:チェックアウト時にチェックアウト後のフックを実行します)。 git describeによると、これはv1.6.2-rc2まで含まれていませんでした。

15
Cascabel

githooksドキュメント から:

git-initが実行されると、いくつかのフックの例が新しいリポジトリのhooksディレクトリにコピーされますが、デフォルトではそれらはすべて無効になっています。フックを有効にするには、.sampleサフィックスを削除して名前を変更します。

この初期化は、クローン作成の一部として行われます。 init_db でのbuiltin-clone.cの呼び出しに注意してください。

例えば:

$ cat/tmp/my-git-template/hooks/post-checkout 
#! /bin/bash
echo "Hello from $ 0" 
 
 $ git clone --template =/tmp/my-git-template file:///tmp/repo.git my-clone 
/tmp/my-clone/.git /
 remoteで初期化された空のGitリポジトリ:オブジェクトのカウント:3、完了。
 remote:合計3(デルタ0) 、再利用0(デルタ0)
オブジェクトの受信:100%(3/3)、完了。
。git/hooks/post-checkoutからこんにちは
11
Greg Bacon