私のコメントとは別に、短い答えは「いいえ」です。私はGitの中の小さな欠陥だと思うことの一つは、各フックがちょうど一つのことされていることである。
- 事前にコミットフックが
.git/hooks/pre-commit
- あるupdateフックは
.git/hooks/update
です等々。しかし、あなたやあなたのチーム、あるいはグループがいくつかのcool/useful/pre-commit、prepare-commit-msgなどのフックを書いていて、すべてのものを実行したいのであればどうしますか?
Gitはそれを行うことはできません。フックは何フックA.続いフックBに続いてフックAを実行すると、フックBを実行しているとは異なる結果を生成することを意味状態、
を変える可能性があるため、実際のところ、そのは仕事をできた全く完全に自動化ソリューションは、ありません doはフックを便利なスタンドアロンのスクリプトとして記述し、はそれぞれというフックを.git/hooks/name
から順番に呼び出します。たとえば、「残ったデバッグ・ジャンクをチェックする」プリコミット・フックと、別の「スペース対タブ」プリコミット・フックがあるとします。 (この例では、私はちょうど今、その場でそれを作り、より良い例を考えることができなかったことから、順序に依存しません。)あなたの.git/hooks/pre-commit
は、読むかもしれない:
は
#! /bin/sh
# run pre-commit checks
/home/shared/teamX/scripts/git-check-leftover-debug-junk || exit $?
/home/shared/teamY/scripts/git-check-spaces-vs-tabs || exit $?
(最終|| exit $?
は必要ありませんそれだけで後でフックを追加することができます)。
ここでは二次的な問題があります。いくつかのフックでは、引数を渡すために"[email protected]"
を追加するだけで、すべてがうまくいきます。 pre-receive
とpost-receive
とpre-push
フックについては、重要なデータが標準入力に表示されます。 この入力はパイプから来ます。したがって、1つのフックがそれを読み取ると、データは消費され、残りのフックでは使用できなくなります。この問題を回避するには、入力をファイルにコピーし、各フックをそのファイルから読み込むようにリダイレクトします。 (読み込みをオフセット0から毎回再開する必要があるので、これはGitのバグと同じくらい大きなものではありません。パイプの代わりに入力を一時ファイルとして提供するだけでは十分ではありません。毎回ゼロに再シークする。)
以前の$ジョブでは、すべてのサブフックを見つけるために呼び出された名前を使って "サブフック"を実行する "マスターフック"を作成しました。サブフックは、フックと同じ名前パターンのディレクトリのパラレルセットから生成されました。マスターフックはstdinを一時ファイルにコピーします。とは引数を渡すので、各フックはあたかも単独のフックのように動作します。これにより、ファイル名の順番を制御しながら、フックを追加したり削除したりすることができました。の前にfoo
が実行されますが、の前にソートされます。10
は20
より前です。結局のところ私たちはそれほど多くの幻想を必要としないことが判明しました。私たちは一度に3つ以上のプレ受信フックを持っていませんでした。
(コードはしかし非常に単純であるシェルスクリプトとして、それはおよそ6行だ。。)
私は、「既存のフックがある場合、彼らは上書きさ」という主張を理解していない。これだけ'git init'でフックがコピーされるテンプレートディレクトリを設定します。 'git init'を実行するとコピーが行われます。既存のリポジトリで' git init'を実行すると、既存のフックがテンプレートフックで上書きされますか?もしそうなら、それはバグのように思えます。新しいフックを追加するだけです。 – torek
私の悪い - フックは上書きされません - 新しいフックは無視されます。 faceslapテストに失敗しました。 – iamthehousedog