?
This document uses PHP Chinese website manual Release
githooks - Git 使用的掛鉤
$GIT_DIR/hooks/* (or git config core.hooksPath
/*)
Hook 是你可以放在鉤子目錄中的程序,以觸發(fā) git 執(zhí)行中某些點(diǎn)的動(dòng)作。沒(méi)有可執(zhí)行位設(shè)置的 Hook 將被忽略。
默認(rèn)情況下,Hook 目錄是$GIT_DIR/hooks
,但可以通過(guò)core.hooksPath
配置變量來(lái)更改(參見(jiàn) git-config [1])。
在 Git 調(diào)用 hook 之前,它將其工作目錄更改為裸倉(cāng)庫(kù)中的 $ GIT_DIR 或非裸倉(cāng)庫(kù)中工作樹(shù)的根。一個(gè)例外是推(內(nèi)觸發(fā)掛鉤pre-receive
,update
,post-receive
,post-update
,push-to-checkout
它們總是在 $ GIT_DIR 執(zhí)行)。
Hook 可以通過(guò)環(huán)境,命令行參數(shù)和 stdin 獲得它們的參數(shù)。有關(guān)詳細(xì)信息,請(qǐng)參閱下面每個(gè)掛鉤的文檔。
git init
可能會(huì)將鉤子復(fù)制到新的存儲(chǔ)庫(kù),具體取決于其配置。有關(guān)詳細(xì)信息,請(qǐng)參閱 git-init [1] 中的 “TEMPLATE DIRECTORY” 部分。當(dāng)本文檔的其余部分提到“default hooks”時(shí),它將討論 Git 附帶的默認(rèn)模板。
下面介紹當(dāng)前支持的 hook 。
這個(gè) hook 被調(diào)用git am
。它采用一個(gè)參數(shù),即包含提議的提交日志消息的文件的名稱(chēng)。以非零狀態(tài)退出導(dǎo)致git am
在應(yīng)用修補(bǔ)程序之前中止。
允許 hook 編輯消息文件,并可用于將消息標(biāo)準(zhǔn)化為某種項(xiàng)目標(biāo)準(zhǔn)格式。在檢查消息文件之后,它也可以用來(lái)拒絕提交。
默認(rèn)applypatch-msg
掛鉤在啟用時(shí)運(yùn)行commit-msg
hook(如果后者已啟用)。
這個(gè) hook 被調(diào)用git am
。它不接受任何參數(shù),并在應(yīng)用修補(bǔ)程序后調(diào)用,但在提交之前調(diào)用。
如果它以非零狀態(tài)退出,則在應(yīng)用修補(bǔ)程序后,工作樹(shù)不會(huì)被提交。
它可以用來(lái)檢查當(dāng)前的工作樹(shù),如果它沒(méi)有通過(guò)某些測(cè)試,就拒絕提交。
默認(rèn)pre-applypatch
hook 在啟用時(shí)運(yùn)行pre-commit
hook(如果后者已啟用)。
這個(gè) hook 被調(diào)用git am
。它不接受任何參數(shù),并在應(yīng)用修補(bǔ)程序并進(jìn)行提交后調(diào)用。
這個(gè) hook 主要是為了通知,并不能影響結(jié)果git am
。
該 hook 由git commit
該--no-verify
選項(xiàng)調(diào)用,并且可以繞過(guò)該選項(xiàng)。它不接受任何參數(shù),并在獲取建議的提交日志消息并進(jìn)行提交之前調(diào)用它。從該腳本中退出非零狀態(tài)會(huì)導(dǎo)致該git commit
命令在創(chuàng)建提交之前中止。
默認(rèn)pre-commit
hook 啟用后,會(huì)捕獲帶有尾隨空白的行的介紹,并在找到這樣的行時(shí)中止提交。
如果該命令不會(huì)git commit
調(diào)用GIT_EDITOR=:
編輯器來(lái)修改提交消息,則所有鉤子都將使用環(huán)境變量進(jìn)行調(diào)用。
git commit
在編寫(xiě)默認(rèn)日志消息之后,在編輯器啟動(dòng)之前,該 hook 被調(diào)用。
它需要一到三個(gè)參數(shù)。第一個(gè)是包含提交日志消息的文件的名稱(chēng)。第二個(gè)是提交消息的來(lái)源,可以是:(message
如果給出了a -m
或-F
選項(xiàng)); template
(如果-t
給出選項(xiàng)或commit.template
設(shè)置了配置選項(xiàng)); merge
(如果提交是合并或.git/MERGE_MSG
文件存在); squash
(如果.git/SQUASH_MSG
存在文件); 或者commit
,后跟提交 SHA-1(如果是-c
,-C
或--amend
給予選項(xiàng))。
如果退出狀態(tài)不為零,git commit
則會(huì)中止。
Hook 的目的是編輯郵件文件,并且不會(huì)被該--no-verify
選項(xiàng)抑制。非零的退出意味著掛鉤失敗并放棄提交。它不應(yīng)該被用作預(yù)提交 hook 的替換。
prepare-commit-msg
Git 附帶的示例鉤子會(huì)注釋Conflicts:
合并的提交消息的一部分。
該 hook 由git commit
選項(xiàng)調(diào)用,并且可以繞過(guò)--no-verify
選項(xiàng)。它采用一個(gè)參數(shù),即包含提議的提交日志消息的文件的名稱(chēng)。以非零狀態(tài)退出會(huì)導(dǎo)致git commit
中止。
允許 hook 編輯消息文件,并可用于將消息標(biāo)準(zhǔn)化為某種項(xiàng)目標(biāo)準(zhǔn)格式。在檢查消息文件之后,它也可以用來(lái)拒絕提交。
默認(rèn)commit-msg
hook 啟用時(shí)檢測(cè)到重復(fù)的 “Signed-off-by” 行,如果找到,則終止提交。
這個(gè) hook 被git commit
調(diào)用。它不接受任何參數(shù),并在提交完成后調(diào)用。
這個(gè) hook 主要是為了通知,并不能影響git commit的
結(jié)果。
此 hook 被調(diào)用git rebase
并且可以用來(lái)防止分支得到重建。掛鉤可以用一個(gè)或兩個(gè)參數(shù)調(diào)用。第一個(gè)參數(shù)是系列分叉的上游。第二個(gè)參數(shù)是重新分支的分支,并在重新綁定當(dāng)前分支時(shí)未設(shè)置。
當(dāng)git checkout
更新工作樹(shù)后運(yùn)行a時(shí)會(huì)調(diào)用此鉤子。這個(gè)鉤子有三個(gè)參數(shù):前一個(gè) HEAD 的 ref ,新 HEAD 的 ref(可能或者可能沒(méi)有改變)以及一個(gè)標(biāo)志,指示結(jié)帳是否是分支結(jié)賬(改變分支,標(biāo)志= 1)或者一個(gè)文件簽出(從索引中檢索一個(gè)文件,flag = 0)。這個(gè)鉤子不能影響結(jié)果git checkout
。
它也在之后運(yùn)行git clone
,除非使用 --no-checkout(-n)選項(xiàng)。給 hook 的第一個(gè)參數(shù)是 null-ref ,是新 HEAD 的 ref 的第二個(gè)參數(shù),并且該標(biāo)志始終為1。
該 hook 可用于執(zhí)行存儲(chǔ)庫(kù)有效性檢查,自動(dòng)顯示與以前 HEAD 不同的區(qū)別,或設(shè)置工作目錄元數(shù)據(jù)屬性。
這個(gè) hook 被調(diào)用git merge
,當(dāng)git pull
在本地倉(cāng)庫(kù)上完成時(shí)發(fā)生。掛鉤采用一個(gè)參數(shù),一個(gè)狀態(tài)標(biāo)志指定是否合并完成是一個(gè)壁球合并。git merge
如果合并因沖突而失敗,則此掛接不會(huì)影響結(jié)果并且不會(huì)執(zhí)行。
該 hook 可以與相應(yīng)的預(yù)提交鉤子結(jié)合使用,以保存和恢復(fù)任何形式的與工作樹(shù)關(guān)聯(lián)的元數(shù)據(jù)(例如:權(quán)限/所有權(quán),ACLS 等)。有關(guān)如何執(zhí)行此操作的示例,請(qǐng)參閱 contrib / hooks / setgitperms.perl 。
這個(gè) hook 被調(diào)用git push
,可以用來(lái)防止發(fā)生推送。該鉤子被調(diào)用時(shí)提供了兩個(gè)參數(shù),它們提供目標(biāo)遠(yuǎn)程的名稱(chēng)和位置,如果沒(méi)有使用一個(gè)命名的遠(yuǎn)程,那么這兩個(gè)值都是相同的。
有關(guān)要推送什么的信息通過(guò)以下格式的線條在 hook 的標(biāo)準(zhǔn)輸入上提供:
<local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF
例如,如果git push origin master:foreign
運(yùn)行該命令, hook 將收到如下所示的行:
refs/heads/master 67890 refs/heads/foreign 12345
盡管將提供完整的40個(gè)字符的 SHA-1 。如果國(guó)外裁判不存在,<remote SHA-1>
將是40 0
。如果一個(gè)裁判將被刪除,<local ref>
將提供作為(delete)
和<local SHA-1>
將是40 0
。如果本地提交是由可擴(kuò)展的名稱(chēng)以外的其他名稱(chēng)指定的(例如HEAD~
,或 SHA-1 ),則它將按原來(lái)的形式提供。
如果此 hook 以非零狀態(tài)退出,git push
將不中斷任何操作而中止。有關(guān)推送被拒絕的原因可通過(guò)寫(xiě)入標(biāo)準(zhǔn)錯(cuò)誤發(fā)送給用戶。
這個(gè) hook 是git-receive-pack
在遠(yuǎn)程倉(cāng)庫(kù)上調(diào)用的,當(dāng)git push
在本地倉(cāng)庫(kù)上完成時(shí)會(huì)發(fā)生這種情況。在開(kāi)始更新遠(yuǎn)程倉(cāng)庫(kù)中的 refs 之前,調(diào)用預(yù)接收 hook 。其退出狀態(tài)決定了更新的成敗。
該 hook 為接收操作執(zhí)行一次。它不需要任何參數(shù),但是對(duì)于每個(gè)要更新的引用,它都會(huì)在標(biāo)準(zhǔn)輸入中接收格式的一行:
<old-value> SP <new-value> SP <ref-name> LF
在<old-value>
ref 中存儲(chǔ)的舊對(duì)象名稱(chēng)是在 ref 中存儲(chǔ)<new-value>
的新對(duì)象名稱(chēng),并且<ref-name>
是 ref 的全名。當(dāng)創(chuàng)建一個(gè)新的參考,<old-value>
是40 0
。
如果 hook 以非零狀態(tài)退出,則沒(méi)有任何參數(shù)會(huì)被更新。如果鉤子具有零退出,從個(gè)人參更新仍可以通過(guò)防止更新鉤。
標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都被轉(zhuǎn)發(fā)到git send-pack
另一端,因此您可以簡(jiǎn)單地echo
向用戶發(fā)送消息。
命令行定推送選項(xiàng)的數(shù)量git push --push-option=...
可以從環(huán)境變量中讀取GIT_PUSH_OPTION_COUNT
本身中找到的選項(xiàng),并且GIT_PUSH_OPTION_0
,GIT_PUSH_OPTION_1
......如果協(xié)商不使用推送選項(xiàng)階段,環(huán)境變量將不會(huì)被設(shè)置。如果客戶選擇使用推送選項(xiàng),但不傳送任何數(shù)據(jù),則計(jì)數(shù)變量將被設(shè)置為零GIT_PUSH_OPTION_COUNT=0
。
有關(guān)注意事項(xiàng),請(qǐng)參閱 git-receive-pack [1] 中的“隔離環(huán)境”部分。
這個(gè) hook 是git-receive-pack
在遠(yuǎn)程倉(cāng)庫(kù)上調(diào)用的,當(dāng)git push
在本地倉(cāng)庫(kù)上完成時(shí)會(huì)發(fā)生這種情況。在更新遠(yuǎn)程存儲(chǔ)庫(kù)中的 ref 之前,會(huì)調(diào)用更新掛鉤。它的退出狀態(tài)決定了 ref 更新的成敗。
該 hook 為每個(gè)要更新的引用執(zhí)行一次,并且需要三個(gè)參數(shù):
正在更新的參考名稱(chēng),
舊的對(duì)象名稱(chēng)存儲(chǔ)在 ref 中,
并將新的對(duì)象名稱(chēng)存儲(chǔ)在 ref 中。
從更新掛鉤零退出允許 ref 被更新。以非零狀態(tài)退出可防止git-receive-pack
更新該引用。
forced
通過(guò)確保對(duì)象名稱(chēng)是一個(gè)提交對(duì)象,該對(duì)象是舊對(duì)象名稱(chēng)所指定的提交對(duì)象的后代,該 hook 可用于防止更新某些引用。也就是說(shuō),強(qiáng)制執(zhí)行“僅快進(jìn)”策略。
它也可以用來(lái)記錄舊的......新?tīng)顟B(tài)。但是,它并不知道整套分支,所以最終會(huì)在天真地使用時(shí)為每個(gè)參考文獻(xiàn)發(fā)送一封電子郵件。在后收到鉤更適合一點(diǎn)。
在一個(gè)限制用戶僅通過(guò)線路訪問(wèn) git 命令的環(huán)境中,該 hook 可用于實(shí)現(xiàn)訪問(wèn)控制,而不依賴(lài)文件系統(tǒng)所有權(quán)和組成員身份。有關(guān)如何使用登錄 shell 來(lái)限制用戶對(duì) git 命令的訪問(wèn),請(qǐng)參閱 git-shell [1]。
標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都被轉(zhuǎn)發(fā)到git send-pack
另一端,因此您可以簡(jiǎn)單地echo
向用戶發(fā)送消息。
默認(rèn)update
hook hooks.allowunannotated
啟用時(shí)(且配置選項(xiàng)未設(shè)置或設(shè)置為false)可防止未注釋的標(biāo)簽被推送。
這個(gè) hook 是git-receive-pack
在遠(yuǎn)程倉(cāng)庫(kù)上調(diào)用的,當(dāng)git push
在本地倉(cāng)庫(kù)上完成時(shí)會(huì)發(fā)生這種情況。它在更新所有 ref 后立即在遠(yuǎn)程存儲(chǔ)庫(kù)上執(zhí)行。
該 hook 為接收操作執(zhí)行一次。它不需要任何參數(shù),但會(huì)獲得與預(yù)接收鉤子在其標(biāo)準(zhǔn)輸入上相同的信息。
這個(gè) hook 并不影響結(jié)果git-receive-pack
,因?yàn)樗窃谡嬲墓ぷ魍瓿珊笳{(diào)用的。
這取代了更新后的 hook ,它除了獲得所有參考名稱(chēng)之外,還獲得了所有參考的新舊值。
標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都被轉(zhuǎn)發(fā)到git send-pack
另一端,因此您可以簡(jiǎn)單地echo
向用戶發(fā)送消息。
默認(rèn)post-receive
hook 為空,但在 Git 分配post-receive-email
的contrib/hooks
目錄中提供了一個(gè)示例腳本,該腳本實(shí)現(xiàn)了發(fā)送提交郵件。
命令行定推送選項(xiàng)的數(shù)量git push --push-option=...
可以從環(huán)境變量中讀取GIT_PUSH_OPTION_COUNT
本身中找到的選項(xiàng),并且GIT_PUSH_OPTION_0
,GIT_PUSH_OPTION_1
......如果協(xié)商不使用推送選項(xiàng)階段,環(huán)境變量將不會(huì)被設(shè)置。如果客戶選擇使用推送選項(xiàng),但不傳送任何數(shù)據(jù),則計(jì)數(shù)變量將被設(shè)置為零GIT_PUSH_OPTION_COUNT=0
。
這個(gè) hook 是git-receive-pack
在遠(yuǎn)程倉(cāng)庫(kù)上調(diào)用的,當(dāng)git push
在本地倉(cāng)庫(kù)上完成時(shí)會(huì)發(fā)生這種情況。它在更新所有 ref 后立即在遠(yuǎn)程存儲(chǔ)庫(kù)上執(zhí)行。
它需要可變數(shù)量的參數(shù),每個(gè)參數(shù)都是實(shí)際更新的 ref 的名稱(chēng)。
這個(gè) hook 主要是為了通知,并不能影響結(jié)果git-receive-pack
。
該post-update
能告訴什么是推送的頭,但它不知道他們?cè)瓉?lái)的和更新的值,所以它是做記錄 old..new 一個(gè)窮地方。在后收到 hook 并得到裁判的原件和更新的值。如果你需要它們,你可以考慮它。
啟用后,默認(rèn)post-update
將運(yùn)行git update-server-info
以保持傳輸(例如,HTTP)使用的信息最新。如果您正在發(fā)布可通過(guò)HTTP訪問(wèn)的Git存儲(chǔ)庫(kù),則應(yīng)該啟用此掛接。
標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都被轉(zhuǎn)發(fā)到git send-pack
另一端,因此您可以簡(jiǎn)單地echo
向用戶發(fā)送消息。
該鉤子由git-receive-pack
遠(yuǎn)程存儲(chǔ)庫(kù)調(diào)用git push
,當(dāng)在本地存儲(chǔ)庫(kù)上完成a操作時(shí),當(dāng)推送嘗試更新當(dāng)前檢出的分支并將receive.denyCurrentBranch
配置變量設(shè)置為updateInstead
。如果遠(yuǎn)程存儲(chǔ)庫(kù)的工作樹(shù)和索引與當(dāng)前檢出的提交有任何不同,則默認(rèn)情況下會(huì)拒絕這種推送; 當(dāng)工作樹(shù)和索引都與當(dāng)前提交匹配時(shí),它們會(huì)更新以匹配分支的新推入的提示。該鉤子將用于覆蓋默認(rèn)行為。
鉤子接收當(dāng)前分支的尖端將被更新的提交。它可以以非零狀態(tài)退出以拒絕推送(當(dāng)它這樣做時(shí),它不能修改索引或工作樹(shù))?;蛘?,它可以對(duì)工作樹(shù)和索引進(jìn)行任何必要的更改,以在當(dāng)前分支的提示更新為新提交時(shí)將其帶到期望的狀態(tài),并以零狀態(tài)退出。
例如,鉤子可以簡(jiǎn)單地運(yùn)行git read-tree -u -m HEAD "$1"
,以模擬git fetch
與反向運(yùn)行的鉤子git push
,因?yàn)殡p樹(shù)形式read-tree -u -m
基本上與git checkout
開(kāi)關(guān)分支相同,同時(shí)保持工作樹(shù)中不會(huì)干擾的局部變化分支之間的差異。
這個(gè)鉤子被調(diào)用git gc --auto
。它不接受任何參數(shù),并從此腳本中git gc --auto
以非零狀態(tài)退出導(dǎo)致中止。
這個(gè)鉤子被重寫(xiě)提交的命令調(diào)用(git commit --amend
,git-rebase
;目前git-filter-branch
確實(shí)not
叫它?。?。它的第一個(gè)參數(shù)表示它被調(diào)用的命令:當(dāng)前是amend
or的一個(gè)rebase
。更多的依賴(lài)于命令的參數(shù)可能會(huì)在未來(lái)傳遞。
該鉤子以格式接收stdin上重寫(xiě)的提交列表
<old-sha1> SP <new-sha1> [ SP <extra-info> ] LF
這又extra-info
是依賴(lài)于命令的。如果它是空的,則前面的SP也被省略。目前,沒(méi)有命令通過(guò)任何extra-info
。
鉤子總是在自動(dòng)音符復(fù)制之后運(yùn)行(請(qǐng)參閱git-config [1]中的“notes.rewrite。<command>”),因此可以訪問(wèn)這些音符。
以下特定于命令的注釋適用于:
rebase
對(duì)于squash
和fixup
操作,被壓扁,所有提交被列為被改寫(xiě)成壓扁的承諾。這意味著將會(huì)有幾條線路共享相同的信息new-sha1
。
提交將保證按照他們通過(guò)rebase處理的順序列出。
這個(gè)鉤子被調(diào)用git send-email
。它需要一個(gè)參數(shù),即保存要發(fā)送的電子郵件的文件的名稱(chēng)。以非零狀態(tài)退出導(dǎo)致git send-email
在發(fā)送任何電子郵件之前中止。