Windows 環境下為 Git Repository 加上 Git Hook

同事因為專案相依的關係,在不同 branch 間可能會誤用不同屬性或是方式,所以想在 repository 切換 branch 時加入提示,提醒工程師記得切換相依專案的 branch,這樣的需求挺適合透過 Git Hook 來處理:在 Git Repository 出現指定行為時執行指定的 script;網路上的範例多為 linux 指令,筆記一下 Windows 環境的使用方式

About Git Hook

在 repository 建立時,.git 資料夾中會自動建立名為 hooks 的子資料夾,預設會提供幾個常見 hook 情境的設定範例,這幾個範例是用來在 linux bash 執行用的,windows 環境中大多無法直接使用

啟用 hook 時,需要加上 hook 類型為檔名且無附檔名的檔案,內容可以是任何 script 類型的語法(e.g. python、ruby、vb script…)

  • 自動建立 hooks 資料夾

    1hookfolder

  • hook 範例

    2hooksample

  • 支援的 hook 類型

    詳細資料可以參考 Git Hooks

    • applypatch-msg
    • pre-applypatch
    • post-applypatch
    • pre-commit
    • prepare-commit-msg
    • commit-msg
    • post-commit
    • pre-rebase
    • post-checkout
    • post-merge
    • pre-receive
    • update
    • post-receive
    • post-update
    • pre-auto-gc
    • post-rewrite
    • pre-push

如何設定 Git Hook

接著一步步來看該如何滿足需求:checkout branch 時提示

  1. repository 加上 post-checkout hook

    • 複製一個 *. sample –> 改名為 post-checkout 並移除附檔名

      3addhook

    • 因為檔案格式的關係,請記得 不要自行新增檔案,否則將無法正確執行

      • 正確執行版本

        8correctformat

      • 無法執行版本

        7wrongformat

  2. 加上 hook 內容

    • 在檔案第一行加入 #!/bin/bash 標記使用 script 語法
    • 加入實際執行動作

      • 使用 mshta

        #!/bin/bash
        mshta "javaScript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"
        
      • 使用 msg

        • 將實際執行動作寫成 .bat

          msg * "Enter Your Message"

        • hook 內容就 call 該 .bat 檔

          #!/bin/bash
          "C:\alert.bat"
          
  3. 加上執行權限(非必要)

    如果前面步驟完成後,仍無法成功執行,可以嘗試以下設定作法

    • 錯誤訊息

      • 訊息內容

        cannot spawn .git/hooks/post-checkout: No such file or directory
        
      • 錯誤截圖

        5errormsg

    • 在 repository 所在位置開啟 git bash

      6gitbash

    • 執行 chmod +x .git/hooks/post-checkout 加上執行權限

實際效果

  1. 使用 mshta

    • 可自訂 title 與大小
    • 不是永遠在視窗最上層

      9mshta

  2. 使用 msg

    • 永遠在視窗最上層
    • 實際執行語法要另外存放

      10msg

參考資訊

  1. 8.3 Customizing Git - Git Hooks
  2. githooks - Hooks used by Git
  3. Git Hooks