【実践式】Gitフックを使ってミスを減らす方法

ソフトウェア開発を行う際、バージョン管理ツールとしてGitを使用することが多いかと思います。
しかし、チームで開発していくうえで、コミットすべきファイルをコミットし忘れてしまったり、コミットすべきでないファイルをコミットしてしまったり、また、ファイルの命名規則を破ったファイルをコミットしてしまったり、細かいミスが起こってしまうことがあります。
Gitフックを使えばそういった細かいミスを防ぐことができます。

Gitフックとは

GitにはGitフックという特定の操作時にスクリプトを実行できる機能があります。Gitフックにはクライアントサイドフック、サーバーサイドフックがあります。今回の例では、クライアントサイドフックの一部を扱います。

Gitフックの使い方

Gitを使用する際、隠しフォルダとして「.gitフォルダ」というものが作成されます。
その中にふくまれるhooksフォルダ内に特定の名前でファイルを作成することでGitフックを使用することができます。

Gitフックはある程度好きな言語を選ぶことが可能です。公式ドキュメントでも、シェルスクリプト、Perl、Ruby、Pythonといった言語が挙げられています。

ここでは例として記載するコードは、なるべく環境に依存しない、かつ、サンプルでも使用されているシェルスクリプトとします。

Gitフックを使ってみる

今回、開発の際に基本的に変更しないファイルがあると設定します。
そのファイルがコミットされそうになった際に警告を出すフックスクリプトを作成してみます。

#!/bin/sh

# "Immutable.txt"という、今後変更すべきでないファイルを
# コミットしようとした場合、コミットを中断する

# ステージング中のファイルのパス一覧を取得する
pathes=$(git diff --cached --name-only)

for path in ${pathes[@]}; do
    # パスからファイル名のみを取得
    filename=$(basename ${path})
    # ファイル名がImmutable.txtだったらコミットを中断する
    if [ "$filename" = "Immutable.txt" ]; then
        echo "Immutable.txtをコミットしようとしたため、コミットを中断します。"
        exit 1
    fi
done

上のようなシェルスクリプトをpre-commitというファイル名で.git/hooksフォルダ内に保存することで、コミット時にImmutable.txtが含まれていた際にコミットを中断するようになります。
実際にターミナルでコミットしてみると実行して見ると、以下のようになります。

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged ..." to unstage)
	new file:   Immutable.txt
$ git commit -m "message"
Immutable.txtをコミットしようとしたため、コミットを中断します。

ここで、pre-commitを無視してコミットしたい場合は—no-verifyオプションを利用します。

$ git commit --no-verify -m "message" 
[master db28b34] message
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 Immutable.txt

人為的ミスをツールで解決しよう

今回はGitの操作ミスを無くすためにGitフックという仕組みをご紹介しました。
単純作業を楽にするための自動化だけでなく、ミスを減らす、なくすために自動化、ツール化し円滑なプロジェクト運営を目指しましょう。

[文]ペンネーム:酢醤油  [編集]サムライト編集部