hooks是一些在$GIT_DIR/hooks目錄的腳本,在被特定的事件(certain points)觸發后被調用。當git init命令被調用后,一些常用的示例鈎子文件被拷貝到新倉庫的hooks目錄中;但是默認這些鈎子時不生效的。把.sample后綴去掉之后生效。
1. applypatch-msg
GIT_DIR/hooks/applypatch-msg
當'git-am'命令執行時,這個鈎子就被調用。 它只有一個參數:就是存有提交消息(commit log message)的文件的名字。如果鈎子的執行結果是非零,那么補丁(patch)就被應用(apply).
這個用於在其他地方編輯提交消息,並且可以把這些消息規范成項目的標准格式。它也可以在分析完消息后拒絕此次提交。默認會執行調用commit-msg 鈎子。
2. pre-applypatch
GIT_DIR/hooks/pre-applypatch
當'git-am'命令執行時,這個鈎子就被調用。它沒有參數,並且是在一個補丁(patch)被應用后還未提交前被調用。如果鈎子的執行結果時非零,那么剛才應用的補丁就不會被提交。
它用於檢查當前的工作樹,當提交的補丁不能通過特定的測試時就拒絕將它提交進倉庫。
3. post-applypatch
GIT_DIR/hooks/post-applypatch
當'git-am'命令執行時,這個鈎子就被調用。它沒有參數,並且是在一個補丁被應用且在完成提交之后被調用的。
這個鈎子的主要用途時通知提示,它並不會影響'git-am'的執行結果。
4. pre-commit
GIT_DIR/hooks/pre-commit
這個鈎子被'git-commit'命令調用,而且可以通過在命令中添加\ --no-verify參數來跳過。這個鈎子沒有參數,在得到提交消息和開始提交前被調用。如果鈎子執行結果是非零,那么'git-commit'命令就會中止執行。
此鈎子可以用來在提交前檢查代碼錯誤(運行類似lint的程序)
當默認的'pre-commit'鈎子開啟時,如果它發現文件尾部有空白行,那么就會中止此次提交。
新版本的默認鈎子有不同。
5. prepare-commit
當'git-commit'命令執行時: 在編輯器(editor)啟動前,默認提交信息准備好后,這個鈎子就被調用。
它有三個參數:第一個參數是提交消息文件的名字;第二個參數提交消息的來源,它可以是:()
如果鈎子的執行結果是非零,那么'git-commit'命令就會被中止。
6. commit-msg
GIT__DIR/hooks/commit-msg
當'git-commit'命令執行時,這個鈎子被調用;也可以在命令中添加\ --no-verify參數來跳過。這個鈎子有一個參數:就是被選定的提交消息文件的名字。如這個鈎子的執行結果時非零,那么’git-commit'命令就會中止執行。
這個鈎子使提交消息更適當,可以用於規范提交消息使之符合項目的規范;如果它檢查提交消息后,發現內容不符合規范,可以拒絕此次提交。
默認的'commit-msg'鈎子啟用后,它檢查里面是否有重復的簽名結束線(Signed-off by lines).如果找到它就是中止此次提交操作。
7. post-commit
GIT_DIR/hooks/post-commit
當'git-commit'命令執行時,這個鈎子就被調用。它沒有參數,並且時在提交完成后被調用。
這個鈎子的主要用途是通知提示,它並不會影響'git-commit'的執行和輸出。
8.pre-rebase
GIT_DIR/hooks/pre-rebase
當'git-rebase'命令執行時,這個鈎子就被調用;主要目的時阻止不應該被rebase的分支被rebase(例如,一個已經發布的分支提交就不應該被rebase)
9. post-checkout
GIT_DIR/hooks/post-checkout
當'git-checkout'命令更新完整個工作樹(worktree)后,這個鈎子就被調用。這個鈎子有三個參數:前一個HEAD的ref,新HEAD的ref,判斷一個簽出時分支簽出還是文件簽出的標識符(分支簽出=1,文件簽出=0).這個鈎子不會影響'git-checkout'命令的結果。
這個鈎子可以用於檢查倉庫的一致性,自動顯示簽出前后的代碼的區別,也可以用於設置目錄的元數據屬性。
10.post-merge
GIT_DIR/hooks/post-merge
當'git-merge'命令執行或在本地'git-pull'執行后調用,有一個參數狀態標識符。
11.pre-receive
GIT_DIR/hooks/pre-receive
當在本地倉庫執行'git-push'命令時,服務器上遠端倉庫就會對應執行'git-receive-pack'命令,而'git-receive-pack'命令會調用pre-recevie鈎子。在開始更新遠程倉庫上的ref之前,這個鈎子被調用。鈎子的執行結果(exit status)決定此次更新能否成功。
每執行一個接收操作都會調用一次這個鈎子。它沒有命令行參數,但是它會從標准輸入讀取需要更新的ref,格式如下:
SP SP LF
注: SP是空格,LF是回車。
<old-value>是保存在ref里的老對象的名字,<new-value>是保存在ref里的新對象的名字,<ref-name>就是此次要更新的ref的全名。如果是創建一個新的ref,那么<old-value>就是由40個0組成的字符串表示。
如果鈎子的執行結果是非零,那么沒有引用(ref)會被更新。如果執行結果為零,更新操作還可以被后面的<<update,'update'>>鈎子所阻止。
鈎子(hook)的標准輸出和輸入都會通過'git-send-pack'轉發給客戶端(other end),你可以把這個信息回顯給客戶端。
12. update
GIT_DIR/hooks/update
當用戶在本地倉庫執行'git-push'命令時,服務器上遠端倉庫就會對應執行'git-receive-pack',而'git-receive-pack'會調用update鈎子。在更新遠程倉庫行的ref之前,這個鈎子被調用。鈎子的執行結果決定此次updae能否成功。
每更新一個引用(ref),鈎子就會被調用一次,並且使用三個參數,要被更新的ref的名字,ref中那些前的對象名,ref中更新后的對象名。
如果update hook的執行結果時零,那么引用(ref)就會被更新。如果執行結果是否非零,那么'git-receive-pack'就不會更新這個引用。
這個鈎子也可以用於防止強制更新某些refs,確保old object時new object的父對象。這樣也就是強制執行'fast forward only' 策略。
它也可以用於跟蹤(log)更新詳情。但是由於它不知道每次更新的ref全體集合,盡管可以傻傻的每個ref更新就發送email;但是<<post-receive,'post-receive'>>鈎子更合適。
在郵件列表上講來另一種用法:用這個update hook實現細粒度權限控制。
鈎子的標准輸出和標准錯誤輸出都會通過'git-send-pack'轉發給客戶端,可以把這個信息回顯給客戶端。
13. post-receive
GIT_DIR/hooks/post-receive
當用戶在本地倉庫執行'git-push'命令時,服務器上遠端倉庫就會對應執行'git-receive-pack'命令;在所有遠程倉庫的引用都更新后,這個鈎子就會被'git-receive-pack'調用。
服務器端倉庫每次執行接收操作時,這個鈎子都會被調用。此鈎子執行不帶任何命令行參數,但是和<<pre-recevie,'pre-receive'>>鈎子一樣從標准輸入讀取信息,並且讀取的信息內容也是一樣的。
這個鈎子不會影響'git-receive-pack'命令的輸出,因為它時在命令執行完后被調用的。
這個鈎子可以取代<<post-update,'post-update'>>鈎子因為后者只能得到需要更新的ref的名字,而沒有更新前后的對象的名字。
鈎子的標准輸出和標准錯誤輸出都會通過'git-send-pack'轉發給客戶端,你可以把這個信息回顯給客戶端
默認的'post-receive'鈎子是無效的,但是在git distribution contrib/hooks目錄里有一個名為post-recevie-email的示例腳本,實現來發送commit emails的功能。
14. post-update
GIT_DIR/hooks/post-update
當用戶在本地倉庫執行'git-push'命令時,服務器上遠端倉庫就會對應執行'git-recevie-pack'。在所有遠程倉庫的引用都更新后,post-update就會被調用。
它的參數數目時可變的,每個參數代表實際被更新的ref
這個鈎子的主要用途是通知提示,它並不影響'git-receive-pack'的輸出。
'post-update'可以告訴我們哪些heads被更新來,但是它不知道head更新前后的值,所以這里不太適合記錄更新詳情。而<<post-receive,'post-receive'>>鈎子可以得到ref(也可以說是head)更新前后的值,如果你要記錄更詳細的信息的話,可以使用這個鈎子。
如果默認的'post-update'鈎子啟用的話,它們執行'git-update-server-info'命令去更新一些dumb協議(如http)所需的信息。如果你的git倉庫是通過http協議來訪問,那么你就應該開啟它。
鈎子的標准輸出和標准錯誤輸出都會通過'git-send-pack'轉發給客戶端,你可以把這個信息回顯給客戶端
此鈎子沒有參數但可以從stdin讀取參數
此鈎子沒有參數但可以從stdin讀取參數
shell腳本方式是
read oldrev newrev refnameecho "Old revision: $oldrev"echo "New revision: $newrev"echo "Reference name: $refname"
python 腳本方式
import sysfor fp in sys.stdin:print fp
15. pre-auto-gc
GIT_DIR/hooks/pre-auto-gc
當調用'git-gc --auto'命令時,這個鈎子就會被調用。它沒有調用參數,如果鈎子的執行結果是非零的話,那么'git gc --auto'命令就
利用以上鈎子自定義功能
一、主服務器和鏡像服務器間的同步
描述: 兩台git服務器A和B,保證推送到A上的變更會同時推送到B上,反之亦然。gitolite暫用了部分鈎子,選擇post-update這個實現。
問題:
1. 需要配置ssh遠程別名否則鈎子推送會出錯
2. git push origin refs 這個對新增tag或分支及更新有效,對刪除tag或分支無效
錯誤信息: remote: error: src refspec refs/tags/dev2 does not match any.
因為刪除和新增及修改的命令格式不同,需要另作處理
16. post-recevie-email
這個鈎子是用於在倉庫更新后通知用的,被post-recevie鈎子調用。它依賴的三個參數在*.git/config: hooks.envelopesender,hooks.emailprefix and hooks.maillinglist
這個鈎子通常在/usr/share/doc/git-core/contrib/hooks目錄下,或通過查看post-recevie.sample文件最后一行獲得