自定義 Git - Git 鉤子



Git 鉤子

Git 鉤子是在執行特定 Git 操作時自動執行的指令碼。它允許您自動化任務並執行策略,從而增強工作流程。

Git 鉤子有兩種型別:**客戶端**和**伺服器端**。

  • 客戶端鉤子在提交或合併事務時啟用。

  • 網路活動(例如接收推送的提交)會導致伺服器端鉤子啟用。

  • 我們可以使用這些高度自定義的鉤子來自動執行程式碼 lint 和測試執行等流程。

  • 這些鉤子使我們能夠在整個開發過程中保持統一的實踐並最佳化工作流程。

  • 伺服器端鉤子在克隆儲存庫或建立新分支時啟用。

安裝鉤子

要安裝**Git 鉤子**,請將指令碼移動到 Git 儲存庫的**.git/hooks**資料夾中。

當我們使用**git init**初始化儲存庫時,Git 會在此目錄中生成示例鉤子指令碼。

  • 雖然示例指令碼通常是用 Perl 或 shell 指令碼編寫的,但它們也可以用其他語言編寫,例如 Python 或 Ruby。

  • 重新命名指令碼(刪除**.sample**副檔名)以將其用作示例。

  • 要啟用鉤子,請在**.git/hooks**目錄中放置一個具有正確名稱且沒有副檔名的可執行指令碼。

  • 配置指令碼後,它將在相關 Git 操作期間自動執行。

客戶端鉤子

客戶端鉤子分為三種類型:**提交工作流鉤子**、**電子郵件工作流指令碼**和其他**雜項指令碼**。

提交工作流鉤子

我們可以使用這些鉤子來自動執行檢查並更改提交行為,這些鉤子是在**git commit**過程中執行的指令碼。

pre-commit 鉤子

  • 它在鍵入提交訊息之前執行。

  • 用於執行測試、審查程式碼風格並確保即將提交的更改的文件是最新的。

  • 如果它以非零狀態退出,則提交將終止。可以使用 git commit **--no-verify**繞過它。

prepare-commit-msg 鉤子

  • 在生成預設提交訊息後但在提交訊息編輯器開啟之前執行。

  • 允許更改預設提交訊息。

  • 它有助於自動生成的郵件,例如與壓縮或合併更改相關的郵件。

  • 接收選項,例如提交型別、提交**SHA-1**(如果是已修改的提交)以及提交訊息檔案的路徑。

commit-msg 鉤子

  • 在編寫提交訊息後但在完成提交之前執行。

  • 用於確認專案狀態或提交訊息是否滿足指定的要求。

  • 如果它以非零狀態退出,Git 將中止提交。接收提交訊息檔案的路徑。

post-commit 鉤子

  • 在提交過程完成後執行。

  • 通常用於額外的任務或通知。

  • 使用**git log -1 HEAD**檢視最近提交的資訊。

  • 不需要任何引數。

電子郵件工作流鉤子

我們可以為使用基於電子郵件的補丁的工作流配置三個客戶端鉤子。

**git am**命令(用於應用透過電子郵件接收的修復程式)會啟動這些鉤子。

  • 如果我們不使用**git am**,我們可以忽略這些鉤子。

  • 但是,如果我們使用**git format-patch**進行更改,這些鉤子可能會有所幫助。

applypatch-msg 鉤子

  • 首先執行並接受一個引數,該引數是包含建議提交訊息的臨時檔案的路徑。

  • 在完成補丁應用之前,它用於驗證或編輯提交訊息。

  • 如果指令碼以非零狀態退出,則補丁應用將停止。

pre-applypatch 鉤子

  • 在建立提交之前但在應用補丁之後執行。

  • 在提交更改之前,我們可以檢查工作樹或對修改進行測試。

  • 如果遇到任何問題並且指令碼以非零狀態退出,則 git am 程序將終止而不會提交。

