使用git的commit-msg实现commit规范校验

不立规矩,不成方圆。团队协作,规范很重要。

背景

git每次提交代码都应该写上commit message,否则就不允许提交,一般来说写commit message应该清晰明了,能够具体的说明

  • 本次做了什么操作
  • 操作的目的是什么
  • 影响了什么范围。

在日常开发中,大家的commit message千奇百怪,有中文的,有英文的,有图标的,各式各样。这就导致了后续代码维护成本变得特别大,有时候自己进行代码复盘都不知道之前的fix bug修改的到底是什么。基于以上的问题,希望在每次commit message提交的时候进行规范校验,让规范更好的服务于质量,一方面提升commit message的质量,另一方面也提升后期代码维护的效率。

这里使用git原生的hooks来实现commit监听,当然也可以使用第三方如husky、pre-commit、commitizen(配合conventional-changelog-cli生成日志,配合cz-conventional-changelog 生成历史)。

使用git hooks监听commit

在.git文件中可以看到有很多的钩子,我们可以在项目根目录下,打开终端输入如下命令:


# 进入git文件
cd .git
 
# 进入钩子文件
cd hooks
 
# 查看所有钩子
ls -a

所有的钩子如下图:

image.png

这里只需要使用到commit-msg钩子,我们回到根目录下,找到package.json文件,在最下面新增一个钩子指令

{
  "name": "项目名称",
  "version": "1.1.1",
  "scripts": {
    // 指令
  },
  "dependencies": {
    // 依赖
  },
  "gitHooks": {
    "commit-msg": "node ./git/index.ts"
  }
}

编写钩子函数

根据指令指向的地址,创建一个git文件夹,在文件下新建一个index.ts文件,写入如下内容:

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:创建 XXX项目`
    },
    {
      [chalk.cyan("注释")]: "修复 bug",
      [chalk.cyan("commit:description")]: `fix:修复XXXbug`
    },
    {
      [chalk.cyan("注释")]: "新增特性/完成XXXX",
      [chalk.cyan("commit:description")]: `feat:新增特性XXXX`
    },
    {
      [chalk.cyan("注释")]: "改变构建流程",
      [chalk.cyan("commit:description")]: `chore:pull origin [分支名称]`
    },
    {
      [chalk.cyan("注释")]: "重构内容",
      [chalk.cyan("commit:description")]: `refactor:重构XXXX`
    },
    {
      [chalk.cyan("注释")]: "紧急修复",
      [chalk.cyan("commit:description")]: `hotfix:紧急修复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("注释")]: "暂存文件(保存进度)",
      [chalk.cyan("commit:description")]: `save:暂存XXXX`
    }
  ])
  console.log(
    chalk.red(
      `\ndescription:文字描述不得超过50个字符,推荐以动词开头:创建、修复、完成、修改、增加、更新等` +
      `\n\nSee https://shimo.im/docs/uJRXiSTYx2UhfVG5/  for more details.\n`
    )
  )
  process.exit(1)
}

接下来执行git指令检验钩子
在终端输入:

git commit -m "asdf"

最后看到结果:


image.png

小结

主要是利用git自带的commit-msg钩子监听自定义文件,实现commit校验。

你可能感兴趣的:(使用git的commit-msg实现commit规范校验)