Kekeの日記

エンジニア、読書なんでも

自動化好きの道具箱Git hook

f:id:bobchan1915:20181101015541j:plain

medium.com

本記事

Gitにはhookというイベントによって発火し実行できる機能があります。

画像にもあったように、「push前にこの処理を挟みたい、、、」などのケースはたくさんあったので、皆さんもあるのではないでしょうか。

今回はそのhookを詳細に掴んでいこうと思います。

公式ページ

Git - Git フック

分類分け

以下の二つにまず大きく分けることができます。

1. クライアントサイドフック

commitmergeといったクライアントでの操作でフックが発火します。

また、以下のようにもっと細かく分けることできます。

1.1 コミットワークフローフック

pre-commitフックはコミットの入力前に実行され、0以外のステータスコードが返ってきたときにコミットが中断されます。。使い道としては、コミット前のテスト実施や、コードに.envが入ってしまわないかを確認したり用途は広いです。 git commit --no-verifyで実行を無視することができます。

prepare-commit-msgフックはコミットメッセージエディターが起動する直前、デフォルトメッセージが生成された直後に実行されます。コミットの作者がそれを目にする前にデフォルトメッセージを編集することができます。

commit-msgフックはスクリプトが0以外の値を返した場合Gitはコミットプロセスを中断します。

post-commitフックは、コミットプロセスが完了した後に実行されます。git log -1 HEADを実行することで直前のコミットを簡単に取り出すことができます。

1.2 Eメールワークフローフック

git amコマンドに対するものなのですが、私も、私の周りもあまりこのコマンドを使う人がいないので割愛します。

1.3 その他のクライアントフック

pre-pushフックはpushする前に実行され、ゼロ以外の終了ステータスを返すと以下のようになる。

pre-rebase フックは何かをリベースする前に実行され、ゼロ以外を返すとその処理を中断させることができます。

post-checkoutフックはgit checkout が正常に終了すると実行されます。

post-mergeフックはmergeコマンドが正常に終了したときに実行されます。

2. サーバーサイドフック

プッシュされたコミットを受け取るといったサーバーでの操作でフックが発火します。

また、以下のようにもっと細かく分けることできます。

1.3 その他のクライアントフック

pre-receiveフックはgit pushをしたら最初に実行されます。

post-receiveフックは処理が終了した後で実行されるもので、他のサービスの更新やユーザーへの通知などに使えます。

updateスクリプトは pre-receive スクリプトと似ていますが、プッシュしてきた人が更新しようとしているブランチごとに実行されるという点が異なります