post-applypatch 鉤子

  • 在提交後執行。它有助於與已應用的補丁相關的通知或其他任務。

  • 雖然此指令碼無法阻止補丁提交,但它可以用來執行諸如通知人們已應用補丁之類的事情。

其他客戶端鉤子

Git 客戶端中提供了以下鉤子。

pre-rebase 鉤子

  • 在啟動變基過程之前執行。

  • 如果它以非零狀態退出,則可以阻止變基發生。

  • 為了保留共享歷史記錄,此鉤子可用於限制對先前已推送的提交的變基。

  • 此鉤子的邏輯包含在 Git 的預設示例中,但可能需要修改以滿足我們的特定流程。

post-rewrite 鉤子

  • 由更改提交的命令(而非**git filter-branch**)啟動,例如**git commit --amend**或**git rebase**。

  • 它會收到受影響提交的列表以及啟動重寫的命令。

  • 此鉤子用於更新相關係統或傳送通知,以及 post-checkout 和 post-merge 鉤子處理的其他事項。

post-checkout 鉤子

  • 在成功執行**git checkout**後執行。

  • 我們可以使用此鉤子來設定工作目錄並執行特定於環境的操作,例如傳輸 Git 不跟蹤的二進位制檔案或自動建立文件。

post-merge 鉤子

  • 在成功合併後執行。

  • 它可以用來恢復 Git 未管理的資料,例如外部檔案或檔案許可權,確保在合併後我們的工作目錄設定正確。

pre-push 鉤子

  • 在**git push**期間執行,在更新遠端引用後但在傳輸物件之前執行。

  • 除了需要透過**stdin**更改的引用列表外,它還接收遠端名稱和位置作為引數。

  • 在將更改推送到遠端儲存庫之前,可以使用此鉤子對其進行驗證。

  • 如果鉤子以非零條件退出,則推送將終止。

pre-auto-gc 鉤子

  • 在 Git 使用**git gc --auto**執行自動垃圾回收之前呼叫。

  • 它可以用來通知我們何時計劃進行垃圾回收,或者如果這不是合適的時間,則完全停止操作。

伺服器端鉤子

稱為**伺服器端鉤子**的指令碼在 Git 伺服器上執行,以管理與推送操作相關的不同任務並執行策略。

這些鉤子能夠在推送完成後執行操作或拒絕推送。

pre-receive 鉤子

  • 當客戶端將修改推送到伺服器時,此指令碼將首先執行。

  • 透過 stdin,它接收引用(分支或標籤)列表。

  • 此鉤子的非零退出狀態表示不接受任何引用。

  • 使用它來實施規則,例如限制對引用的訪問或禁止非快進修改。

update 鉤子

  • 此鉤子與 pre-receive 鉤子類似,但會針對每個推送的分支獨立執行。

  • 所需的引數:引用的名稱、引用的前一個 SHA-1 以及客戶端正在推送的新 SHA-1。

  • 如果此鉤子以非零狀態退出,則僅拒絕該分支更新;其他分支更新可能仍會被接受。

post-receive 鉤子

  • 在推送過程結束後執行。

  • 透過 stdin,它獲取與**pre-receive 鉤子**相同的引用列表。

  • 此鉤子用於傳送電子郵件、更新問題跟蹤系統和通知其他服務(如持續整合伺服器)等。

  • 客戶端在斷開連線之前會等待此鉤子完成,因此如果它需要長時間的活動,即使它不能中斷推送過程,也應謹慎使用。

使用 Git 鉤子的好處

以下是使用 Git 鉤子的一些好處

  • **任務自動化** - 測試、格式化或部署等任務本質上是重複性的,可以使用鉤子來自動化。

  • **標準執行** - 即使在程式碼提交或推送之前,也要確保執行程式碼標準和最佳實踐。

  • **與其他工具整合** - 允許您與其他工具整合,例如 CI/CD 管道或通知服務。

Git 鉤子是自定義工作流程和確保專案中程式碼質量的強大方法。

廣告