2019年4月14日 星期日

gitbook8.3翻譯未整理

8.3 自訂 Git-Git 掛鉤

Git Hooks

與許多其他版本控制系統一樣, Git 可以在發生某些重要操作時觸發自訂腳本。這些掛鉤有兩組: 用戶端和伺服器端。用戶端掛鉤由提交和合併等操作觸發, 而伺服器端掛鉤則在網路操作 (如接收推送提交) 上運行。出於各種原因, 您可以使用這些掛鉤。

安裝掛鉤

鉤子都存儲在 Git 目錄的hooks子目錄中。在大多數專案中, 這就是.git/hooks當您使用git init化一個新的存儲庫時, git 會使用大量的示例腳本填充掛鉤目錄, 其中許多腳本本身是有用的;但它們也記錄了每個腳本的輸入值。所有的示例都是作為 shell 腳本編寫的, 其中包含一些 Perl, 但任何正確命名的可執行腳本都可以正常工作--您可以用 Ruby 或 Python 或您擁有的內容編寫它們。如果要使用捆綁的鉤子腳本, 則必須重命名它們; 如果要使用捆綁的鉤子腳本, 則必須重命名它們。他們的檔案名都以.sample示例結尾.
若要啟用鉤子腳本, 請將檔放在. git 目錄的hooks子目錄中, 該檔被適當命名 (不帶任何副檔名), 並且是可執行檔。從這一點出發, 應該稱之為。我們將在這裡介紹大多數主要的鉤子檔案名。

用戶端掛鉤

有很多用戶端掛鉤。本節將它們分為提交工作流掛鉤、電子郵件工作流腳本以及其他所有內容。
手寫
請務必注意, 在克隆存儲庫時不會複製用戶端掛鉤。如果您使用這些腳本的目的是強制實施策略, 則可能需要在伺服器端執行該操作; 如果您使用這些腳本的目的是執行策略, 則可能需要在伺服器端執行該操作。請參閱示例 git 強制策略中的示例.

新興工作流程掛鉤

前四個掛鉤與提交過程有關。
pre-commit鉤子首先運行, 然後再鍵入提交消息。它用於檢查即將提交的快照, 查看是否忘記了某些內容, 確保測試回合, 或檢查代碼中需要檢查的任何內容。從該鉤子中提取非零將中止提交, 儘管您可以使用git commit --no-verify您可以執行以下操作: 檢查代碼樣式 (運行lint或類似的內容), 檢查尾隨空格 (預設鉤子正是這樣做), 或者檢查有關新方法的適當文檔。
在啟動提交消息編輯器之前, 但在創建預設消息之後, 將運行prepare-commit-msg鉤子。它允許您在提交作者看到預設消息之前對其進行編輯。此鉤子採用幾個參數: 到目前為止保存提交消息的檔的路徑、提交的類型以及提交 SHA-1 (如果這是修改後的提交)。此鉤子通常對正常提交沒有用處;相反, 它適用于自動生成預設消息的提交, 如範本化提交消息、合併提交、壓縮提交和修改提交。您可以將其與提交範本結合使用, 以程式設計方式插入資訊。
commit-msg鉤子採用一個參數, 這也是包含開發人員編寫的提交消息的暫存檔案的路徑。如果此腳本退出非零, Git 將中止提交過程, 因此您可以使用它來驗證專案狀態或提交消息, 然後再允許提交通過。在本章的最後一節中, 我們將演示如何使用此鉤子來檢查提交消息是否符合所需的模式。
完成整個提交過程後,post-commit的鉤子。它不需要任何參數, 但您可以通過運行git log -1 HEAD輕鬆獲得最後一次提交。通常, 此腳本用於通知或類似的內容。

電子郵件工作流程掛鉤

您可以為基於電子郵件的工作流設置三個用戶端掛鉤。它們都由git am命令調用, 因此, 如果您不在工作流中使用該命令, 則可以安全地跳到下一節。如果你正在通過git format-patch電子郵件進行補丁, 那麼其中一些可能對你有説明。
運行的第一個鉤子是applypatch-msg)。它需要一個參數: 包含建議的提交消息的暫存檔案的名稱。如果此腳本退出非零, Git 將中止修補程式。您可以使用它來確保提交消息的格式正確, 或者通過讓腳本就地編輯該消息來對其進行正常化。
通過git am補丁時運行的下一個鉤子是pre-applypatch有些困惑的是, 它是在應用修補程式之後但在提交之前運行的, 因此您可以使用它在提交之前檢查快照。您可以使用此腳本運行測試或以其他方式檢查工作樹。如果缺少某些內容或測試未通過, 則退出非零將中止git am, 而不提交修補程式。
git am操作期間運行的最後一個鉤子是post-applypatch類型, 它在提交後運行。您可以使用它來通知您已執行此操作的組或您所提取的修補程式的作者。您不能停止使用此腳本的修補過程。

