Git 鉤子

已發表: 2022-07-02

Git 是一個強大的版本控制系統,在過去的幾篇文章中我們幾乎沒有觸及到它的表面。 今天,我們將看看 Git 可以通過 Git Hooks 為您提供的自動化功能。

當您使用git init命令時,每個存儲庫都會內置掛鉤。 初始化存儲庫時,您會得到一個隱藏的.git目錄,其中有一個名為 hooks 的目錄,它將包含您的所有鉤子。 打開您方便的任何 git 存儲庫並使用ls -a查看隱藏目錄,然後在您喜歡的代碼編輯器中打開它。

首先,您會看到一堆帶有.sample文件擴展名的文件。 這些正是他們所說的,您可以在項目中使用的示例腳本。 這些文件被命名為與它們運行的鉤子相對應。 所以post-commit.samplepost-commit鉤子上運行。

你幾乎可以使用任何語言來編寫一個鉤子。 該文件根據文件頂部的 shebang 表示法進行解析。 如果你想使用節點,你會使用#! /usr/bindi/env node #! /usr/bindi/env node ,您的文件將被解析為節點文件。

在我們深入了解 git 鉤子可以做什麼之前,讓我們先看看一些可用的鉤子。

Git 鉤子的類型

提交工作流掛鉤

pre-commit在你輸入提交信息之前運行,它可以被git commit --no-verify繞過。

prepare-commit-msg可用於編輯您在提交消息中看到的默認消息。 使用它向開發人員說明他們應該留下什麼類型的提交消息。 它還可以用於自動為您自動生成消息的內容,例如合併或自動將問題編號添加到您的提交消息中。

commit-msg可用於驗證項目的提交消息。 也許您不希望任何人能夠輸入簡單地說“處理空白”的提交消息。 您可以使用此掛鉤來檢測單詞空格的存在,然後退出並向用戶提供警告,告知他們需要更好的提交消息。

post-commit在上面的所有提交鉤子之後運行。 對於已提交的通知最有用。

客戶端掛鉤

post-checkout在您成功運行 git checkout 命令後運行。 如果您在站點上使用了一組大文件,但不希望它們在源代碼管理中,您可以使用此命令為您移動文件。

pre-push在任何對像傳輸到遠程存儲庫之前在 git push 命令期間運行。

服務器掛鉤

當客戶端將代碼推送到遠程存儲庫時, pre-receive運行。 這可用於在您接受推送之前檢查正在推送的代碼,以確保它符合您項目的標準。

post-receive在您的遠程存儲庫收到更新後運行。 這可用於調用觸發部署過程的網絡掛鉤或通知聊天室已收到提交並準備好進行審查。

上面的許多鉤子可以設置為僅在特定分支上運行。 這可能意味著只有在有人將代碼推送到應該準備好部署的主分支時才使用post-receive掛鉤。 可以通知開發人員列表來審查代碼,然後部署它。 這樣,您將始終對部署有 2 對眼睛,這可能意味著發現單個開發人員很容易錯過的錯誤。

我跳過了一些可用的鉤子,因為我從未見過需要使用它們。 我沒有提到的一組鉤子是電子郵件工作流鉤子。 如果您不通過電子郵件接受代碼補丁,那麼您可能永遠不需要它們。 您可以在文檔中找到所有可用的鉤子。

在實踐中,我使用最多的鉤子是:

  • 預提交
  • 預推
  • 提交消息
  • 預收
  • 提交後
  • 接收後

現在讓我們用這些鉤子做點什麼。

使用 WP Cli 和 Git Hooks 激活 WordPress 插件

對於今年的一個客戶項目,我正在添加一個商店,並且仍在主站點上執行一些任務。 這意味著主站點沒有安裝或激活我們的任何 WooCommerce 插件。 我需要在一個分支上開發 WooCommerce 商店,只有在我準備好將其全部上線後,我才想將 WooCommerce 轉移到主要分支。

首先,我們需要一個名為 store 的新分支。 我們可以通過使用 git checkout -b store來獲得。 這將創建一個新分支並為我們檢查它。 現在讓我們準備好鉤子。

首先,我們需要使用這個命令 touch .git/hooks/post-checkout創建 post-checkout 鉤子。

接下來我們需要使其可執行。 我們可以使用終端 chmod +x .git/hooks/post-checkout中的 chmod 命令來執行此操作。

現在在您選擇的代碼編輯器中打開該文件,並將下面的代碼複製到您post-checkout文件中。

#! /bin/bash

wp plugin activate woocommerce

echo "activated WooCommerce"

wp plugin activate automatewoo

echo "activated AutomateWoo"

您可以通過終端更改到任何分支來進行演示。 您應該看到兩行告訴您 WooCommerce 和 AutomateWoo 已被激活。 我們知道它正在工作,但它並不是我們想要的,因為它會在我們每次更改到任何分支時打開插件。

我們真正想要的是在我們移動到我們的商店分店時打開它們,然後當我們在我們的主要分店時將它們關閉。 為此,我們需要鉤子來檢測我們是哪個分支。 用下面的代碼交換post-checkout的內容。

#! /bin/bash

oldrev=$1
newrev=$2

branch_name="(git symbolic-ref HEAD 2>/dev/null)"

if [ "refs/head/store" = "$branch_name" ];then
wp plugin activate woocommerce
echo "activated Woo"

wp plugin activate automatewoo
echo "activated AutomateWoo"
fi

if [ "refs/head/main" = "$branch_name" ];then
wp plugin deactivate woocommerce
echo "deactivated Woo"

wp plugin deactivate automatewoo
echo "deactivated AutomateWoo"
fi

這段代碼首先將我們要簽出的分支分配給branch_name變量。 然後我們有兩個 if 語句。 第一個檢查我們是否已經搬到商店分店。 如果我們有它使用 WP CLI 來激活 WooCommerce 和 AutomateWoo。

下一個 if 語句檢查我們是否在主分支上。 如果是,它將使用 WP CLI 停用插件並在終端中告訴我們有關它的信息。

使用 Git Hooks 控制 Git 工作流

在之前關於 Git 的文章中,我談到了不同的 Git 工作流程。 掛鉤的一個非常常見的用例是阻止任何人直接將代碼提交到主分支。 您可以使用掛鉤來確保所有代碼都從不同的分支合併到主分支。

首先將pre-commit.sample重命名為pre-commit ,然後按照我上面的描述使其可執行。 接下來獲取下面的代碼並在預提交文件中使用它。

#! /bin/bash

username=$GIT_AUTHOR_NAME
branch="$(git symbolic-ref HEAD 2>/dev/null)"

if [ "$branch" = "refs/heads/main" ]; then
echo "WHOA that was '"${branch}"' you should not do that. Stop doing silly stuff and create your own branch and merge it."
exit 1 # if you remove this it won't block the commit but it will send the message to slack

fi

這會檢查我們是否在主分支上,如果是,則停止提交。 然後它會向用戶打印一個提醒,他們不應該直接提交到主分支。

請記住,許多地方正在更改為main作為他們的分支。 如果尚未更新,較舊的項目可能需要在此處設置master

您甚至可以更進一步,使用 cURL 訪問聊天應用程序的 API,然後公開抱怨有人試圖提交 main。

git hooks 的唯一限制是你的想像力。 如果代碼中存在 TODO,您可以使用它們來阻止某人提交,或者在文件末尾停止空格。

如果您的工作流程的某些部分是一個持續的絆腳石,請查看鉤子以使其自動化,這樣您就不必記住了。