Commitlint 搭配 Husky 校验失败:校验历史提交信息而非当前提交信息
Commitlint 搭配 Husky 校验失败:校验历史提交信息而非当前提交信息
嘿,我看你这是踩了Commitlint和Husky配合的经典小坑啦——校验的是历史提交信息,不是你刚写的当前提交内容,我来给你捋清楚问题出在哪,以及怎么解决!
问题根源
你把Commitlint的校验逻辑放错钩子啦!你现在是在pre-commit钩子里面跑Commitlint,但这个钩子的触发时机是你执行git commit但还没输入提交信息的时候,这时候${1}根本没有对应当前提交信息的文件路径,Commitlint找不到正确的内容,就会默认去读历史提交的信息,自然就校验错了。
先给你看看你当前的配置,方便对照:
你的commitlint.config.js配置
module.exports = { extends: ['@commitlint/config-conventional'], rules: { 'type-enum': [ 2, 'always', [ 'build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', ], ], 'subject-empty': [2, 'never'], 'type-empty': [2, 'never'], }, };
你的.husky/pre-commit配置
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npx --no -- commitlint --edit ${1} echo "Running linting and fix..." npm run lint:fix git add .
解决方案
其实很简单,就是把Commitlint的校验移到专门负责提交信息校验的commit-msg钩子,调整两个钩子的内容就行:
- 创建/修改.husky/commit-msg文件
这个钩子是Git专门用来校验提交信息的,这里的${1}会正确指向保存你当前提交信息的临时文件,Commitlint就能准确读到你刚写的内容了:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npx --no -- commitlint --edit ${1}
- 调整pre-commit钩子
把里面的Commitlint命令删掉,只保留代码lint和暂存的逻辑就行:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" echo "Running linting and fix..." npm run lint:fix git add .
补个小科普:为啥之前会错?
pre-commit钩子的触发时机是在你执行git commit之后,但还没输入提交信息(不管是弹编辑器还是用-m参数)的时候,这时候Git还没生成保存当前提交信息的临时文件,${1}这个参数根本没有有效值,Commitlint找不到正确的文件,就会默认去读取最近一次的历史提交信息,自然就出现你遇到的“校验历史而非当前”的问题了。而commit-msg钩子是在你输入完提交信息、Git准备创建提交之前触发的,这时候临时文件已经生成,${1}就能正确指向它,Commitlint也就能拿到你刚写的提交信息啦。
备注:内容来源于stack exchange,提问作者Trimm Trabb
相关产品推荐
相关产品推荐