其他用戶端掛鉤

在重新建立任何東西之前,pre-rebase鉤子將運行, 並可以通過退出非零來阻止該過程。您可以使用此鉤子來禁止重新建立已推送的任何提交的基礎。Git 安裝的預pre-rebase鉤子示例執行此操作, 儘管它提供了一些可能與您的工作流不匹配的假設。
post-rewrite鉤子由替換提交的命令運行, 例如git commit --amendgit rebase(儘管不是git filter-branch它的唯一參數是哪個命令觸發重寫, 並在stdin上接收重寫清單。這個鉤子有許多與post-checkout鉤子和post-merge鉤子相同的用途。
運行成功的git checkout後,post-checkout後掛鉤將運行;您可以使用它為您的專案環境正確設置您的工作目錄。這可能意味著在不希望源控制的大型二進位檔案中移動, 自動生成文檔, 或者類似的東西。
post-merge鉤子在成功合併命令後merge運行。您可以使用它來還原 Git 無法跟蹤的工作樹中的資料, 例如許可權資料。此鉤子同樣可以驗證 Git 控制項外部的檔是否存在, 您可能希望在工作樹更改時將其複製到其中。
git push過程中, 在更新了遠端 refs 之後,pre-push傳輸任何物件之前, 預推鉤將運行。它接收遙控器的名稱和位置作為參數, 並通過stdin接收待更新的 refs 清單。您可以使用它在推送發生之前驗證一組 ref 更新 (非零結束代碼將中止推送)。
Git 偶爾會通過調用git gc --auto進行垃圾收集, 作為其正常操作的一部分。在垃圾回收發生之前調用pre-auto-gc鉤子, 可以用來通知您發生了這種情況, 或者如果現在不是好時機, 則中止收集。

伺服器端掛鉤

除了用戶端掛鉤之外, 作為系統管理員, 您還可以使用幾個重要的伺服器端掛鉤來為您的專案強制實施幾乎任何類型的策略。這些腳本在推送到伺服器之前和之後運行。預掛鉤可以隨時退出非零, 以拒絕推送, 並將錯誤訊息列印回用戶端;您可以設置一個如您所願的複雜推送策略。

pre-receive

處理來自用戶端的推送時運行的第一個腳本是pre-receive它需要從 stdin 推送的引用的清單;如果它退出非零, 它們都不被接受。您可以使用此鉤子來執行一些操作, 例如確保更新後的引用都不是非快速轉發, 或者對它們正在使用推送修改的所有 refs 和檔執行存取控制。

update

update腳本與pre-receive腳本非常相似, 只是它為推送器嘗試更新的每個分支運行一次。如果推手試圖推送到多個分支,pre-receive只運行一次, 而更新則在每個分支中運行一次。此腳本不從 stdin 讀取, 而是採用三個參數: 引用 (分支) 的名稱、推送前指向的 SHA-1 和使用者試圖推送的 SHA-1。如果更新腳本退出非零, 則僅拒絕該引用; 如果更新腳本退出非零, 則僅拒絕該引用。其他引用仍然可以更新。

post-receive

post-receive鉤子在整個過程完成後運行, 可用於更新其他服務或通知使用者。它佔用的資料與pre-receive鉤子相同。例如, 通過電子郵件發送清單、通知持續整合服務器或更新票證跟蹤系統, 您甚至可以分析提交消息, 以查看是否需要打開、修改或關閉任何票證。此腳本無法停止推送過程, 但用戶端在完成之前不會斷開連接, 因此, 如果您嘗試執行任何可能需要很長時間的操作, 請務必小心。

沒有留言:

張貼留言

gitbook9.2翻譯未整理

9.2 Git 和其他系統-遷移到 Git Migrating to Git 如果您在另一個 VCS 中有一個現有的代碼庫, 但您已決定開始使用 Git, 則必須以這樣或那樣的方式遷移專案。 本節介紹了一些通用系統的導入器, 然後演示如何開發您自己的自訂導入器。 您...