實作 Git 勾點

已完成

在開發程式的過程中,應優先考慮程式代碼的品質,而這應該從本地的程式碼開發開始。 請務必在開始提取要求之前,找出此做法的機會,以偵測並修正潛在的程式代碼質量問題。

Git 勾點提供絕佳的機會。 它們可作為執行自定義腳本的機制,以回應 Git 生命週期內的重大事件,例如認可、合併和推送。 這些腳本位於存放庫的 .git\hooks 目錄中,在自動化軟體開發工作並強制執行開發標準方面提供幾乎無限制的彈性。

如何實作 Git 勾點

首先,我們得探索用戶端的 Git 勾點。 瀏覽至存放庫 .git\hooks 目錄 – 您發現有許多擴展名 sample為 的檔案。 此副檔名不僅表示其用途,而也可有效防止執行。 移除 sample 副檔名後,檔案名稱會指示觸發其執行的 Git 動作。

適用於自動化的 Git 勾點檔案螢幕擷取畫面。

將預提交 sample 檔案重新命名為預提交。 如檔名所示,每當您叫用 git 認可動作時,就會執行它所包含的腳本。 只有在您的預提交腳本以 0 作為返回值結束時,才會進行提交。

不過,請務必注意,根據預設,這將無法如預期運作於任何 Windows 作業系統。 此行為通常被忽略的原因是文稿的第一行:

#!/bin/sh

Linux 作業系統為 #! prefix 會向程式載入器指出檔案的其餘部分包含要解譯的腳本,而 /bin/sh 是應該使用之解釋器的完整路徑。

雖然 Git for Windows 支援 Bash 命令和殼層腳本,但指定文件系統路徑時不會遵循相同的慣例。 相反地,您需要從驅動器號開始,提供 sh.exe 檔案的完整路徑。

不過,有一個額外的注意事項,這會導致 Windows Git 預設會安裝在 C:\Program Files 目錄中。 由於此目錄在其名稱中包含空格,因此 sh.exe 檔案的結果路徑會解譯為兩個不同的路徑,而導致失敗。 若要避免,您必須在空格前面新增單反斜線 (\) 作為逸出字元。 實際上,使用 64 位版本的 Git for Windows 時,腳本的第一行應該具有下列格式:

#!C:/Program\ Files/Git/usr/bin/sh.exe

如何執行

如何使用新發現的 Git 預設提交腳本功能? 如何阻止您不小心將秘密洩漏至 GitHub?

讓我們使用 Git 掛勾來掃描提交到本機存放庫的程式碼中的特定關鍵詞。 將預設提交 Shell 腳本的內容替換成以下程式碼:

#!C:/Program\ Files/Git/usr/bin/sh.exe
matches=$(git diff-index --patch HEAD | grep '^+' | grep -Pi 'password|secret')
if [ ! -z "$matches" ]
then
  cat <<\EOT
Error: Words from the blocked list were present in the diff:
EOT
echo $matches
exit 1
fi

此範例旨在說明概念,而非提供完整的解決方案,因此關鍵詞清單故意設計得十分簡單。 藉由使用正則表示式,您可以大幅擴充其範圍和彈性。 您也可以選擇參考外部檔案,這可大幅簡化進行中的維護。

運作方式

一旦被調用,提交前的掛勾腳本會使用 git diff 和 grep 命令來偵測正在提交程式碼的增量變更中的關鍵詞或模式。 如果偵測到相符項目,則指令碼會產生錯誤訊息並防止進行認可。

還有更多:

pre-commit 勾點指令碼的其他常見使用案例包含程式碼格式化、Lint 分析或執行自訂測試,以確保認可遵循專案標準。 Prepare-commit-msg 會在啟動提交訊息編輯工具之前執行。 它允許動態地生成提交訊息,以强制执行命名惯例,例如使用指定的前置詞(例如:feat:表示新功能或fix:表示錯誤修正)。

例如,下列 prepare-commit-msg 腳本會在創建新的提交時,自動在提交訊息前加上目前分支名稱。 透過在檔案開頭新增分支名稱並在後面加上冒號和空格,藉此修改認可訊息檔案 ($1)。

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Get the current branch name
branch_name=$(git branch --show-current)
# Check if the commit message file exists
if [[ -f "$1" ]]; then
  # Prepend the branch name to the commit message
  sed -i "1s/^/$branch_name: /" "$1"
fi

提交後腳本會在提交完成之後執行。 它可用來觸發通知或產生檔。

例如,下列腳本會在每次認可之後傳送電子郵件通知給指定的收件者。 您可以通過修改收件者電子郵件位址、SMTP 伺服器,以及電子郵件的主旨和本文來自訂腳本。 此外,您可能需要設定系統以使用 Send-MailMessage PowerShell Cmdlet 傳送電子郵件,或使用不同的方法來傳送通知,視您的環境和需求而定。

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Set the recipient email address
$recipient="your@email.com"
# Set the subject of the email
$subject="Git Commit Notification"
# Set the body of the email
$body="A new commit has been made to the repository."
# Send the email notification
Send-MailMessage -To $recipient -Subject $subject -Body $body -SmtpServer "your.smtp.server"

值得注意的是,資料庫 .git\hooks 資料夾不會提交到版本控制系統。 您可能想知道是否有辦法與開發小組其他成員共用您所開發的腳本。 好消息是,從 Git 2.9 版開始,您可以將 Git 鉤子對應到可以提交到版本控制的資料夾。 您可以藉由更新 Git 存放庫的全域設定組態來執行此動作:

Git config --global core.hooksPath '~/.githooks'

若您需要覆寫您在用戶端設定的 Git 勾點,您可以使用無驗證切換來執行這項作業:

Git commit --no-verify

伺服器端勾點

雖然用戶端 Git 鉤子提供增強開發工作流程的強大功能,但 Azure Repos 也提供伺服器端鉤子來進一步增強開發過程,包括建立拉取請求的支援。 如需詳細資訊,請參閱 Azure Repos 服務掛勾事件 參考。