Skip to content

fix(safety): O123 L3 不再把普通 git commit/checkout/merge 误报为已修改(依赖 #117) - #122

Merged
QiaolongLi1201 merged 4 commits into
mainfrom
fix/o123-git-commit-l3
Oct 12, 2026
Merged

QiaolongLi1201 merged 4 commits into
mainfrom
fix/o123-git-commit-l3

Conversation

@QiaolongLi1201

@QiaolongLi1201 QiaolongLi1201 commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

O123(P1)普通 git commit 被 L3 误报「已被修改 .git/refs/heads/…」exit 9。人工实现,不走自举。

⚠️ 依赖 #117:本分支基于 #117 head 6f419e2b(同一文件 src/safety/protected-path-snapshot.ts)。#117 合入后会 rebase 到 main,diff 届时只剩本单一笔 commit。

根因

L3 快照监视 .git/HEAD 和 .git/refs/**。原来靠 filterExpectedGitMetadataChanges(command) 用正则 git\s+(commit|checkout|…) 匹配命令文本来丢弃 HEAD/refs 变化,所以:

  • git -c user.name=u commit --allow-empty(UX a5 复现)、git -C dir commit、脚本里提交,正则都匹配不上,导致 refs/heads/master 被报「已被修改」,exit 9;
  • 反过来,只要命令里出现了 git commit,HEAD/refs 上的任何变化都会被丢掉,包括 ref: ../x。

改法(QA 路径放行名单,按内容判,不看命令文本)

  • .git/HEAD、.git/refs/** 新内容是提交号(40/64 hex),或 ref: refs/<name>(不含 ..、.、空段、反斜杠、控制字符)时,算正常,不报。删除 loose ref(branch -d)也不报。
  • 照报(带原因):HEAD/ref 指向 refs/ 之外,例如 ref: ../x →「.git/HEAD 指向仓库外路径(不在 refs/ 下)」;内容既不是提交号也不是 refs 引用;被换成软链或目录;HEAD 被删除。
  • .git/refs 目录本身的 mtime 变化不报,类型变了(例如换成软链)照报。
  • filterExpectedGitMetadataChanges 不再丢弃带 reason 的异常变化。
  • 新增监视(原来没看):info/**、objects/info/alternates、objects/info/http-alternates、modules/*/config、worktrees/*/config。index、objects、logs、ORIG_HEAD、COMMIT_EDITMSG、packed-refs 和以前一样不监视。
  • hooks / config / config.worktree 的检测一行没放松;fix(safety): O103 pre-block dangling symlinks, curl/wget output, git core.hooksPath #115/O103 的事前拦截没动。
  • UX:hooks 写成「卡在:.git/hooks/x 被新增(git 钩子,会执行命令)」,中英文都有。混写时只点名名单外的路径。

测试

test/o123-git-commit-l3.spec.mjs(15 项):

  • A:git -c … commit --allow-empty、add+commit、checkout -b/merge/tag/branch -d、detached → 无变化
  • B:HEAD→../x、ref 里写垃圾、ref 换成指向仓库外的软链、提交后加 hook、提交+hooksPath、info/alternates/modules config → 照报
  • C:进程级 moss -p(zh/en):add+commit、-c commit --allow-empty、checkout -b + merge 都是 exit 0,末行没有「已被修改」;用脚本写 hooks/x、HEAD→../x、hooksPath 都是 exit 9,末行写出具体路径或键名
  • 撤修复变红:src 反应用后,15 项里 13 项失败
  • 回归:o117 / o101 / o103×2 / o108 / o94 / o97 / git-spawn 全绿;npm run check 绿;npm test 373 个文件全过(Node 22.16)

风险

  • 用非 git 方式往 ref 里写一个格式正确的提交号,不会再报(按 QA 口径,refs 在名单内)。
  • 新增监视 modules/*/config,git submodule 改它时会报(fail-closed)。

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@QiaolongLi1201
QiaolongLi1201 merged commit de60df8 into main Oct 12, 2026
8 of 12 checks passed
QiaolongLi1201 added a commit that referenced this pull request Oct 12, 2026
…-keys

fix(safety): O127 L3 follows linked-worktree .git file (exec keys no longer missed) [depends #117 #122]
QiaolongLi1201 added a commit that referenced this pull request Oct 12, 2026
@QiaolongLi1201
QiaolongLi1201 deleted the fix/o123-git-commit-l3 branch October 12, 2026 10:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant