首頁 > 科技週邊 > IT業界 > git鉤介紹

git鉤介紹

Christopher Nolan
發布: 2025-02-21 08:58:11
原創
918 人瀏覽過

An Introduction to Git Hooks

git鉤介紹

鑰匙要點

  • git掛鉤是在某些操作之前或之後運行的簡單腳本,例如對文件的測試語法進行測試語法,並且可以用環境可以使用的任何語言編寫。
  • 存在兩種類型的掛鉤:在開發人員的系統上運行的客戶端,以及在託管Git存儲庫的服務器上運行的服務器端。
  • > git掛鉤不是與您的項目分配的,也不能自動安裝它們,因此為您的鉤子創建一個生活並告訴您的合作者使用它們是有益的。 >>>>>>
  • > git鉤是自動化項目工作流程,使您能夠驗證代碼,提交消息,確保環境適當以及更多的強大手段。
  • >
  • git鉤是在某些操作之前或之後運行的簡單腳本。它們對於各種任務很有用,但是我主要發現它們對於客戶端驗證有用,因此可以防止簡單的錯誤。例如,您可以在要投入的文件上測試語法,甚至可以運行測試。我寫的鉤子可以驗證樹枝語法,將jshint運行到標準等等。
  • > 通過設計,Git鉤子也非常簡單。如果腳本是可執行的,則Git將運行這些掛鉤,並且GIT將允許操作(例如,提交或推動)只要掛鉤退出而沒有錯誤(狀態0)。掛鉤可以用環境可以使用的任何語言編寫。
>

有兩種類型的鉤子:

>客戶端 - 這些在開發人員的系統上運行

>服務器端 - 這些運行在託管Git存儲庫的服務器上

    本文將不介紹
  • >服務器端鉤子。但是,請注意,如果您的項目在GitHub之類的服務上,則服務器端掛鉤通常不適用。在GitHub上,相當於服務器端掛鉤的是使用服務和Webhooks,可以在您的項目設置中找到。
  • >
  • 鉤文件
>默認情況下的每個存儲庫(包括您克隆的存儲庫)都會在.git/hooks目錄中具有示例掛鉤:>

在該目錄中,您會看到類似的內容:

>我們將重點關注在允許提交之前運行的前簽名掛鉤。

示例鉤子:驗證PHP語法
<span>git clone git@github.com:symfony/symfony.git
</span><span>cd symfony
</span><span>ls .git/hooks</span>
登入後複製
登入後複製
登入後複製

>我們將以一個非常簡單的掛鉤開始,用bash編寫,該掛鉤驗證所犯下的php代碼具有有效的語法。這是為了防止“快速”但破裂的提交發生。當然,我勸阻幾乎沒有測試的“簡單提交”,但這並不意味著它們不會發生。

>
applypatch-msg.sample
commit-msg.sample
post-update.sample
pre-applypatch.sample
pre-commit
pre-commit.sample
prepare-commit-msg.sample
pre-push.sample
pre-rebase.sample
update.sample
登入後複製
登入後複製
登入後複製
in .git/hooks我們可以啟動一個名為Pre-Commit的新文件。它必須具有執行權限:

>

<span>git clone git@github.com:symfony/symfony.git
</span><span>cd symfony
</span><span>ls .git/hooks</span>
登入後複製
登入後複製
登入後複製

>您可以使用自己喜歡的編輯器開始寫作。首先,我們需要Shebang。我最喜歡的方法是使用/usr/bin/env,因為這使用了我們想要的應用程序的正確路徑,而不是硬編碼且可能是無效的路徑。目前,我們將不斷失敗,以便我們可以輕鬆測試。

>
applypatch-msg.sample
commit-msg.sample
post-update.sample
pre-applypatch.sample
pre-commit
pre-commit.sample
prepare-commit-msg.sample
pre-push.sample
pre-rebase.sample
update.sample
登入後複製
登入後複製
登入後複製
PHP具有語法驗證的有用選項:-l。它需要一個文件參數,因此我們將不得不循環瀏覽正在更改的任何PHP文件。為簡單起見,我們將假設任何投入的PHP文件始終以.php結尾。由於掛鉤是從存儲庫的根部運行的,因此我們可以使用標準GIT命令獲取有關更改的信息,例如GIT狀態。

