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