当使用的 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 错误,无法定位到具体的错误位置。