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 はリポジトリにコミットされません。共有するには:

  1. hook をコミット対象のディレクトリ(例:.githooks/)に保存する。
  2. 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 を自動実行することで、すべてのコミットがプロジェクトのコードスタイル基準を満たすようにする場面で使用します。

Try It — Git Command Builder

フルツールを開く