使用正则表达式本地拦截不规范的commit

1,943 阅读1分钟

当使用的 commit message 规范与通用的规范 <type>(<scope>): <subject> 有差异时,很难通过设定commitlint规则集进行拦截。本文提供了另一种可能性,通过在commitlint.config.js文件中使用正则表达式在本地进行拦截。

1. 准备工作

husky安装

$ tnpm install husky --save-dev

husky配置

在根目录下新建.huskyrc.js文件:

module.exports = {
  "hooks": {
    "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
  }
}

hooks中还可配置其他的钩子,具体请参考github.com/typicode/hu…

commitlint.config.js

module.exports = {
  rules: {
    'type-empty': [2, 'never'],
  },
  parserPreset: {
    parserOpts: {
      headerPattern: /(^\s*((feat|fix|docs|style|refactor|test|chore).*(--story=[0-9]{6,12}|--bug=[0-9]{6,12}|--task=[0-9]{6,12})|Merge).*)/,
      headerCorrespondence: ['type'],
    },
  },
};

在commit之前,husky会先根据headerPattern对commit message进行匹配,并将正则表达式匹配到的分组依次放入headerCorrespondence中,最终再根据rules的规则进行检查。

例如,对于上述配置文件,假设输入的 commit message 为 'feat: test --story=123456',那么根据正则匹配,将匹配到字符串的第一个分组 'feat: test --story=123456' 赋值给 type;若输入的 commit message 为 'feat: test --story=123',那么无法匹配到字符串,会为 type 赋值为null,type 为空时输出错误提示。

缺点

利用配置文件进行拦截非常方便,成本低,不足的地方是当输入的commit message不满足正则要求时,只会提示 type-empty 错误,无法定位到具体的错误位置。