开发中如何统一git commit规范,对项目的开发和维护以及问题的回溯都很有效果,接下来看看如何实现commit信息规则的校验

commitlint校验commit信息

多人协作开发的时候,友好的commit信息对于项目开发人员来说非常重要,这时候commitlint就派上用场了,commitlint是来检测提交信息的格式是否符合规范

常用的commitlint模版

type(scope?): subject
body?
footer?

多个作用域

commitlint支持多个作用域,常用的分隔符选项有

"/"
"\"
","

commit规范的制定和使用

我们不仅可以使用社区的规范 @commitlint/config-conventional ,也可以自定义规范

常用的社区commit规范有

社区规范引入方法,在项目根目录下新建 commitlint.config.js 文件

// commitlint.config.js
module.exports = {
  extends: ['@commitlint/config-conventional'], // => commitlint/config-conventional
};

也可以使用自定义规范,通过相对路径引入

// commitlint.config.js
module.exports = {
  extends: ['./config.js'], // => ./config.js
};

自定义commit规则的配置如下 

// config.js

module.exports = {
  /*
   * 继承自@commitlint/config-conventional@commitlint/config-conventional
   */
  extends: ['@commitlint/config-conventional'],
  /*
   * 使用@commitlint/format格式化
   */
  formatter: '@commitlint/format',
  /*
   * 重新自定义校验规则
   */
  rules: {
    'type-enum': [2, 'always', ['foo']],
  },
  /*
   * 排除校验情况
   */
  ignores: [(commit) => commit === ''],
  /*
   * commitlint默认排除规则
   */
  defaultIgnores: true,
  /*
   * 展示commit错误求助链接,配置无效
   * commitlint --help-url="https://www.baidu.com"
   */
  helpUrl:
    'https://github.com/conventional-changelog/commitlint/#what-is-commitlint',
  /*
   * 提示输入
   */
  prompt: {
    messages: {},
    questions: {
      type: {
        description: 'please input type:',
      },
    },
  },
};

相应的规则链接

灵活的自定义检测插件

由于官方的检测规则有点死板,有时需要更加灵活的限制,可以通过commitlint插件来解决,首先安装依赖 commitlint-plugin-function-rules 

npm install --save-dev commitlint-plugin-function-rules

修改 commitlint.config.js 文件

module.exports = {
  // extends: ['@commitlint/config-conventional'],
  plugins: ['commitlint-plugin-function-rules'],
  rules: {
    'header-max-length': [0],
    'function-rules/type-enum': [
      2,
      'always',
      (parsed) => {
        if (!['AA', 'BB'].includes(parsed.type)) {
          return [false, '必须以JIRA号(AA/BB)作为开头'];
        }
        return [true];
      },
    ],
  },
};

自定义commit模板

官方自带的模版必须是以 : 规范来写commit信息的,如果我们想自定义commit模板,可以通过 parserPreset 配置来实现,例如以空格为分割符,可以这样实现

parserPreset: {
  parserOpts: {
    headerPattern: /^([feat|hotfix].*)\s(.*)/,
    headerCorrespondence: ['type', 'subject']
  }
},

husky使用

husky可以在git commit的钩子处理相关的操作,比如执行单元测试,代码lint,代码commit检测等。使用方法如下

npm install husky --save-dev

在根目录下执行

npm set-script prepare "husky install"
npm run prepare

比如新增一个 pre-commit 钩子,执行单元测试

npx husky add .husky/pre-commit "npm test"
git add .husky/pre-commit

比如新增一个 commit-msg 钩子,执行commit信息格式检测

npx husky add .husky/commit-msg "npx commitlint --edit $1"

至此,就可以实现在git commit时进行commit信息的格式检测

相关资料