Files
STM32F4-Base/docs/门禁说明/gitlint.md
T
wandering1 295eb9911f ci(gates): 覆盖率总闸与全量 cppcheck 移到远端 CI 强制(提交期实跑 48 根)
用户裁定 2026-10-28:慢钩子不再压在每个 git commit 上,由远端
CI 强制;本地等价入口 = scripts/ci_local.py 的 manual 段。

实测三根耗时:cppcheck 20.5 s、test-cppcheck 38.1 s、
test-coverage 105.2 s,合计 ~165 s ≈ 一次带代码提交耗时的
三分之二(test-coverage 的 files: 覆盖 App/,改一行就跑光 40 套)。

- .pre-commit-config.yaml:cppcheck / test-cppcheck /
  test-coverage 加 stages: [manual] + 理由注释;替换掉
  test-coverage 上方「没写 stages → 所有阶段都跑、输出出现两次」
  的旧坑注释(固定 manual 后不再有这一坑)。
- .gitea/workflows/ci.yml:static-gates job 在静态门禁步之后
  新增「手动阶段门禁(覆盖率总闸 + 全量 cppcheck)」步,
  if: always(),逐根 --hook-stage manual(pre_commit run 不支持
  多 id),日志 ci-artifacts/manual-stage.log + 归档 + STEP_SUMMARY,
  rc≠0 即失败;run 块纯 ASCII。
- scripts/ci_local.py:新增 MANUAL_STAGE_HOOKS 与 run_manual_stage()
  (静态段之后默认跑),删 run_coverage() 死代码,--coverage
  降级为兼容别名。
- AGENTS.md + 12 篇 docs/scripts/README:三数同源口径改为
  声明 51 / 提交期 --all-files 实跑 47 / +gitlint = 48,
  其余 3 根在 manual 阶段;历史测量数字只加「当时」不回改。

验证:pre-commit run --all-files = 47 Passed / 0 Failed rc=0;
manual 三根 Passed(test-coverage line 89.8% func 93.2% 41/41 套);
ci_local.py --static-only 全绿;check_doc_links --all
--sections-strict rc=0、mojibake / bom-drift / id-check-new rc=0;
ci.yml yaml.safe_load 通过。未改任何 .c/.h,故未跑 @build。
2026-10-28 23:04:59 +08:00

3.8 KiB
Raw Blame History

gitlint — 提交信息格式(commit-msg 阶段)

一句话:管提交信息长什么样:标题长度、正文行长度。内容真假、是否与 diff 相符,它一个字都不评。

  • 配置:官方 gitlint v0.19.1(repo: https://github.com/jorisroovers/gitlint),规则文件 .gitlint:ignore=body-is-missing、[title-max-length] line-length=100,其余用默认值。
  • 阶段:只在 commit-msg 跑(.pre-commit-config.yaml 顶部 default_install_hook_types: 显式装了 commit-msg)。

1. 它在查什么(本仓实际生效值)

项 生效值 来源
标题最大长度 100 字符 .gitlint 覆盖默认
正文每行最大长度 79/80 字符级(gitlint 默认 max-line-length) gitlint 默认
正文缺失 不检查 .gitlint 显式 ignore
标题结尾标点等 T 系列 默认 gitlint 默认

2. 为什么要它

  • 本仓的提交说明是主要载体:实测数据、基线只减不增的口径、负结果、为什么这么改,全写在正文 里。格式一炸(超长行在 git log / 网页里被硬切),这些内容就没人读得下去。
  • 两条本仓真踩过的坑,已固化进 AGENTS.md: ① 中文长标题极易超 100 → 标题保持短,细节写正文; ② 正文每行必须控制在 80 内,而且用 git commit -m 传长中文会被终端代码页转码破坏 → 一律"短标题 + git commit -F <UTF-8 无 BOM 文件>"。

3. 触发面 / 看不见什么

  • git commit、--amend、-F、合并生成的提交都会跑;--no-verify 连它和其它 47 个 pre-commit 阶段钩子一起跳过(stages: [manual] 的三根慢钩子(cppcheck / test-cppcheck / test-coverage)本来就不随提交跑,不受影响)。
  • 不校验:提交说明与 diff 是否相符、是否真的构建/测试过、是否夹带无关改动、是否该拆成多笔。

4. 报错怎么读

gitlint..............................................................Failed
  12: BBody line length limit exceeded, lengthy body line (max-line-length: 79)
  1: Title has trailing whitespace
  • 前缀数字是行号(第 1 行是标题)。本仓最常犯的是 B(正文行超长)与标题超 100。

  • 稳妥写法:正文落成 UTF-8 无 BOM、每行 ≤78 字符的临时文件,再 git commit -F;提交前自查 有没有超 80 的行(本目录作者在实践中就是先做这一步再提交)。

  • 典型报错(本仓最常撞的两条):标题超长(例:159 > 100)、正文单行超长(例:87 > 80)。

  • 口径是宽松:不强制 Conventional Commits、兼容中文标题;配置源是仓库根 .gitlint, 不是 hook args(改规则去改那个文件,不是在 yaml 里加 args)。

5. 好处

  • git log 在任何终端宽度都可读;长说明(含实测数字与踩坑)能完整留在历史里,这是本仓历史 可读性的基础设施。

6. 限制与盲区

  1. body-is-missing 被显式忽略 → 空说明也能过。信息质量完全靠自觉(本仓选择宽松,代价写在这里)。
  2. 只管格式:正文写满 40 行错误结论也照样过。
  3. 不追溯历史:--no-verify 用多了,历史里就永远留着不合规提交,事后无法自动补齐。
  4. 长度按字符数算,不是显示宽度:中英文混排 + 反引号时,"看着没到 80"仍可能超限。
  5. 它不看提交是否该拆(一次提交里混了代码 + 文档 + 配图,它不管)。

7. 豁免与基线 / 8. 改这个门禁本身

  • 无基线;放宽只能改 .gitlint。抬长度前先确认你要的不是"把长句拆短"。
  • 想加严(例如要求正文非空、要求带模块前缀):先在最近 20 条真实提交上试跑,别直接关闸。