不立規(guī)矩,不成方圓。團(tuán)隊協(xié)作,規(guī)范很重要。
背景
git每次提交代碼都應(yīng)該寫上commit message,否則就不允許提交,一般來說寫commit message應(yīng)該清晰明了,能夠具體的說明
- 本次做了什么操作
- 操作的目的是什么
- 影響了什么范圍。
在日常開發(fā)中,大家的commit message千奇百怪,有中文的,有英文的,有圖標(biāo)的,各式各樣。這就導(dǎo)致了后續(xù)代碼維護(hù)成本變得特別大,有時候自己進(jìn)行代碼復(fù)盤都不知道之前的fix bug修改的到底是什么。基于以上的問題,希望在每次commit message提交的時候進(jìn)行規(guī)范校驗,讓規(guī)范更好的服務(wù)于質(zhì)量,一方面提升commit message的質(zhì)量,另一方面也提升后期代碼維護(hù)的效率。
這里使用git原生的hooks來實現(xiàn)commit監(jiān)聽,當(dāng)然也可以使用第三方如husky、pre-commit、commitizen(配合conventional-changelog-cli生成日志,配合cz-conventional-changelog 生成歷史)。
使用git hooks監(jiān)聽commit
在.git文件中可以看到有很多的鉤子,我們可以在項目根目錄下,打開終端輸入如下命令:
# 進(jìn)入git文件
cd .git
# 進(jìn)入鉤子文件
cd hooks
# 查看所有鉤子
ls -a
所有的鉤子如下圖:

image.png
這里只需要使用到
commit-msg鉤子,我們回到根目錄下,找到package.json文件,在最下面新增一個鉤子指令
{
"name": "項目名稱",
"version": "1.1.1",
"scripts": {
// 指令
},
"dependencies": {
// 依賴
},
"gitHooks": {
"commit-msg": "node ./git/index.ts"
}
}
編寫鉤子函數(shù)
根據(jù)指令指向的地址,創(chuàng)建一個git文件夾,在文件下新建一個index.ts文件,寫入如下內(nèi)容:
const chalk = require("chalk")
const msgPath = process.env.GIT_PARAMS
const msg = require("fs")
.readFileSync(msgPath, "utf-8")
.trim()
const commitRE = /^(revert: )?(create|fix|feat|chore|refactor|hotfix|revert|update|build|test|save)(\(.+\))?: .{1,50}/
chalk.level = 1
if (!commitRE.test(msg)) {
console.log()
console.log(
`${chalk.bgRed.white(" ERROR ")} ${chalk.bold.red(
`無效的commit提交格式`
)}\n\n` +
chalk.red(
`請遵循正確的格式提交. 例如: ` +
chalk.underline.red(`git commit -m "feat:完成游戲詳情"\n`)
)
)
console.table([
{
[chalk.cyan("注釋")]: "新建項目",
[chalk.cyan("commit:description")]: `create:創(chuàng)建 XXX項目`
},
{
[chalk.cyan("注釋")]: "修復(fù) bug",
[chalk.cyan("commit:description")]: `fix:修復(fù)XXXbug`
},
{
[chalk.cyan("注釋")]: "新增特性/完成XXXX",
[chalk.cyan("commit:description")]: `feat:新增特性XXXX`
},
{
[chalk.cyan("注釋")]: "改變構(gòu)建流程",
[chalk.cyan("commit:description")]: `chore:pull origin [分支名稱]`
},
{
[chalk.cyan("注釋")]: "重構(gòu)內(nèi)容",
[chalk.cyan("commit:description")]: `refactor:重構(gòu)XXXX`
},
{
[chalk.cyan("注釋")]: "緊急修復(fù)",
[chalk.cyan("commit:description")]: `hotfix:緊急修復(fù)XXXX`
},
{
[chalk.cyan("注釋")]: "回滾",
[chalk.cyan("commit:description")]: `revert:回滾XXX版本`
},
{
[chalk.cyan("注釋")]: "更新文檔",
[chalk.cyan("commit:description")]: `update:更新文檔`
},
{
[chalk.cyan("注釋")]: "打包項目",
[chalk.cyan("commit:description")]: `build:打包XXXX`
},
{
[chalk.cyan("注釋")]: "測試文件",
[chalk.cyan("commit:description")]: `test:測試XXXX`
},
{
[chalk.cyan("注釋")]: "暫存文件(保存進(jìn)度)",
[chalk.cyan("commit:description")]: `save:暫存XXXX`
}
])
console.log(
chalk.red(
`\ndescription:文字描述不得超過50個字符,推薦以動詞開頭:創(chuàng)建、修復(fù)、完成、修改、增加、更新等` +
`\n\nSee https://shimo.im/docs/uJRXiSTYx2UhfVG5/ for more details.\n`
)
)
process.exit(1)
}
接下來執(zhí)行g(shù)it指令檢驗鉤子
在終端輸入:
git commit -m "asdf"
最后看到結(jié)果:

image.png
小結(jié)
主要是利用git自帶的commit-msg鉤子監(jiān)聽自定義文件,實現(xiàn)commit校驗。