使用git的commit-msg實現(xiàn)commit規(guī)范校驗

不立規(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校驗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容