「自分だけ Git Hooks が動いていなかった」をゼロにする
チーム開発において、「コードを push する前にローカルでテストを回す」という運用は、CI の待ち時間を減らし、開発サイクルを高速化するために非常に重要です。
しかし、Git Hooks が格納される .git/hooks/ ディレクトリは Git の管理対象に含まれません。そのため、プロジェクトをクローンした後に各自が手動で設定を再現する必要があり、それが以下のような問題を引き起こします。
- 設定の失念: 新規参画時や環境再構築の際、手動コマンドの実行を忘れてしまう
- 更新の追従漏れ: フックの内容(スクリプト)を修正しても、全員に手動での再設定を徹底させるのが難しい
- 強制力の欠如: 設定の有無が各自の裁量に委ねられ、プロジェクト全体でテスト品質を担保できない
せっかく CI を導入していても、ローカルでのチェックが漏れてしまっては、フィードバックの速度が落ちてしまいます。
そこで、「npm install という誰もが必ず行う操作」に Git Hooks のセットアップを組み込むことで、意識せずとも全員の環境を同じ状態に保つ――そんな「仕組みによる解決」を目指します。
具体的には、Husky などの追加ライブラリを使わず、Git の標準機能と npm scripts だけで完結させる方法を解説します。
GitHub Actions とローカルGit Hooks の共存
ローカルでテストを実行したからといって、CIでのテストが不要になるわけではありません。それぞれ役割が異なるため、併用するのがおすすめです。
| 観点 | GitHub Actions | ローカルGit Hooks |
|---|---|---|
| 実行タイミング | push後 | push前 |
| フィードバック速度 | CIの起動・実行を待つ必要がある | 手元で即座に結果が分かる |
| 環境の一貫性 | 統一された環境で実行される | ローカル環境の個別事情に左右される |
| 強制力 | 高い(回避不可) | 中程度(--no-verifyで回避可能) |
| リソースコスト | CI実行時間を消費 | 個人のPCリソースのみ |
ローカルで素早くフィードバックを得つつ、CIで環境差異のない確実なチェックを行う。この組み合わせが開発効率と品質の両面で効果的です。
方法:core.hooksPath + npm prepare の組み合わせ
以下の3ステップで実現できます。
1. プロジェクトにhooksディレクトリを作成
mkdir -p .githooks
2. フックスクリプトを作成
例:push前にテストを実行する pre-push フック
# .githooks/pre-push
#!/bin/bash
echo "🧪 Running tests before push..."
# プロジェクトのテストを実行
npm test
if [ $? -ne 0 ]; then
echo "❌ Tests failed. Push aborted."
exit 1
fi
echo "✅ All tests passed. Proceeding with push."
作成後、実行権限を付与します:
chmod +x .githooks/pre-push
3. package.json に prepare スクリプトを追加
{
"scripts": {
"prepare": "git config core.hooksPath .githooks"
}
}
これだけです!
なぜこれで自動化できるのか
prepare スクリプトの特徴:
npm installの後に自動実行されるnpm ciでも実行される- Git cloneした後、最初に
npm installを実行するのは自然な流れ
core.hooksPath の特徴:
.git/hooks/の代わりに任意のディレクトリをhooks置き場に指定できる- プロジェクトルートの
.githooks/を指定すれば、フックのロジック自体を Git 管理下に置けるため、スクリプトの更新もリポジトリ経由で全員に同期されます。
この2つを組み合わせることで、リポジトリをcloneして npm install するだけで、特別な操作なしにGit Hooksが有効になります。
新メンバーのオンボーディングが簡単に
従来の方法では:
- リポジトリをclone
npm install- 「あ、READMEにGit Hooksの設定手順が書いてあるな…」
- 手動で
git config core.hooksPath .githooksを実行 - (忘れる人続出)
この方法なら:
- リポジトリをclone
npm install← これだけで完了!
新メンバーへの説明も「npm installしてね」の一言で済みます。
複数プロジェクト(モノレポ)での対応
ルートに複数のサブプロジェクトがある場合:
project-root/
├── .githooks/
│ └── pre-push
├── frontend/
│ └── package.json
├── backend/
│ └── package.json
└── package.json ← ルートに用意
ルートの package.json で設定すれば、どのサブプロジェクトから npm install しても機能します。
実際のpre-pushフック例
#!/bin/bash
echo "🧪 Running pre-push checks..."
# フロントエンドのテスト
if [ -d "frontend" ]; then
echo "📦 Testing frontend..."
cd frontend && npm test
if [ $? -ne 0 ]; then
echo "❌ Frontend tests failed."
exit 1
fi
cd ..
fi
# バックエンドのテスト
if [ -d "backend" ]; then
echo "📦 Testing backend..."
cd backend && npm test
if [ $? -ne 0 ]; then
echo "❌ Backend tests failed."
exit 1
fi
cd ..
fi
echo "✅ All checks passed!"
まとめ
- GitHub Actionsだけに頼らず、ローカルでも素早くテストを回す
.githooks/ディレクトリを作成してフックスクリプトを配置package.jsonのprepareでgit config core.hooksPath .githooksを設定- これでチーム全員が
npm installするだけで自動的にGit Hooksが有効に!
push前に手元でテストを実行する習慣が、自然とチーム全体に広がります。 設定忘れによる「テストを通さずにpushしてしまった」という事故も防げますし、CIの待ち時間に悩まされることも減るでしょう。