こんにちは。現場の最前線でコードの品質と向き合っているエンジニアの皆さん。
Gitを使っていると、`.git/hooks` というディレクトリの存在に気づくはずです。コミット直前にテストを走らせたり、コミットメッセージにチケット番号を強制したり……自動化の宝庫なのですが、一つ大きな問題があります。「`.git` 配下のファイルはリポジトリ管理されない」という事実です。
チーム全員に同じフックを適用するために、いちいち `cp` コマンドでコピーを配布したり、READMEに設定手順を書いたりしていませんか? それ、もう終わりにしましょう。
今日は、`core.hooksPath` を使いこなし、Gitフックを「プロジェクト単位の散逸したゴミ」から「全開発環境で一元管理される強力な品質インフラ」へと昇華させる極意を伝授します。
—
なぜ `.git/hooks` を直接触ってはいけないのか?
Gitのデフォルト設定では、フックは各リポジトリの `.git/hooks` に格納されます。しかし、このディレクトリはGitの追跡対象外です。
- 問題点1: チームメンバーがフックの存在を忘れる。
- 問題点2: フックを修正しても、全員のローカル環境に反映させる手段がない。
- 問題点3: CI環境や別のプロジェクトで同じロジックを再利用できない。
これらを解決するのが、Git 2.9から導入された `core.hooksPath` です。
—
1. 極意:フックを一箇所で集中管理する
まずは、Gitのフック置き場を「プロジェクト内の特定ディレクトリ」に変更します。リポジトリのルートに `.githooks` というディレクトリを作り、そこに全てのフックを配置しましょう。
ステップ①:共通フックディレクトリの作成
プロジェクトルートに作成
mkdir .githooks
ステップ②:Gitに場所を教え込む
以下のコマンドで、Gitがフックを探しに行く場所を先ほど作成したディレクトリに変更します。
–local をつけることで、このリポジトリ内だけで有効になります
git config core.hooksPath .githooks
これだけで、`.git/hooks` は無視され、`.githooks` 内のスクリプトが優先的に実行されるようになります。
—
2. HelloWorld:コミット時に挨拶させてみる
では、実際に動作確認です。`.githooks` 配下に `pre-commit` という名前でファイルを作成してください。
ファイル: `.githooks/pre-commit`
!/bin/bash
コミットしようとすると必ず挨拶するフック
echo “————————————————”
echo “🚀 素晴らしいコードですね!品質チェックを開始します…”
echo “————————————————”
ここで何らかのチェック処理(lintやテスト)を走らせる
終了コードが 0 以外だとコミットは中断されます
exit 0
実行権限の付与(重要!)
スクリプトが実行できるように権限を与えます。これを忘れると動きません。
chmod +x .githooks/pre-commit
これで `git commit` を打つたびに、あなたの魂のこもったメッセージが表示されるはずです。
—
3. チーム全員に強制適用させる「究極のハック」
`git config` はローカル設定なので、リポジトリをクローンした直後のメンバーには適用されません。これを自動化するには、「プロジェクトの初期化スクリプト」を配布するのが定石です。
`bin/setup` のようなシェルスクリプトを用意し、チームメンバーに最初に実行してもらうようにしましょう。
ファイル: `bin/setup`
!/bin/bash
開発環境のセットアップスクリプト
フックパスを .githooks に設定
git config core.hooksPath .githooks
echo “✅ Git hooks set up successfully!”
—
4. セキュリティ上の注意点
Gitフックは「コード」です。もし悪意のある他人がリポジトリにフックを仕込んだらどうなるか? 想像してみてください。`post-checkout` や `pre-commit` でシステムを破壊するコマンドを叩くことが可能です。
- 信頼できないソースからのリポジトリは注意: 信頼できないリポジトリのフックは、実行前に必ず中身を確認してください。
- CI環境での実行: CI環境(GitHub Actionsなど)では、リポジトリの設定をそのまま引き継ぐのではなく、CI専用の環境構築手順の中でフックを適用するか、あるいはCI側で別途Lintチェックを回すのが鉄則です。
—
最後に:自動化は「愛」です
フックを集中管理できるようになると、チームの文化が変わります。
「コミット前にテストを忘れた」というミスは、個人の記憶力に頼るのではなく、仕組みで解決する。それがDevOpsの第一歩です。
`.githooks` をGit管理下に置くことで、フックの修正履歴もすべてGitで追跡できるようになります。これは、CI/CDのパイプラインを「コードとして管理する(Pipeline as Code)」の最小単位と言えるでしょう。
さあ、あなたの `.githooks` に、チームの守り神となるスクリプトを一つ追加してみてください。毎日の作業が、驚くほど軽やかになるはずですよ。