Git フックを使ってみる

皆さんこんにちは、サーバーサイドエンジニアの大川です。今日はGit hooksを使ってちょっと遊んでみたので簡単にまとめてみようと思います!

Git フックって?!

Git フックはGitを用いた特定の作業に応じて処理を走らせるものです。

Git フックを活用することで「コミットをする前にlinter(コードの自動補正ツール)を走らせる」なんてことも可能です!

多分この記事より、公式ドキュメントを見たほうが分かりやすいのでリンクを置いておきます!

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF

Git フックの基礎

  • Git フックの処理はシェルスクリプトで記載します。
  • フック処理のファイルに拡張子は必要ありません。

Git フックの種類

Git フックは複数の種類存在しています。

コミット系

git commitコマンド実行直後に実行されるフック 〜pre-commitフック〜

  • pre-commitフックはgit commitコマンド実行直後に動作させたい処理を記載します。
  • 公式ドキュメントによると「いまからコミットされるスナップショットを検査したり、何かし忘れた事がないか確認したり、テストが実行できるか確認したり、何かしらコードを検査する目的で使用されます。」だそうです。
  • このフックで0以外が帰った場合コミットプロセスが停止します。
  • なのでlintチェックやローカルテストの実行などはこのタイミングで実施すると良さそうです。そもそもチェックが通らないとコミットできないので品質を上げる事ができます。
  • ただ、すべてのテストコードを実施することはやめたほうが良さそうです。すべてのテストが完了するまでコミットができない状態は開発体験としてあまりいいものではありません。
  • すべてのテストコードの実行はPR作成時のCIチェックで実施すべきかもしれません。
  • ちなみにgit commitコマンドに–no-verifyオプションを付与して実行することでpre-commitフックを回避することも可能です。

コミットメッセージエディタ起動直前に実行されるフック 〜prepare-commit-msgフック〜

  • prepare-commit-msgフックはgit commitのコミットメッセージ入力エディタの起動直前に動作させたい処理を記載します。
  • 修正内容をフックに記載する処理で判断して自動でコミットメッセージを記載したい場合などに重宝します。

コミットメッセージ保存直後に実行されるフック 〜commit-msgフック〜

  • commit-msgフックはユーザーがコミットメッセージを入力して保存した直後に動作させたい処理を記載します。
  • 例えばコミットメッセージがチームで決めたルールに沿っているかの確認などが行なえます。
  • チェックに弾かれ0以外の値が返されたとき、コミットプロセスが中断します。

コミット完了時に実行されるフック 〜post-commitフック〜

  • post-commitフックはコミットプロセスが完了した場合に動作させたい処理を記載します。
  • コミットプロセスが完了しているのでなにかをチェックするというよりは通知に使うことが主なようです。

その他

リベースする直前に実行されるフック 〜pre-rebaseフック〜

  • pre-rebaseフックはリベースを実施する直前に動作させたい処理を記載します。
  • このフックが0以外を返したときリベースを中断します。

コミットを書き換えた直後に実行されるフック 〜post-rewriteフック〜

  • post-rewriteフックはgit commit –amendやgit rebaseを実行した後に動作させたい処理を記載します。

チェックアウト直後に実行されるフック 〜post-checkoutフック〜

  • post-checkoutフックはgit checkoutが正常に終了した後に動作させたい処理を記載します。
  • checkoutしたコードをもとにドキュメントを生成する場合などに重宝します 。

マージ直後に実行されるフック 〜post-mergeフック〜

  • post-mergeフックはマージが正常に終了した後に動作させたい処理を記載します。
  • リモートブランチの名前と場所を引数に取ります。(git commit -vで確認できる内容)
  • 主に通知処理に使われます。
  • このフックが0以外を返したとき通知は行われません。

プッシュ実行直後に実行されるフック 〜pre-pushフック〜

  • pre-pushフックはgit pushを実行した直後の変更内容がリモートに転送される前に動作させたい処理を記載します。
  • リモートに変更が加わる前に更新内容をチェックすることに使用できます。

Git フックを体験してみよう

それでは一通り使いそうなフックが分かったところでGitフックを体験してみようと思います。!

体験にはpre-commitフックを用います。

準備

下記の内容を実施し準備を行います。

  1. フック体験用のディレクトリを用意します。
  2. フック体験用のディレクトリに移動します。
  3. git init コマンドを実行してローカルリポジトリを作成します。
  4. $ cp .git/hooks/pre-commit.sample .git/hooks/pre-commit コマンドを実行してpre-commitフックのサンプルファイルをコピーします。
  5. .git/hooks/pre-commitファイルをエディタで開きます。
  6. 内容をすべて削除し下記の内容を記載します。
#!/bin/sh
echo 'pre-commit hookです。'

体験

実際にコミットを行ってpre-commitフックの振る舞いを確認してみましょう。

  1. フック体験用のディレクトリで$ touch test.txt コマンドを実行してファイルを作成します。
  2. $ git add . コマンドを実行してtest.txtをステージに上げます。
  3. $ git commit コマンドを実行してコミットを作成します。(このとき、コミットエディターが開く直前に「pre-commit hookです。」の文字がターミナル上に出力されます。)
  4. 任意のコミットメッセージを入力してコミットプロセスを完了させターミナルに戻ると下記の様に「pre-commit hookです。」の文字が$ git commit コマンドの直後に出力されているはずです。

TAGS使用タグ一覧