Gitmoji x Conventional Commit 工作流 (二) - 使用 Commitlint + Husky 校驗提交格式
前言
在上一篇文章中,我們介紹了如何透過 Commitizen 與 Gitmoji 規範化提交訊息。但規範的建立並不保證會被嚴格執行,許多團隊仍可能面臨這樣的情況:
「提交訊息格式看起來很簡單,但實際操作時,不是漏寫了類型,就是格式寫錯了。」
這種情況下,提交訊息的規範就形同虛設。因此,若要確保提交訊息始終符合規範,勢必得設立一道自動化檢核機制來攔截不合格的提交。
這正是 Commitlint 發揮作用的地方!它專門校驗提交訊息是否符合規範,無論是 Conventional Commits 還是 Gitmoji,都可透過自定義配置嚴格檢查,避免不合格的提交進入版本控制歷史。當然,工具的強大功能需要在正確的時間觸發才能發揮作用,搭配 Husky,我們能利用 Git hooks 在提交前自動執行 Commitlint 的校驗邏輯,將自動化檢核落實於日常開發流程。
本篇文章將帶你實作以下內容:
- 不使用 Gitmoji 的提交校驗:延續前一篇的配置,透過 @commitlint/config-conventional 校驗提交訊息。
- 使用 Gitmoji 的提交校驗:加入 commitlint-config-gitmoji 與 commitlint-config-cz,支援帶有 Emoji 的訊息格式。
- 整合 Husky:將 Commitlint 校驗嵌入 Git Hooks,阻止不符合規範的提交。
提交訊息校驗工具: Commitlint
Commitlint 是一個專門用來檢查提交訊息格式的工具,能根據預設規範或自訂規則檢查每一筆提交訊息是否合格。它的核心功能包括:
- 校驗提交訊息格式:確保每次提交的訊息都符合既定規範,例如 Conventional Commits 或自訂的 Gitmoji 規範。
- 即時阻止不合規提交:透過與 Git Hooks 的整合(如搭配 Husky),在提交階段自動執行校驗邏輯,避免錯誤訊息進入版本控制歷史。
- 高度可擴展性:支援多種現成的規範配置,例如 @commitlint/config-conventional、commitlint-config-gitmoji,也可自定義檢核規則。
舉例來說,以下這樣的提交訊息格式符合 Conventional Commits 的規範:
feat(api): add new endpoint for user authentication
但若提交訊息不符合規範,例如這樣:
updated something
Commitlint 會立即提示錯誤,並阻止提交,確保不規範的訊息不會進入版本控制歷史。
實作一:不使用 Gitmoji 的 Commitlint 配置
在上一篇中,我們針對不使用 Gitmoji 的情境提出了兩種工具選擇:
-
cz-conventional-changelog
配置簡單,生成的提交訊息符合 Conventional Changelog 標準,可直接通過@commitlint/config-conventional
的檢核。 -
@commitlint/cz-commitlint + @commitlint/config-conventional
從 commitlint 的角度出發,根據指定規則(設定於commitlint.config.js
)生成提交訊息,適合需要自定義驗證規則的專案。
本節將延續第一篇文章中的設定,透過 Commitlint 與 @commitlint/config-conventional,實現基於 Conventional Commits 規範的提交訊息校驗,並確保提交符合標準格式。
安裝與配置 Commitlint
步驟 1:安裝 Commitlint
在專案中安裝 Commitlint CLI 和 Conventional Commits 的預設配置:
npm install --save-dev @commitlint/{cli,config-conventional}
步驟 2:新增配置文件
在專案根目錄新增 commitlint.config.js
文件,內容如下:
module.exports = {
extends: ['@commitlint/config-conventional'],
};
這裡的配置表示我們將使用 Conventional Commits 的規範。
整合 Commitizen 與 Commitlint
為了讓提交訊息規範與 Commitizen 完美配合,我們將測試使用 cz-conventional-changelog 或是 @commitlint/cz-commitlint + @commitlint/config-conventional 這兩種方法生成的提交訊息是否符合 @commitlint/config-conventional 的校驗標準。
步驟 1:在 package.json
中配置 Commitizen
{
"scripts": {
"commit": "cz"
},
"config": {
"commitizen": {
"path": "cz-conventional-changelog" // 或 @commitlint/cz-commitlint
}
}
}
步驟 2:使用 Commitizen 產生互動式提交
使用以下命令啟動互動式提交:
npm run commit
假設我們在互動式提交中輸入以下訊息:
type: feat
scope: api
subject: add authentication endpoint
Commitizen 生成的提交訊息將是:
feat(api): add authentication endpoint
步驟 3:測試 Commitizen 產生的提交訊息
Commitlint 安裝完成後,可以使用以下命令測試前一個提交訊息的校驗:
npx commitlint --from=HEAD~1 --to=HEAD
執行上述命令後,Commitlint 不會報錯,表示提交訊息符合規範。
步驟 4:測試不符合規範的提交訊息
嘗試手動輸入一條不符合規範的提交訊息,例如:
update something
Commitlint 會提示錯誤,阻止提交:
⧗ input: update something
✖ type must not be empty [type-empty]
✖ found 2 problems, 0 warnings
實作二:使用 Gitmoji 的 Commitlint 配置
在上一節中,我們實作了不使用 Gitmoji 的提交訊息校驗。本節將專注於帶有 Gitmoji 的提交訊息,並介紹兩個 Commitlint 配置模組 commitlint-config-gitmoji 與 commitlint-config-cz 的作用與差異,幫助你選擇適合的工具來進一步規範提交工作流。