前言
規(guī)范化 git commit 對于提高 git log 可讀性、可控的版本控制和 changelog 生成都有著重要的作用。然而阻礙我們腳步的不只是團(tuán)隊的推廣买置,單單對于一系列工具的配置都讓人頭大角寸。這其中主要就是 commitlint 和 commitizen 的配合使用以及自定義提交規(guī)范。本文總結(jié)了目前的最佳實踐給大家弱贼,如果有幫助,賞個star足矣磷蛹。
Conventional Commits 約定式提交規(guī)范
Conventional Commits 是一種用于給提交信息增加人機(jī)可讀含義的規(guī)范吮旅。約定式提交規(guī)范是一種基于消息的輕量級約定。它提供了一組用于創(chuàng)建清晰的提交歷史的簡單規(guī)則味咳;這使得編寫基于規(guī)范的自動化工具變得更容易庇勃。這個約定與 SemVer 相吻合,在提交信息中描述新特性槽驶、bug 修復(fù)和破壞性變更责嚷。
提交說明的結(jié)構(gòu)如下所示:
類型(type)
feat:: 類型為 feat 的提交表示在代碼庫中新增了一個功能(這和語義化版本中的 MINOR 相對應(yīng))。
fix::類型為 fix 的 提交表示在代碼庫中修復(fù)了一個 bug (這和語義化版本中的 PATCH 相對應(yīng))掂铐。
docs:: 只是更改文檔罕拂。
style:: 不影響代碼含義的變化(空白、格式化全陨、缺少分號等)爆班。
refactor:: 代碼重構(gòu),既不修復(fù)錯誤也不添加功能辱姨。
perf:: 改進(jìn)性能的代碼更改柿菩。
test:: 添加確實測試或更正現(xiàn)有的測試。
build:: 影響構(gòu)建系統(tǒng)或外部依賴關(guān)系的更改(示例范圍:gulp雨涛、broccoli枢舶、NPM)懦胞。
ci:: 更改持續(xù)集成文件和腳本(示例范圍:Travis、Circle祟辟、BrowserStack医瘫、SauceLabs)。
chore:: 其他不修改src或test文件旧困。
revert:: commit 回退醇份。
范圍(scope)
可以為提交類型添加一個圍在圓括號內(nèi)的作用域,以為其提供額外的上下文信息吼具。例如 feat(parser): adds ability to parse arrays.僚纷。
BREAKING CHANGE
在可選的正文或腳注的起始位置帶有 BREAKING CHANGE: 的提交,表示引入了破壞性 API 變更(這和語義化版本中的 MAJOR 相對應(yīng))拗盒。 破壞性變更可以是任意 類型 提交的一部分怖竭。
示例
包含了描述以及正文內(nèi)有破壞性變更的提交說明
feat: allow provided config object to extend other configs
BREAKING CHANGE: extends
key in config file is now used for extending other config files
包含了可選的 ! 字符以提醒注意破壞性變更的提交說明
chore!: drop Node 6 from testing matrix
BREAKING CHANGE: dropping Node 6 which hits end of life in April
不包含正文的提交說明
docs: correct spelling of CHANGELOG
包含作用域的提交說明
feat(lang): add polish language
為 fix 編寫的提交說明,包含(可選的) issue 編號
fix: correct minor typos in code
see the issue for details on the typos fixed
closes issue #12
約定式提交規(guī)范
- 每個提交都必須使用類型字段前綴陡蝇,它由一個名詞組成痊臭,諸如feat或fix,其后接一個可選的作用域字段登夫,以及一個必要的冒號(英文半角)和空格广匙。
- 當(dāng)一個提交為應(yīng)用或類庫實現(xiàn)了新特性時,必須使用feat類型恼策。
- 當(dāng)一個提交為應(yīng)用修復(fù) bug 時鸦致,必須使用fix類型。
- 作用域字段可以跟隨在類型字段后面涣楷。作用有必須是一個描述某部分代碼的名詞,并用圓括號包圍狮斗,例如:fix(parser):
- 描述字段必須緊接在類型/作用域前綴的空格之后绽乔。描述指的是對代碼變更的簡短總結(jié)碳褒,例如:fix:array parsing issue
when multiplejspaces were contained in string。 - 在簡短描述之后骤视,可以編寫更長的提交正文鹃觉,為代碼變更提供額外的上下文信息专酗。正文必須起始于描述字段結(jié)束的一個空行后盗扇。
- 在正文結(jié)束的一個空行之后沉填,可以編寫一行或或多行腳注。腳注必須包含關(guān)于提交的元信息翼闹,例如:關(guān)聯(lián)的合并請求焊唬、Reviewer、破壞性變更斧拍、每條元信息一行蜀备。
- 破壞性變更必須標(biāo)示在正文區(qū)域最開始處关摇,或腳注區(qū)域中某一行的開始。一個破壞性變更必須包含大寫的文本BREAKING
CHANGE碾阁,后面緊跟冒號和空格输虱。 - 在BREAKING CHANGE:之后必須提供描述,以描述對 API 的變更脂凶。例如:BREAKING CHANGE:
enviroment variables now take precedence over cofig files宪睹。 - 在提交說明中,可以使用feat和fix之外的類型蚕钦。
- 工具的實現(xiàn)必須不區(qū)分大小寫地解析構(gòu)成約定式提交的信息單元亭病,只有BREAKING CHANGE 必須是大寫的。
- 可以在類型/作用域前綴之后冠桃,:之前命贴,附加!字符,以進(jìn)一步提醒注意破壞性變更食听。當(dāng)有!前綴時胸蛛,正文或腳注內(nèi)必須包含BREAKING
CHANGE: description
為什么使用約定式提交
- 自動化生產(chǎn) CHANGELOG。
- 基于提交的類型樱报,自動決定語義化的版本變更葬项。
- 向同事、公眾與其他利益關(guān)系者傳達(dá)變化的性質(zhì)迹蛤。
- 觸發(fā)構(gòu)建和部署流程民珍。
- 讓人們探索一個更加結(jié)構(gòu)化的提交歷史,以便降低對你的項目作出貢獻(xiàn)的難度盗飒。
cz-customizable
可自定義的Commitizen插件(或獨(dú)立實用運(yùn)行)可幫助實現(xiàn)一致的提交消息嚷量。
安裝 cz-customizable:
$ yarn add cz-customizable -D
復(fù)制代碼
向 package.json 添加新的 script:
{
“scripts” : {
…
“commit”: “./node_modules/cz-customizable/standalone.js”
}
}
在根目錄新建 .cz-config.js 并復(fù)制 cz-config-EXAMPLE.js 到文件。
效果:
commitlint
commitlint檢查您的提交消息是否符合conventional commit format逆趣。
1蝶溶、安裝 @commitlint/cli、husky:
$ yarn add -D @commitlint/cli husky
2、添加 git commit hooks 到 package.json:
{
…
“husky”: {
“hooks”: {
“commit-msg”: “commitlint -E HUSKY_GIT_PARAMS”
}
}
}
3抖所、安裝 commitlint-config-cz:
commitlint-config-cz 合并 cz-customizable 的配置 {types,scopes,scopeOverrides} 和 commitlint 的配置 {type-enum,scope-enum}梨州。這樣,你就可以在一個地方維護(hù) types 和 scopes田轧。
$ yarn add commitlint-config-cz -D
復(fù)制代碼
4暴匠、在 commitlint.config.js 中用 cz 擴(kuò)展您的 commitlint 配置:
module.exports = {
extends: [‘cz’],
rules: {
// must add these rules
‘type-empty’: [2, ‘never’],
‘subject-empty’: [2, ‘never’]
}
};
vscode commitizen
在 VS Code 中搜索裝 vscode commitizen,然后就可以擺脫命令行了傻粘,而且這個插件是和前面所有的配置兼容的每窖,效果如下:
GitHub Actions
新建一個 github workflow .github/workflows/commitlint.yml,作用是在提交 pull_request 時抹腿,檢查信息:
name: Lint Commit Messages
on: [pull_request]
jobs:
commitlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0 - uses: actions/setup-node@v1
with:
node-version: ‘10.x’ - run: npm install
- name: Add dependencies for commitlint action
G I T H U B W O R K S P A C E i s t h e p a t h t o y o u r r e p o s i t o r y r u n : e c h o " : : s e t ? e n v n a m e = N O D E P A T H : : GITHUB_WORKSPACE is the path to your repository run: echo "::set-env name=NODE_PATH::GITHUBW?ORKSPACEisthepathtoyourrepositoryrun:echo"::set?envname=NODEP?ATH::GITHUB_WORKSPACE/node_modules"
Now the commitlint action will run considering its own dependencies and yours as well ??
- uses: wagoid/commitlint-github-action@v2
standard-version
standard-version 是一款遵循語義化版本( semver)和 commit message 標(biāo)準(zhǔn)規(guī)范 的版本和 changelog 自動化工具岛请。通常情況線下,我們會在 master 分支進(jìn)行如下的版本發(fā)布操作:
git pull origin master
根據(jù) package.json 中的 version 更新版本號警绩,更新 CHANGELOG
git add .
git commit
git tag 打版本操作
git push --tags:push 版本 tag 和 master 分支到倉庫
其中 2崇败,3,4肩祥,5 是 standard-version 工具會自動完成的工作后室,配合本地的 shell 腳本混狠,則可以自動完成一系列版本發(fā)布的工作了。
安裝 & 使用
$ yarn add -D standard-version
// package.json
{
“scripts”: {
“release”: “standard-version”
}
}
First Release:yarn release --first-release
Cutting Release:yarn release
Release as a Pre-Release:yarn release --prerelease or yarn release --prerelease alpha
Release as a Target Type Imperatively (npm version-like):yarn release --release-as minor or yarn release --release-as 1.1.0将饺,可以合并 --prerelease以此方便發(fā)布實驗性特性
Prevent Git Hooks:yarn release --no-verify