Skip to content
Latchkey

pre-commit フックとは?

pre-commit フックとは、コミットが記録される直前に実行されるスクリプトで、変更をチェックまたは修正し、何か問題があればコミットをブロックできます。

pre-commit フックは最も人気のある Git フックです。なぜなら、コミットがまだ存在しない、可能な限り早い瞬間に問題を捕まえるからです。ステージされた変更に対して、lint、フォーマット、シークレットスキャンといったチェックを実行し、それらが失敗した場合はコミットを止められるため、不良なコードを履歴の外に保ちます。

実行されるタイミング

pre-commit フックは git commit を実行した後、コミットが確定する前に発火します。ステージされた変更を検査し、成功または失敗で終了します。ゼロ以外の終了はコミットを中止させるため、開発者は問題を修正して再試行します。この間、何も履歴に入りません。

一般的な pre-commit チェック

  • ステージされたファイルに対する lint とコードフォーマット。
  • 誤ってステージされたシークレットや鍵のスキャン。
  • 変更されたコードに対する高速な単体テストの実行。
  • 大きなファイルや禁止パターンのブロック。

pre-commit フックの管理

生のフックはバージョン管理の外にあるため、チームはフレームワークを使ってそれらを定義し共有し、全員が同じチェックを得られるようにします。

A shared pre-commit config
# .pre-commit-config.yaml
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.6.0
    hooks:
      - id: trailing-whitespace

pre-commit フックと CI/CD

同じ lint とフォーマットのチェックを pre-commit フックとしてローカルで実行することで、ほとんどの問題はコードがプッシュされる前に捕まえられ、CI が些細な問題で失敗することがはるかに少なくなります。これはフィードバックループを短縮し、CI の時間を節約します。フックはスキップできるため、CI は依然として信頼できるゲートとしてチェックを再実行します。

pre-commit のベストプラクティス

  • コミットが遅くならないよう、フックを高速に保ちます。
  • 主要な CI チェックをローカルでミラーし、問題を早期に捕まえます。
  • フレームワークを使ってチーム全体でフックを共有します。
  • 強制されるゲートとして CI に頼り、早期のゲートとしてフックに頼ります。

重要なポイント

  • pre-commit フックはコミットが記録される前にチェックを実行します。
  • lint、フォーマット、シークレットの問題を最も早い時点で捕まえます。
  • CI のフィードバックループを短縮しますが、CI のゲートを置き換えるものではありません。

関連ガイド