git hookで何ができるかを簡単にまとめた
基本的には以下のページに書いてある事
Gitフック
Customizing Git - Git Hooks
抜粋
-
.git/hooks
に配置 - 適切に命名すれば動く
- 要実行可能権限(chmod)
- RubyやPython等で自作可能
クライアントサイドフックの例
pre-commit (コミットメッセージが入力される前)
- 事前にテストを実行
- 行末の空白文字の検査
- ドキュメントの検査
- コーディングスタイルの検査
prepare-commit-msg (コミットメッセージエディターが起動する直前)
- テンプレートのコミットメッセージを使う
- 自動でIssue番号などをメッセージに追加
commit-msg (コミット時)
- コミットメッセージが要求された様式に沿っているか検査(チケット番号が入っているかなど)
post-commit (コミットプロセスが全て完了した後)
- 一般的に何かしらの通知といった目的に使用される
サーバーサイドフックの例
pre-receive (プッシュを処理するとき)
- 更新内容がすべてfast-forwardであることをチェック
- プッシュしたユーザーが適切なアクセス権を持っているかを調べる
post-receive (プッシュの処理が終了した後)
他のサービスの更新やユーザーへの通知
- メーリングリストへの投稿
- 継続的インテグレーションサーバーへの通知
- チケット追跡システムの更新
- コミットメッセージを解析して、チケットのオープン・修正・クローズなどの必要性を調べる (Pivotal Trackerとか)
update (pre-receive スクリプトと類似)
ブランチごとに実行されるという点が異なる
など
※Githubの場合はサーバーサイドをスクリプトを使ってカスタマイズすることはできないらしい(?)
(各Repositoryで Settings > Service Hooks とか GitHub Servicesとやらがある)
git hookはクライアントサイドに関しては、大人数だったり、メンバーの入れ替えが激しい場合はルールを徹底するのが難しいと思う。
サーバーサイドは反対に大人数でも問題ない。
たいぶ前からフックのカスタマイズをやろうやろうと思ったりしてきたが、結局シェルスクリプトのシンタックスなどでつまずいて断念してきた。
最近ようやくRubyで書けばもっと簡単にできると分かりまた気になり出している。
課題はクライアントサイドの一元管理が(調べた限りでは)出来なそうなで変更したら全既存プロジェクトに反映させるのに一手間かかる点。
(.gitignore_globalとかはできるのに)