#Always Fail Line上方,我們可以使用以下內容來修改所有PHP文件:>

>說明:

<span>cd .git/hooks
</span><span>touch pre-commit
</span><span>chmod +x pre-commit</span>
登入後複製
登入後複製

> php_files =在沒有定界符的情況下完成bash分配,但請注意,引用變量需要$ deLimiter

    $()是“獲取輸出”的語法。不需要引用它。
  • >
  • grep被用於檢查添加(a)和修改文件(m)
  • >
  • >尷尬在這裡用於打印$ 2。完整的git狀態 - 剛開始時有額外的空間和額外的數據,因此我們要刪除它。尷尬還可以自動剝離。
  • grep再次被使用,但現在正在檢查以確保行以.php
  • 結束
  • 現在,我們可以用for循環驗證每個文件:

這似乎有些奇怪,但是! php -l“ $ i”(請注意避免空間問題的引號)實際上是在檢查0的返回值為0,而不是true或我們通常在其他語言中期望的任何值。僅供參考,大約等效的PHP代碼將是:>

<span>#!/usr/bin/env bash
</span><span># Hook that checks PHP syntax
</span>
<span># Override IFS so that spaces do not count as delimiters
</span><span>old_ifs=$IFS
</span><span><span>IFS</span>=$'<span title="\n">\n'</span>
</span>
<span># Always fail
</span><span>exit 1</span>
登入後複製
登入後複製
我對SRC/SYMFONY/COMPONEN/FINDER/GLOB.PHP進行了錯誤的更改,目的是測試此問題,而Git Commit -M'test'的輸出就像:

>我使循環儘早退出了整個腳本,最終可能不是我們想要的。實際上,我們可能希望摘要要解決的問題,而不是必須繼續嘗試進行。任何人最終都會很容易感到沮喪,甚至可能學會使用git commits-不 - 驗證以完全繞過鉤子。
<span>php_files=<span>$(git status --short | grep -E '^(A|M)' | awk '{ print  }' | grep -E '\.php$')</span></span>
登入後複製
>

因此,我們不要以php -L的錯誤退出,但我仍然想保持易於閱讀的內容:>

在這裡,我們捕獲了PHP -L的輸出(以及對標準輸出的強制標準錯誤輸出)。我們使用特殊變量$檢查PHP -L的退出狀態? (這是退出狀態代碼)和操作員-EQ。我們聲明發生了語法錯誤(注意字符串中變量的$ {}的使用)。最後,我們給出了相關的錯誤行,以使輸出更短一點(greppping for'^parse錯誤'),我們給出了一條空白,以使其更可讀。

>我進行了兩個不良修改,並嘗試進行提交的嘗試看起來像這樣:>

<span>git clone git@github.com:symfony/symfony.git
</span><span>cd symfony
</span><span>ls .git/hooks</span>
登入後複製
登入後複製
登入後複製
現在的行動是解決這些問題,測試並嘗試再次提交。

要完成鉤子腳本,請在腳本底部刪除1個出口1。嘗試提交有效的PHP文件,並且應該按正常工作。

共享鉤子

鉤子未與您的項目分發,也不能自動安裝它們。因此,您最好的行動是為您創建一個鉤子居住的地方(可能位於同一存儲庫中),並告訴您的合作者使用它們。如果您對他們來說很容易,那麼他們更有可能這樣做。

>

>做到這一點的一種簡單方法是創建一個掛鉤目錄和一個簡單的安裝程序install-hooks.sh鏈接它們(而不是複制):

任何克隆您的項目的任何人都可以簡單地運行bash install-hooks.sh克隆後。

>
applypatch-msg.sample
commit-msg.sample
post-update.sample
pre-applypatch.sample
pre-commit
pre-commit.sample
prepare-commit-msg.sample
pre-push.sample
pre-rebase.sample
update.sample
登入後複製
登入後複製
登入後複製
這也具有將鉤子保持在版本控制下的好處。

