# githooks
> 原文: [https://git-scm.com/docs/githooks](https://git-scm.com/docs/githooks)
## 名稱
githooks - Git使用的鉤子
## 概要
$ GIT_DIR / hooks / *(或`git config core.hooksPath` / *)
## 描述
鉤子是可以放在鉤子目錄中的程序,用于在git的執行中的某些點觸發動作。沒有設置可執行位的掛鉤將被忽略。
默認情況下,hooks目錄為`$GIT_DIR/hooks`,但可以通過`core.hooksPath`配置變量進行更改(參見 [git-config [1]](https://git-scm.com/docs/git-config) )。
在Git調用鉤子之前,它將其工作目錄更改為裸存儲庫中的$ GIT_DIR或非裸存儲庫中工作樹的根。推送期間觸發的掛鉤例外(_預接收_,_更新_,_接收后_,_更新后_, _push-to-checkout_ )總是在$ GIT_DIR中執行。
鉤子可以通過環境,命令行參數和stdin獲取它們的參數。有關詳細信息,請參閱下面每個掛鉤的文檔。
`git init`可能會將掛鉤復制到新存儲庫,具體取決于其配置。有關詳細信息,請參見 [git-init [1]](https://git-scm.com/docs/git-init) 中的“TEMPLATE DIRECTORY”部分。當本文檔的其余部分引用“默認掛鉤”時,它正在討論Git附帶的默認模板。
目前支持的鉤子如下所述。
## 掛鉤
### applypatch-MSG
這個鉤子由 [git-am [1]](https://git-scm.com/docs/git-am) 調用。它需要一個參數,即包含建議的提交日志消息的文件的名稱。退出非零狀態會導致`git am`在應用修補程序之前中止。
允許鉤子編輯消息文件,并可用于將消息規范化為某種項目標準格式。它還可以用于在檢查消息文件后拒絕提交。
默認 _applypatch-msg_ 掛鉤,如果啟用,則運行 _commit-msg_ 掛鉤,如果后者啟用的話。
### 預applypatch
這個鉤子由 [git-am [1]](https://git-scm.com/docs/git-am) 調用。它不需要參數,并且在應用補丁之后但在提交之前調用。
如果它以非零狀態退出,則在應用補丁后將不會提交工作樹。
它可用于檢查當前工作樹,如果未通過某些測試則拒絕提交。
默認的 _pre-applypatch_ 掛鉤啟用時會運行_預提交_掛鉤,如果后者啟用的話。
### 后applypatch
這個鉤子由 [git-am [1]](https://git-scm.com/docs/git-am) 調用。它不需要參數,并在應用補丁并進行提交后調用。
此掛鉤主要用于通知,不會影響`git am`的結果。
### 預提交
這個鉤子由 [git-commit [1]](https://git-scm.com/docs/git-commit) 調用,可以用`--no-verify`選項旁路。它不需要任何參數,并在獲取建議的提交日志消息和進行提交之前調用。退出此腳本的非零狀態會導致`git commit`命令在創建提交之前中止。
默認的_預提交_掛鉤,在啟用時,會捕獲帶有尾隨空格的行的引入,并在找到這樣的行時中止提交。
如果命令不會調出編輯器來修改提交消息,則使用環境變量`GIT_EDITOR=:`調用所有`git commit`掛鉤。
### 準備提交-MSG
在準備默認日志消息之后,在編輯器啟動之前, [git-commit [1]](https://git-scm.com/docs/git-commit) 會調用此掛鉤。
它需要一到三個參數。第一個是包含提交日志消息的文件的名稱。第二個是提交消息的來源,可以是:`message`(如果給出了`-m`或`-F`選項); `template`(如果給出了`-t`選項或設置了配置選項`commit.template`); `merge`(如果提交是合并或`.git/MERGE_MSG`文件存在); `squash`(如果存在`.git/SQUASH_MSG`文件);或`commit`,然后是提交SHA-1(如果給出了`-c`,`-C`或`--amend`選項)。
如果退出狀態為非零,則`git commit`將中止。
掛鉤的目的是在適當的位置編輯消息文件,并且不會被`--no-verify`選項抑制。非零退出意味著掛鉤失敗并中止提交。它不應該用作預提交鉤子的替代品。
Git附帶的示例`prepare-commit-msg`掛鉤刪除了在提交模板的注釋部分中找到的幫助消息。
### 提交-MSG
這個鉤子由 [git-commit [1]](https://git-scm.com/docs/git-commit) 和 [git-merge [1]](https://git-scm.com/docs/git-merge) 調用,可以用`--no-verify`選項繞過。它需要一個參數,即包含建議的提交日志消息的文件的名稱。以非零狀態退出會導致命令中止。
允許鉤子編輯消息文件,并可用于將消息規范化為某種項目標準格式。它還可以用于在檢查消息文件后拒絕提交。
默認的 _commit-msg_ 掛鉤啟用時會檢測到重復的“Signed-off-by”行,如果找到,則中止提交。
### 提交后
這個鉤子由 [git-commit [1]](https://git-scm.com/docs/git-commit) 調用。它不需要參數,并在提交后調用。
此掛鉤主要用于通知,不會影響`git commit`的結果。
### 前底墊
這個鉤子由 [git-rebase [1]](https://git-scm.com/docs/git-rebase) 調用,可以用來防止分支被重新綁定。可以用一個或兩個參數調用鉤子。第一個參數是分支系列的上游。第二個參數是重新分支的分支,在重新定位當前分支時不會設置。
### 后檢出
更新工作樹后運行 [git-checkout [1]](https://git-scm.com/docs/git-checkout) 時會調用此掛鉤。鉤子被賦予三個參數:前一個HEAD的ref,新HEAD的ref(可能已經或可能沒有改變),以及一個標志,指示檢出是否是分支檢出(更改分支,標志= 1)或文件簽出(從索引中檢索文件,標志= 0)。這個鉤子不會影響`git checkout`的結果。
它也在 [git-clone [1]](https://git-scm.com/docs/git-clone) 之后運行,除非使用`--no-checkout`(`-n`)選項。給鉤子的第一個參數是null-ref,第二個是新HEAD的ref,而標志總是1.同樣對于`git worktree add`,除非使用`--no-checkout`。
此掛鉤可用于執行存儲庫有效性檢查,如果不同則自動顯示與先前HEAD的差異,或設置工作目錄元數據屬性。
### 后合并
這個鉤子由 [git-merge [1]](https://git-scm.com/docs/git-merge) 調用,當在本地存儲庫上完成`git pull`時會發生這種情況。鉤子接受一個參數,一個狀態標志,指定合并是否是一個壓縮合并。如果由于沖突導致合并失敗,則此掛鉤不會影響`git merge`的結果,也不會執行。
該鉤子可以與相應的預提交鉤子一起使用,以保存和恢復與工作樹相關聯的任何形式的元數據(例如:權限/所有權,ACLS等)。有關如何執行此操作的示例,請參閱contrib / hooks / setgitperms.perl。
### 前推
這個鉤子由 [git-push [1]](https://git-scm.com/docs/git-push) 調用,可用于防止發生推動。使用兩個參數調用鉤子,這兩個參數提供目標遠程的名稱和位置,如果未使用命名遠程,則兩個值將相同。
有關要推送內容的信息在鉤子的標準輸入上提供了以下形式的行:
```
<local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF
```
例如,如果運行命令`git push origin master:foreign`,則掛鉤將收到如下所示的行:
```
refs/heads/master 67890 refs/heads/foreign 12345
```
雖然將提供完整的40個字符的SHA-1。如果外來參考不存在,`<remote SHA-1>`將為40 `0`。如果要刪除ref,`<local ref>`將作為`(delete)`提供,`<local SHA-1>`將為40 `0`。如果本地提交是由可以擴展的名稱以外的其他東西指定的(例如`HEAD~`或SHA-1),它將按照最初給出的方式提供。
如果此掛鉤以非零狀態退出,則`git push`將在不推送任何內容的情況下中止。可以通過寫入標準錯誤將關于推送拒絕原因的信息發送給用戶。
### 預接收
當 [git-receive-pack [1]](https://git-scm.com/docs/git-receive-pack) 對`git push`作出反應并更新其存儲庫中的引用時,將調用此掛鉤。在開始更新遠程存儲庫上的refs之前,將調用預接收掛鉤。其退出狀態決定了更新的成功或失敗。
該鉤子為接收操作執行一次。它不需要參數,但是對于每個ref都要更新它在標準輸入上接收格式的一行:
```
<old-value> SP <new-value> SP <ref-name> LF
```
其中`<old-value>`是存儲在ref中的舊對象名稱,`<new-value>`是要存儲在ref中的新對象名稱,`<ref-name>`是ref的全名。創建新參考時,`<old-value>`為40 `0`。
如果鉤子以非零狀態退出,則不會更新任何引用。如果鉤子退出零,則 [_更新_](#update) 鉤子仍然可以防止更新單個引用。
標準輸出和標準錯誤輸出都轉發到另一端的`git send-pack`,因此您只需為用戶輸入`echo`消息即可。
在`git push --push-option=...`的命令行上給出的推送選項的數量可以從環境變量`GIT_PUSH_OPTION_COUNT`中讀取,選項本身可以在`GIT_PUSH_OPTION_0`,`GIT_PUSH_OPTION_1`中找到,......如果協商不使用推送選項階段,不會設置環境變量。如果客戶端選擇使用推送選項但不傳輸任何選項,則計數變量將設置為零,`GIT_PUSH_OPTION_COUNT=0`。
有關注意事項,請參閱 [git-receive-pack [1]](https://git-scm.com/docs/git-receive-pack) 中的“隔離環境”部分。
### 更新
當 [git-receive-pack [1]](https://git-scm.com/docs/git-receive-pack) 對`git push`作出反應并更新其存儲庫中的引用時,將調用此掛鉤。在更新遠程存儲庫上的ref之前,將調用更新掛鉤。其退出狀態決定了ref更新的成功或失敗。
鉤子為每個ref更新執行一次,并帶有三個參數:
* 要更新的ref的名稱,
* 存儲在ref中的舊對象名稱,
* 以及要存儲在ref中的新對象名稱。
從更新掛鉤零退出允許更新ref。以非零狀態退出會阻止`git receive-pack`更新該ref。
此掛鉤可用于通過確保對象名稱是提交對象來防止_強制_更新某些引用,該提交對象是舊對象名稱所指定的提交對象的后代。也就是說,執行“僅限快進”政策。
它還可以用于記錄old..new狀態。但是,它并不知道整個分支集合,所以當天真地使用時,它最終會為每個ref發送一封電子郵件。 [_接收后_](#post-receive) 鉤子更適合這種情況。
在限制用戶僅通過線路訪問git命令的環境中,此掛鉤可用于實現訪問控制,而不依賴于文件系統所有權和組成員身份。請參閱 [git-shell [1]](https://git-scm.com/docs/git-shell) ,了解如何使用登錄shell限制用戶只能訪問git命令。
標準輸出和標準錯誤輸出都轉發到另一端的`git send-pack`,因此您只需為用戶輸入`echo`消息即可。
默認_更新_掛鉤,啟用時 - `hooks.allowunannotated`配置選項未設置或設置為false-可防止未注釋的標簽被推送。
### 后收到
當 [git-receive-pack [1]](https://git-scm.com/docs/git-receive-pack) 對`git push`作出反應并更新其存儲庫中的引用時,將調用此掛鉤。在更新所有引用后,它將在遠程存儲庫上執行一次。
該鉤子為接收操作執行一次。它不需要參數,但獲得的信息與 [_預接收_](#pre-receive) 鉤子在其標準輸入上的信息相同。
這個鉤子不會影響`git receive-pack`的結果,因為它是在完成實際工作后調用的。
這取代了 [_更新后_](#post-update) 鉤子,除了它們的名稱之外,它還獲得了所有引用的舊值和新值。
標準輸出和標準錯誤輸出都轉發到另一端的`git send-pack`,因此您只需為用戶輸入`echo`消息即可。
默認的 _post-receive_ 掛鉤是空的,但是在Git發行版的`contrib/hooks`目錄中提供了一個示例腳本`post-receive-email`,它實現了發送提交電子郵件。
在`git push --push-option=...`的命令行上給出的推送選項的數量可以從環境變量`GIT_PUSH_OPTION_COUNT`中讀取,選項本身可以在`GIT_PUSH_OPTION_0`,`GIT_PUSH_OPTION_1`中找到,......如果協商不使用推送選項階段,不會設置環境變量。如果客戶端選擇使用推送選項但不傳輸任何選項,則計數變量將設置為零,`GIT_PUSH_OPTION_COUNT=0`。
### 更新后的
當 [git-receive-pack [1]](https://git-scm.com/docs/git-receive-pack) 對`git push`作出反應并更新其存儲庫中的引用時,將調用此掛鉤。在更新所有引用后,它將在遠程存儲庫上執行一次。
它需要可變數量的參數,每個參數都是實際更新的ref的名稱。
此掛鉤主要用于通知,不會影響`git receive-pack`的結果。
_更新后_掛鉤可以判斷推送的磁頭是什么,但是它不知道它們的原始值和更新值是什么,因此它是一個糟糕的做舊日志的地方。 [_接收后_](#post-receive) 鉤子確實獲得了refs的原始值和更新值。如果你需要它們,你可以考慮它。
啟用后,默認_更新后_掛鉤運行`git update-server-info`,以使啞傳輸(例如HTTP)使用的信息保持最新。如果要發布可通過HTTP訪問的Git存儲庫,則應該啟用此掛鉤。
標準輸出和標準錯誤輸出都轉發到另一端的`git send-pack`,因此您只需為用戶輸入`echo`消息即可。
### 一鍵檢出
當 [git-receive-pack [1]](https://git-scm.com/docs/git-receive-pack) 對`git push`做出反應并更新其存儲庫中的引用時,以及當push嘗試更新當前已檢出的分支時,將調用此掛鉤并且`receive.denyCurrentBranch`配置變量設置為`updateInstead`。如果工作樹和遠程存儲庫的索引與當前檢出的提交有任何差異,則默認拒絕這樣的推送;當工作樹和索引都與當前提交匹配時,它們會更新以匹配新推送的分支提示。此掛鉤用于覆蓋默認行為。
鉤子接收提交,當前分支的尖端將被更新。它可以以非零狀態退出以拒絕推送(當它這樣做時,它不能修改索引或工作樹)。或者它可以對工作樹和索引進行任何必要的更改,以便在當前分支的提示更新為新提交時將它們置于所需狀態,并以零狀態退出。
例如,鉤子可以簡單地運行`git read-tree -u -m HEAD "$1"`以模擬`git push`與`git push`反向運行的`git fetch`,因為`git read-tree -u -m`的雙樹形式與切換的`git checkout`基本相同分支,同時保持工作樹中的本地更改不會干擾分支之間的差異。
### 預自動GC
該鉤子由`git gc --auto`調用(參見 [git-gc [1]](https://git-scm.com/docs/git-gc) )。它不帶參數,從此腳本退出非零狀態會導致`git gc --auto`中止。
### 后重寫
這個鉤子由重寫提交的命令調用( [git-commit [1]](https://git-scm.com/docs/git-commit) 用`--amend`和 [git-rebase [1]](https://git-scm.com/docs/git-rebase) 調用;當前`git filter-branch`執行_不是_打電話給它!)。它的第一個參數表示它被調用的命令:當前`amend`或`rebase`之一。將來可能會傳遞更多與命令相關的參數。
鉤子以格式接收stdin上重寫提交的列表
```
<old-sha1> SP <new-sha1> [ SP <extra-info> ] LF
```
_extra-info_ 再次依賴于命令。如果為空,則也省略前面的SP。目前,沒有命令傳遞任何 _extra-info_ 。
自動注釋復制后,鉤子總是運行(參見 [git-config [1]](https://git-scm.com/docs/git-config) 中的“notes.rewrite。< command>”),因此可以訪問這些注釋。
以下特定于命令的注釋適用:
```
rebase
```
對于_壁球_和 _fixup_ 操作,所有被壓縮的提交都被列為被重寫為壓縮的提交。這意味著將有幾行共享相同的 _new-sha1_ 。
保證提交按照rebase處理它們的順序列出。
### sendemail-驗證
這個鉤子由 [git-send-email [1]](https://git-scm.com/docs/git-send-email) 調用。它需要一個參數,即保存要發送的電子郵件的文件的名稱。退出非零狀態會導致`git send-email`在發送任何電子郵件之前中止。
### fsmonitor守衛員
當配置選項`core.fsmonitor`設置為`.git/hooks/fsmonitor-watchman`時,將調用此掛鉤。它需要兩個參數,一個版本(當前為1)和自1970年1月1日午夜以來經過的納秒時間。
鉤子應輸出到stdout工作目錄中可能自請求的時間以來可能已更改的所有文件的列表。邏輯應該具有包容性,以便它不會錯過任何潛在的變化。路徑應該相對于工作目錄的根目錄,并由單個NUL分隔。
可以包含實際沒有更改的文件。應包括所有更改,包括新創建和刪除的文件。重命名文件時,應包括舊名稱和新名稱。
Git將限制檢查更改的文件以及根據給定的路徑名??檢查未跟蹤文件的目錄。
告訴git“所有文件都已更改”的優化方法是返回文件名`/`。
退出狀態確定git是否將使用鉤子中的數據來限制其搜索。出錯時,它將回退到驗證所有文件和文件夾。
### P4-預提交
該鉤子由`git-p4 submit`調用。它不需要參數,也不需要標準輸入。從此腳本退出非零狀態會阻止`git-p4 submit`啟動。運行`git-p4 submit --help`了解詳細信息。
## GIT
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree