2016-10-31 4 views
0

のgitフックを保持またはマージすると、いくつかのチームがいくつかの標準およびいくつかの非標準フックを作成しました。大規模なマルチチーム環境でテンプレートフォルダ

git config --global init.templatedir "namedfolder"は、gitのすべてのインスタンスに対して "namedfolder"のフックを設定します。

既存のフックがある場合、それらは上書きされます。

実行可能な警告、またはフックをインテリジェントにマージする方法はありますか?たとえば、1つのチームによって使用されたプリコミットフックが存在し、失効を警告し、フックが更新されて、プリコミットが陳腐化チェックと相補的である(またはそうでない)他の機能を実行する場合、 stalenessチェックフックを削除します。フックに追加したいと仮定します。上記の--globalの実行前に別々に実行されない限り、実行する方法/フラグを見ない。

+0

私は、「既存のフックがある場合、彼らは上書きさ」という主張を理解していない。これだけ'git init'でフックがコピーされるテンプレートディレクトリを設定します。 'git init'を実行するとコピーが行われます。既存のリポジトリで' git init'を実行すると、既存のフックがテンプレートフックで上書きされますか?もしそうなら、それはバグのように思えます。新しいフックを追加するだけです。 – torek

+0

私の悪い - フックは上書きされません - 新しいフックは無視されます。 faceslapテストに失敗しました。 – iamthehousedog

答えて

0

私のコメントとは別に、短い答えは「いいえ」です。私は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-receivepost-receivepre-pushフックについては、重要なデータが標準入力に表示されます。 この入力はパイプから来ます。したがって、1つのフックがそれを読み取ると、データは消費され、残りのフックでは使用できなくなります。この問題を回避するには、入力をファイルにコピーし、各フックをそのファイルから読み込むようにリダイレクトします。 (読み込みをオフセット0から毎回再開する必要があるので、これはGitのバグと同じくらい大きなものではありません。パイプの代わりに入力を一時ファイルとして提供するだけでは十分ではありません。毎回ゼロに再シークする。)

以前の$ジョブでは、すべてのサブフックを見つけるために呼び出された名前を使って "サブフック"を実行する "マスターフック"を作成しました。サブフックは、フックと同じ名前パターンのディレクトリのパラレルセットから生成されました。マスターフックはstdinを一時ファイルにコピーします。は引数を渡すので、各フックはあたかも単独のフックのように動作します。これにより、ファイル名の順番を制御しながら、フックを追加したり削除したりすることができました。の前にfooが実行されますが、の前にソートされます。1020より前です。結局のところ私たちはそれほど多くの幻想を必要としないことが判明しました。私たちは一度に3つ以上のプレ受信フックを持っていませんでした。

(コードはしかし非常に単純であるシェルスクリプトとして、それはおよそ6行だ。。)

+1

これは、大企業環境の中でかなり標準的なセットアップです。 http://stackoverflow.com/questions/8730514/chaining-git-hooks#8734391への回答に基づいて、https://gist.github.com/paunin/649874a960d4eea1d5d6を参照してください。 – Mort

関連する問題