You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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钩子,调整两个钩子的内容就行:

  1. 创建/修改.husky/commit-msg文件
    这个钩子是Git专门用来校验提交信息的,这里的${1}会正确指向保存你当前提交信息的临时文件,Commitlint就能准确读到你刚写的内容了:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx --no -- commitlint --edit ${1}
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:23:03