Skip to content

规则

基于 commitlint v21.0.2 / @commitlint/config-conventional 编写

速查

  • 规则写法:'rule-name': [level, applicable, value]
  • level0 关闭 / 1 警告 / 2 错误
  • applicable'always' 必须满足 / 'never' 绝不允许(反转)
  • 规则按部位分组:type-* / scope-* / subject-* / header-* / body-* / footer-* + 若干特殊规则
  • config-conventional 关键默认值:
    • type-enumbuild/chore/ci/docs/feat/fix/perf/refactor/revert/style/test
    • type-empty: neversubject-empty: never
    • type-case: lower-casesubject-casesentence/start/pascal/upper-case
    • subject-full-stop: never '.'(subject 不以句号结尾)
    • header-max-length: 72
    • body-leading-blank / footer-leading-blank(前导空行,通常 level 1)

规则三元组

每条规则都写成数组:

js
"type-enum": [2, "always", ["feat", "fix", "docs"]]
//            │      │              └─ value:比较值
//            │      └─ applicable:always / never
//            └─ level:0 关闭 / 1 警告 / 2 错误

applicablenever 会把判定反转。例如:

js
"subject-empty": [2, "never"]        // subject 绝不能为空
"subject-full-stop": [2, "never", "."] // subject 绝不能以 "." 结尾

type 相关

规则作用config-conventional 默认
type-enumtype 只能取枚举集合见下方列表,[2, always, [...]]
type-casetype 的大小写lower-case
type-emptytype 是否可空[2, never](不能空)
type-min-lengthtype 最小长度0
type-max-lengthtype 最大长度Infinity

type-enum 默认枚举:

js
["build", "chore", "ci", "docs", "feat", "fix",
 "perf", "refactor", "revert", "style", "test"]
bash
echo 'foo: some message' | npx commitlint   # 失败:foo 不在枚举
echo 'fix: some message' | npx commitlint   # 通过

scope 相关

规则作用默认
scope-enumscope 必须在允许列表内未限制
scope-casescope 大小写lower-case
scope-emptyscope 是否可空未强制
scope-delimiter-style多 scope 的分隔符风格
scope-min-length / scope-max-lengthscope 长度0 / Infinity

config-conventional 中 scope 是可选的——不写 scope 也合法(fix: x 通过)。需要限制时自己加 scope-enum

js
"scope-enum": [2, "always", ["api", "ui", "docs"]]

subject 相关

规则作用默认
subject-case禁止某些大小写形态sentence/start/pascal/upper-case
subject-emptysubject 是否可空[2, never](不能空)
subject-full-stopsubject 末尾字符[2, never, '.'](不以句号结尾)
subject-exclamation-marksubject 是否含感叹号
subject-min-length / subject-max-lengthsubject 长度0 / Infinity

subject-case 默认禁止「句首大写 / 全大写」等形态,必须小写开头:

bash
echo 'fix(scope): Some message' | npx commitlint  # 失败:sentence-case
echo 'fix(scope): some message' | npx commitlint  # 通过

header 相关

header 指首行整行(type(scope): subject)。

规则作用默认
header-case首行大小写lower-case
header-full-stop首行末尾字符[2, never, '.']
header-max-length首行最大长度72
header-min-length首行最小长度0
header-trim去除首尾空白
bash
# 失败:首行超过 72 字符
echo 'fix: some message that is way too long and breaks the line max-length by several characters' | npx commitlint
echo 'fix: some message' | npx commitlint   # 通过
规则作用默认
body-leading-blankbody 前须有空行通常 [1, always]
body-max-line-lengthbody 每行最大长度Infinity(约定式常设 100)
body-empty / body-case / body-full-stopbody 非空 / 大小写 / 末尾
footer-leading-blankfooter 前须有空行通常 [1, always]
footer-max-line-lengthfooter 每行最大长度Infinity(约定式常设 100)
footer-emptyfooter 是否可空

body-leading-blank / footer-leading-blank 落实 Conventional Commits「各部分之间用空行分隔」的排版约定。

特殊规则

规则作用
breaking-change-exclamation-mark校验 header 中 ! 与 footer 中 BREAKING CHANGE 的一致性
references-empty要求至少一个 issue 引用
signed-off-by要求包含 Signed-off-by:
trailer-exists要求存在指定 trailer(默认 Signed-off-by:

自定义示例

在沿用约定式规则的基础上微调:

js
export default {
  extends: ["@commitlint/config-conventional"],
  rules: {
    "scope-enum": [2, "always", ["a", "b"]], // 给了 scope 但不在列表内 → 报错
    "header-max-length": [2, "always", 100], // 首行放宽到 100
    "body-max-line-length": [0], // 关闭 body 行长限制
  },
};

完整规则索引以官方 Rules reference 为准。