From 4ac869058dffe8688fd58a863b0dbc75913ea88f Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Sat, 24 Oct 2026 08:18:45 +0800 Subject: [PATCH] =?UTF-8?q?ci(gates):=20=E8=87=AA=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E5=B7=B2=E7=94=9F=E6=95=88=EF=BC=9B=E7=BA=A0=E6=AD=A3=E6=88=91?= =?UTF-8?q?=E8=87=AA=E5=B7=B1=E8=AF=AF=E8=AF=BB=E6=8F=90=E4=BA=A4=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E5=BE=97=E5=88=B0=E7=9A=84=E4=B8=A4=E6=9D=A1=E5=81=87?= =?UTF-8?q?=E7=BB=93=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 先说结论:**触发面含门禁自身是生效的**。只改 .pre-commit-config.yaml 的两个提交 (e327636、c4ca292)里 test-coverage 都实跑并 Passed(约 45 s、28 套),bsp-err 同样 实跑。上一提交写下的"改 files: 那次由旧配置管辖"是**我误读输出得到的假结论**, 已按事实改写;那条猜测当时被当成"实测语义"写进配置注释,正是本仓反复防的问题, 所以这一批先降级为"待证"、再判定、再落事实。 误读的机制(值得留档,因为它会让人系统性看错门禁状态):钩子没声明 stages: 就 默认属于**所有阶段**,于是同一次提交的输出里每根钩子出现两次——pre-commit 阶段 那一遍才可能实跑;commit-msg 阶段那一遍拿到的"文件"是提交信息文件,跟这些钩子的 files: 都不匹配,几乎必然 (no files to check)Skipped。我前几次都只 tail 了输出结尾, 看到的就是第二遍,于是连着误判了两次(第一次判成"自触发没生效",第二次为了自洽 又编出"旧配置管辖"这条规则)。同一批里 bsp-err 的表现也是同一成因。 判据写成一句话:**看某根钩子跑没跑,认它第一次出现的那行**,别读尾巴。已同时补到 pre-commit使用说明 §2.2 的通用机制表里(新增一行),配置注释里也留了实跑证据的提交号。 自查:本提交只改配置与一份机制文档(无代码改动,未跑 @build);提交自身会触发 test-coverage 实跑一遍作为回归;doc-links 与 id-check 见下条。未 push。 --- .pre-commit-config.yaml | 8 +++++--- docs/代码规范/pre-commit使用说明.md | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0234485c..ebe22627 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -608,9 +608,11 @@ repos: # 口径 / 分母 / 基线 / 盲区详解都在 docs/测试说明/主机单测覆盖率口径.md,本处只留接线事实。 # 触发面**含门禁自身**(.pre-commit-config.yaml):不带自身就等于谁改坏这根闸的 files: # 模式,它就再也不跑且无人察觉(同 lv-conf-sync / bsp-err 的既有做法)。 - # 待证(不要把下面三行当结论;本次提交就是判定实验,结果确定后改写):改 files: - # 的配置管辖**——所以"删掉自触发"这一刀会被旧配置拦住(旧模式仍含本文件,钩子照跑), - # 而新加的模式要等下一次提交才生效。方向正好是对的:加固会迟到一步,拆除不会漏网。 + # ⚠ 读输出的坑(2026-10-24 连踩两次才定位):本钩子没写 stages: → 默认属于**所有阶段**, + # 于是同一次提交的输出里它出现两次:pre-commit 阶段那一遍才可能实跑;commit-msg 阶段 + # 那一遍的"文件"是提交信息文件,几乎必然 (no files to check)Skipped。**只看输出结尾会 + # 把"实跑通过"读成"根本没跑"**——判它跑没跑要认**第一次**出现的那一行。 + # 实跑证据:只改本文件的提交(e327636 / c4ca292)里 test-coverage 与 bsp-err 都是 Passed。 - id: test-coverage name: 主机单测覆盖率(增量拦截:已覆盖行只增不减) entry: python scripts/check_test_coverage.py diff --git a/docs/代码规范/pre-commit使用说明.md b/docs/代码规范/pre-commit使用说明.md index 41c6637e..2f63426f 100644 --- a/docs/代码规范/pre-commit使用说明.md +++ b/docs/代码规范/pre-commit使用说明.md @@ -89,6 +89,11 @@ git commit | 机制 | 口径 | |---|---| | **两个阶段** | pre-commit 阶段 39 个钩子 + commit-msg 阶段 `gitlint`;`default_install_hook_types: [pre-commit, commit-msg]` 是显式声明的——换机后 `pre-commit install` 才会带上 commit-msg 钩子 | +| **一根钩子在输出里出现两次** | 未声明 `stages:` 的钩子**默认属于所有阶段**,pre-commit 与 commit-msg + 两遍都会列出它;第二遍的"文件"是提交信息文件,几乎必然 `(no files to check)Skipped`。**只看 + 输出结尾会把"实跑通过"读成"没跑"**——判某钩子跑没跑要认它**第一次**出现的那行(实测 + 2026-10-24:只改 `.pre-commit-config.yaml` 的提交里 `test-coverage` 与 `bsp-err` 都是 Passed, + 尾巴那一遍是 Skipped) | | **stash 陷阱** | pre-commit 跑钩子前会 stash 未暂存改动,钩子看到的是"没有你中间状态"的树。**改代码 + 同时更新基线/受管区的,必须先 `git add` 再跑钩子**,否则会拿到假报警(本仓踩过,`docs/门禁说明/bsp-err.md` §4 记了现场) | | **`always: true` 已废** | pre-commit 4.x 对 `local` 钩子里这个键**只告警 `Unexpected key(s)` 然后忽略** → "想总是跑"只能把 `files:` 写全(教训 → §5.5) | | **改写型与只读型的豁免不对称** | YAML 锚点 `&cubemx-generated` 只豁免 `trailing-whitespace` 与 `end-of-file-fixer`;`cppcheck` / `no-mojibake` / `cubemx-survival` / `task-table` / `mem-numbers` **仍覆盖** `Src/`、`Inc/` |