Version Control with Git ch15 Hooks

Git勉強メモ

出典: 


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を正当化する理由

    1. コマンドの取り消し

      • update, pre-commit
    2. コマンド実行開始後に生成されるデータの加工

      • commit-msg でコミットログメッセージを改変する
    3. gitプロトコルでしかアクセスできないリモート先の操作を実行する

      • post-update
    4. ミューテックスの獲得
    5. コマンド実行結果依存に操作

      • 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

    • 取り消す、撤回する