ホームに戻る
出典 :
Git - Git フック Git フックの基本的な使い方 - Qiita
目次 :

Gitフックとは

リポジトリに対する特定の操作が行われた際に、付随して実行したい処理を登録できる機構のこと。
例えば、コミットの際に特定のアプリケーションやスクリプトを実行するといったことができる。
このとき、使用者が登録する処理はイベントハンドラに相当し、処理の実行契機となるイベントにハンドラを関連づける(フッキング)ことになる。

大別

フックはクライアントサイドフックとサーバサイドフックに分けられる。
クライアントサイドフック ローカルリポジトリに関連付けられ、クライアントで実行される
サーバサイドフック リモートリポジトリに関連付けられ、プッシュ時にサーバで実行される

基本

画像
コミット、およびプッシュ時のイベント発生順は上図の通り。
クライアントサイドフックを赤字、サーバサイドフックは緑字で示している。
(一部割愛)
フック 実行タイミング パラメータ 解説
クライアントサイドフック
pre-commit コミット操作直後 なし
  • コミットの前にファイルを検査することが可能
  • 非ゼロ返却でコミット中断
  • git commit --no-verify
    でスキップ可能
prepare-commit-msg コミットメッセージエディタ
起動直前
  • コミットメッセージ(デフォルト)の保存パス
  • コミットタイプ
デフォルトのコミットメッセージを
動的に上書きすることが可能
commit-msg コミットメッセージ入力直後 コミットメッセージの保存パス
  • コミットメッセージを検査することが可能
  • 非ゼロ返却でコミット中断
post-commit コミット処理完了直後 なし
pre-push プッシュ要求直後
  • リモートの名前
  • リモートの場所
  • 更新対象の参照のリスト(標準入力)
非ゼロ返却でプッシュ中断
サーバサイドフック
pre-receive プッシュ処理直前 プッシュされた参照(ブランチ)のリスト(標準入力) 非ゼロ返却でプッシュ中断
update 各ブランチの
プッシュ処理直前
  • 参照(ブランチ)名
  • プッシュ直前の参照のハッシュ
  • プッシュされる参照のハッシュ
非ゼロ返却で当該参照のプッシュ中断
それ以外の参照はプッシュ継続
pre-receive 全ブランチの
プッシュ処理完了直後
プッシュされた参照(ブランチ)のリスト(標準入力) フック処理が終了するまで接続が継続される

フック処理の実装

画像
フック処理を有効にするには、Gitディレクトリ下の hooks ディレクトリに、フック名に対応したファイルを配置すればよい
(例 : pre-push を有効にする場合は pre-push ファイルを配置する。拡張子を付与してはならない。)

通常、git init を行うと hooks ディレクトリ下にフック処理のひな形が [フック名].sample として生成される。
この sample ファイルの実態はシェルスクリプトであり、ファイル名の拡張子を削除して、処理を適宜修正すればそのままフックスクリプトとなる。
(UNIX / Linux 環境では実行権限の付与が別途必要。)

フックスクリプトは命名さえ正しければ、シェルスクリプトに限らずあらゆる実行可能ファイルを使用できる。
(EXE、BAT、PS1、SH、Ruby、Perl、Pythonなど)

また、フックが受け取るパラメータの内訳は、サンプルスクリプトから確認が可能である。

注意が必要な点

リポジトリのプッシュ後に別のユーザが同じリポジトリをクローンしても、クライアントサイドフックはコピーされない。
このため、共通のポリシーを強制する場合はサーバサイドフックを用いるとよい。