Git Hooks: Git イベントでタスクを自動化する
git hooks を使って commit、push などの Git イベント時にリント・テスト・フォーマットを自動実行する方法を解説。ローカルとサーバーサイドの両方に対応します。
chmod +x .git/hooks/pre-commit詳細な説明
Git Hooks とは?
Git hooks は特定の Git イベント(commit、push、merge など)が発生した際に自動的に実行されるスクリプトです。.git/hooks/ ディレクトリに配置され、任意のスクリプト言語(bash、Python、Node.js など)で記述できます。
よく使うクライアントサイド Hook
| Hook | トリガー | 主な用途 |
|---|---|---|
pre-commit |
コミット作成前 | リント、フォーマット、型チェック |
commit-msg |
メッセージ入力後 | コミットメッセージ形式の検証 |
pre-push |
リモートへの push 前 | テストの実行 |
post-merge |
merge 完了後 | 依存関係のインストール |
post-checkout |
ブランチ切り替え後 | 通知、リビルド |
Pre-Commit Hook の作成
# .git/hooks/pre-commit
#!/bin/sh
npm run lint
if [ $? -ne 0 ]; then
echo "Linting failed. Commit aborted."
exit 1
fi
chmod +x .git/hooks/pre-commit
チームで Hook を共有する
.git/hooks/ 内の hook はリポジトリにコミットされません。共有するには:
- hook をコミット対象のディレクトリ(例:
.githooks/)に保存する。 - Git がそのディレクトリを使うよう設定する:
git config core.hooksPath .githooks
人気の Hook フレームワーク
- Husky(Node.js)— JavaScript プロジェクトで最も人気。
- pre-commit(Python)— 言語非依存で豊富なプラグインエコシステム。
- lefthook(Go)— 高速な並列 hook 実行。
サーバーサイド Hook
hook はサーバー側(GitLab、セルフホスト Git など)でも実行できます:
| Hook | トリガー |
|---|---|
pre-receive |
push を受け入れる前 |
post-receive |
push を受け入れた後 |
update |
ブランチごと、ref 更新前 |
ヒント
hook は高速に保ちましょう。遅い pre-commit hook は開発者のストレスになり、回避されます。重い処理(フルテストスイートなど)は pre-push で実行しましょう。Git hooks はコード品質の最初の防衛線です。
ユースケース
チームが Husky を使って pre-commit hook を設定し、ステージ済みファイルに ESLint と Prettier を自動実行することで、すべてのコミットがプロジェクトのコードスタイル基準を満たすようにする場面で使用します。