Hooks
-
リポジトリローカル
- cloneで伝播しない
-
大別
-
pre
- アクション満了前に実行
-
承認/否認、変更反映等に利用
- exitコードが非ゼロだとアクション中断
-
post
-
通知、ビルド実行、バグのクローズ等に利用
- exitコード無視
-
-
-
hookは最後の手段
- シェルスクリプトやエイリアス等で代用できない?
-
濫用
- Gitデフォルトの振る舞いを変えてしまうと、Git慣れしている人が触るとき戸惑う
-
hookにより本来速い操作が遅くなりうる
-
例: pre-commit hookで単体テスト実行
- コミットに時間がかかり、コミットが億劫になってしまう
-
-
hookで実行されるスクリプトがバグっていると仕事の妨げになる
- .git/hooksをいじって無効化するほかない
- cf. シェルスクリプトやエイリアスは単に使わなければいい
-
hookが他の開発者に伝播する保証がない
- セキュリティ上の理由で、blob,tree,commit以外のオブジェクトはcloneされない
Column Junio’s Overview of Hooks
-
hookを正当化する理由
-
コマンドの取り消し
- update, pre-commit
-
コマンド実行開始後に生成されるデータの加工
- commit-msg でコミットログメッセージを改変する
-
gitプロトコルでしかアクセスできないリモート先の操作を実行する
- post-update
- ミューテックスの獲得
-
コマンド実行結果依存に操作
- post-checkout
-
Installing Hooks
.git/hooks/
以下にスクリプト配置- スクリプトファイル名の規約にしたがうことで実行される
Example Hooks
- 作成したリポジトリにはデフォルトでサンプルが配置されている
ls .git/hooks/
applypatch-msg.sample post-update.sample pre-push.sample prepare-commit-msg.sample
commit-msg.sample pre-applypatch.sample pre-rebase.sample update.sample
fsmonitor-watchman.sample pre-commit.sample pre-receive.sample
- デフォルトは所定の場所のテンプレートからコピーされる
ls /usr/share/git-core/templates/hooks
applypatch-msg.sample post-update.sample pre-push.sample prepare-commit-msg.sample
commit-msg.sample pre-applypatch.sample pre-rebase.sample update.sample
fsmonitor-watchman.sample pre-commit.sample pre-receive.sample
Creating Your First Hook
--no-verify
オプションでpre-commit, commit-msgフックをバイパスできたりする
Available Hooks
-
いろいろある
- Commit-Related Hooks
- Patch-Related Hooks
- Push-Related Hooks
- Other Local Repository Hooks
英語
-
at first blush
- 一見したところ
-
entice
- そそのかす
-
smuggle
- こっそり持ち込む、密輸する
-
innocuous
- maliciousの対義語
-
countermand
- 取り消す、撤回する