Skip to content
Latchkey

Git フックとは?

Git フックとは、コミットの前やプッシュの後など、ワークフローの特定の時点で Git が自動的に実行するスクリプトです。

Git フックを使うと、Git のイベントにカスタムの動作を紐付けられます。コミット、プッシュ、マージを行うと、Git はあなたが用意したスクリプトを実行でき、ちょうど適切なタイミングでルールを強制したり、チェックを走らせたり、タスクを自動化したりできます。これらは CI チェックのローカル版のいとこのような存在です。

フックとは何か

フックとは、特定のイベントが発生したときに Git が実行する実行可能なスクリプトです。フックの時点は数多くあり、コミットの前後、プッシュの前、マージの後などがあります。それぞれが定められた瞬間に発火し、ワークフローのそのステップを横取りしたり、それに反応したりできます。

ローカルフックとサーバーフック

クライアント側のフックは開発者のマシン上で実行され、たとえばコミット前に lint を行います。サーバー側のフックは変更がプッシュされたときにリモートで実行され、たとえばポリシーに違反するプッシュを拒否します。この二つは、編集から共有された履歴に至る経路の異なる時点をカバーします。

シンプルなフック

フックはリポジトリの hooks ディレクトリに置かれ、実行可能である必要があるだけです。

A pre-commit hook that lints
#!/bin/sh
# .git/hooks/pre-commit
npm run lint || exit 1

フックと CI/CD

フックはコードが CI に到達する前に高速なローカルフィードバックを与え、単純な問題をキーボードの前で捕まえます。しかしローカルフックはバージョン管理の外にあってスキップできるため、実行される保証がなく、CI を置き換えるのではなく補完するものです。強制されるゲートは CI のままであり、フックは早期警告です。

フックを効果的に使う

  • lint やフォーマットのような高速なローカルチェックにフックを使います。
  • ローカルフックは回避できることを忘れず、それだけに頼らないようにします。
  • 共有フックはツールで管理し、チーム全体に行き渡るようにします。
  • CI を信頼できる強制されたゲートとして維持します。

重要なポイント

  • Git フックは Git のワークフローの定められた時点でスクリプトを実行します。
  • クライアント側とサーバー側のフックは異なるイベントをカバーします。
  • フックは高速なローカルフィードバックを与えますが、強制されるゲートは CI のままです。

関連ガイド