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-whitespacepre-commit フックと CI/CD
同じ lint とフォーマットのチェックを pre-commit フックとしてローカルで実行することで、ほとんどの問題はコードがプッシュされる前に捕まえられ、CI が些細な問題で失敗することがはるかに少なくなります。これはフィードバックループを短縮し、CI の時間を節約します。フックはスキップできるため、CI は依然として信頼できるゲートとしてチェックを再実行します。
pre-commit のベストプラクティス
- コミットが遅くならないよう、フックを高速に保ちます。
- 主要な CI チェックをローカルでミラーし、問題を早期に捕まえます。
- フレームワークを使ってチーム全体でフックを共有します。
- 強制されるゲートとして CI に頼り、早期のゲートとしてフックに頼ります。
重要なポイント
- pre-commit フックはコミットが記録される前にチェックを実行します。
- lint、フォーマット、シークレットの問題を最も早い時点で捕まえます。
- CI のフィードバックループを短縮しますが、CI のゲートを置き換えるものではありません。
関連ガイド
What Is a Git Hook?What is a Git hook? Learn how hooks run scripts at points in the Git workflow, the difference between local a…
What Is the Staging Area?What is the Git staging area? Learn how the index lets you choose exactly what goes into a commit, the add-co…
What Is a Required Status Check?What is a required status check? Learn how marking a CI check as required blocks merges until it passes, maki…