用途:在启用了 commitlint 的仓库中撰写符合其强制约定的 Git 提交信息。commitlint 会按仓库配置(通常是 Conventional Commits)校验提交信息,配置即契约,写消息前应先读取配置,被拒绝时以错误输出为准。
识别是否使用 commitlint:仓库根目录存在 .commitlintrc、.commitlintrc.{json,yaml,yml,js,cjs,mjs,ts,cts,mts} 或 commitlint.config.{js,cjs,mjs,ts,cts,mts};package.json 中有 commitlint 字段;或存在运行 commitlint 的 commit-msg 钩子(如 .husky/commit-msg、lefthook.yml、.git/hooks/commit-msg)。
读取规则:运行 npx commitlint --print-config json。若退出码非零,说明配置本身有问题(如 extends 无法解析),应查看 stderr 错误而非猜测。规则对象中每条规则为 [severity, applicability, value]:severity 0 禁用、1 警告、2 错误(仅错误会阻止提交);applicability 为 always 表示条件必须成立,never 表示必须不成立;value 为参数。关键规则包括 type-enum(允许的类型)、scope-enum(允许的范围,空列表表示任意)、scope-empty([2,"never"] 表示必须写 scope,[2,"always"] 表示禁止)、subject-case、subject-full-stop、header-max-length、body-leading-blank、body-max-line-length。缺失或禁用的规则不强制。不确定时可用保守基线:类型小写、结尾无句号、首行 72 字符以内(config-conventional 允许至 100)。注意无配置运行 commitlint 会报空规则错误,不会回退到默认约定。
撰写格式:type(scope): subject,scope 可选,除非 scope-empty 为 [2,"never"]。示例:feat(parser): add support for inline issue references。正文与主题之间空一行,正文行遵守 body-max-line-length。
提交前校验:用 printf 将完整消息(含正文)通过管道传给 npx commitlint,退出码 0 且无输出即通过;正文规则也会被检查。
被钩子拒绝时:错误输出会在方括号中列出违反的规则,只修复被点名的规则,其余保持不变,再通过 stdin 重新校验后重试提交。切勿使用 git commit --no-verify 绕过钩子。