ソフトウェア開発を行う際、バージョン管理ツールとして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フックという仕組みをご紹介しました。
単純作業を楽にするための自動化だけでなく、ミスを減らす、なくすために自動化、ツール化し円滑なプロジェクト運営を目指しましょう。