>

其他鉤子

prepary-commit-msg - 如果沒有給出一個默認提交消息。

>
    commit-msg - 提交消息驗證。
  • >後委員會 - 在成功的提交後運行。
  • 預算 - 在驗證遙控器後的GIT推動之前運行。它需要2個參數:遙控器的名稱,以及它的URL。
  • >
  • > reperbase - 在git rebase之前運行。
  • >後簽名 - 成功結帳後運行。
  • >後合併 - 成功合併後運行。
  • 這些鉤子通常與預先投入的鉤子相同,儘管它們會參與爭論。檢查後的一個用例是確保文件始終獲得適當的權限(因為GIT僅跟踪可執行文件,而不是可執行的和符號鏈接):>>>>>
>對於commit-msg,您可能需要確保所有提交消息符合標準,例如

[subproject] message 。這是php中的一個:

<span>cd .git/hooks
</span><span>touch pre-commit
</span><span>chmod +x pre-commit</span>
登入後複製
登入後複製

結論 git鉤是自動化項目工作流程的強大手段。您可以驗證代碼,提交消息,確保環境正確,還有很多。您使用Git鉤子有什麼有趣的東西嗎?在評論中讓我們知道!

>
<span>#!/usr/bin/env bash
</span><span># Hook that checks PHP syntax
</span>
<span># Override IFS so that spaces do not count as delimiters
</span><span>old_ifs=$IFS
</span><span><span>IFS</span>=$'<span title="\n">\n'</span>
</span>
<span># Always fail
</span><span>exit 1</span>
登入後複製
登入後複製
經常詢問有關git鉤的問題(常見問題解答)

git掛鉤的不同類型是什麼?客戶端鉤子是由諸如投入和合併之類的操作觸發的,而服務器端掛鉤在網絡操作上運行,例如接收推動提交。可以自定義每個鉤子以滿足您的特定操作需求。

如何創建一個git掛鉤?

創建一個git鉤,導航到存儲庫中的.git/hooks目錄。在這裡,您會找到各種掛鉤的示例腳本。要創建一個新的鉤子,請創建一個沒有任何擴展名的文件(例如,預先命中),使其可執行,並編寫您的腳本。

>如何使用git掛鉤進行自動化?

> git鉤可用於自動化開發工作流中的各種任務。例如,您可以在每個提交之前使用預製掛鉤自動運行測試或代碼上的襯裡。這樣可以確保僅測試和正確格式的代碼才能將其投入到存儲庫中。

我可以與我的團隊共享git鉤嗎?

默認情況下,當您克隆一個存儲庫時,不包括git掛鉤。這是因為它們存儲在.git目錄中,該目錄未版本化。但是,您可以通過將它們存儲在項目中的單獨目錄中,並創建一個腳本以將它們鏈接到.git/hooks中。

>

我如何使用git掛鉤執行政策? >

> git掛鉤可用於執行項目或公司政策。例如,您可以在服務器端使用接收前的鉤子來拒絕任何不符合您策略的推動(例如,提交不遵循某種格式的提交)。

>

我可以用來寫git鉤嗎?

git掛鉤是腳本,因此您可以用任何腳本語言編寫它們。默認樣本是用bash編寫的,但是您可以使用任何您喜歡的語言,例如Python或Ruby。 GIT鉤可用於將Git與其他工具集成在一起。例如,您可以使用郵票後鉤子在連續集成服務器中觸發構建或在您的問題跟踪系統中更新票證。

>

如何調試git鉤?調試git掛鉤可以通過將信息寫入掛鉤腳本的文件來完成。例如,您可以將命令的輸出重定向到日誌文件以稍後進行檢查。

>我可以忽略git鉤嗎?提交,您可以將–No-Verify選項與Git Commit命令一起使用。當您進行不需要鉤子中實現的支票的次要更改時,這可能很有用。

>

強大,應謹慎使用它們。書面不好的鉤子可能會導致問題,包括拒絕所有提交甚至數據丟失。部署之前,請務必徹底測試您的鉤子。

以上是git鉤介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板