commitlint 配置了 type-enum 为啥还是能提交不符合规范的 commit?

夏侯玉卿 阅读 22

我按照文档配了 commitlint 的 type-enum,只允许 feat、fix、docs 这几种类型,但 git commit 时写了个 typo: xxx 还是成功提交了,根本没报错。是不是哪里没生效?

我用的是 husky + commitlint 的组合,配置文件如下:

module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [2, 'always', ['feat', 'fix', 'docs']]
  }
};
我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
司空馨冉
配置本身没毛病,问题大概率出在 husky 那边——commit-msg 钩子没挂上,commitlint 根本没跑起来。

先检查你的 .husky 目录下有没有 commit-msg 文件,没有的话需要手动创建。husky v6 之后的版本配置方式变了,不再往 package.json 里写配置了。

在项目根目录执行这两步:

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


或者手动在 .husky 目录下新建 commit-msg 文件,内容如下:

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx --no-install commitlint --edit $1


别忘了给这个文件加上执行权限:

chmod +x .husky/commit-msg


这样配置完,再试下 git commit,不合规的提交就会被拦截报错了。

另外吐槽一句,你的 rules 配置可以稍微优雅一点,把类型抽出来维护,后面加类型不用改两遍:

const types = ['feat', 'fix', 'docs'];

module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [2, 'always', types]
}
};


这样后面如果想加 scope-enum 或者其他规则复用这个类型列表也方便。
点赞 1
2026-03-01 10:00