现象
在 worktree 里 git merge origin/main,合并驱动直接崩:
Error: Cannot find module '/home/user/objectstack-issue-4796/scripts/git-merge-regen.mjs'
at Function._resolveFilename (node:internal/modules/cjs/loader:1383:15)
code: 'MODULE_NOT_FOUND'
而当时我的 worktree 是 objectstack-issue-4391,objectstack-issue-4796 早已不存在。
根因
merge.os-regen.driver 存在共享的 /home/user/objectstack/.git/config 里(linked worktree 共用同一份 config),而且存的是绝对路径:
$ git config --show-origin --get merge.os-regen.driver
file:/home/user/objectstack/.git/config node "/home/user/objectstack-issue-4793/scripts/git-merge-regen.mjs" %O %A %B %P
pnpm install 的 prepare 步骤(. prepare: git integration registered (merge.os-regen.driver))每次都把它重写成当前 worktree 自己的路径。于是在多 agent 并行的容器里:
- agent A 建 worktree、
pnpm install → 驱动指向 A 的 worktree;
- agent B 建 worktree、
pnpm install → 驱动被改指向 B;
- A 或 B 按规矩收尾删掉自己的 worktree(AGENTS.md 要求
git worktree remove)→ 驱动指向一个不存在的路径;
- 此后容器里所有 agent 的所有 merge,只要碰到
merge=os-regen 映射的文件,驱动就 MODULE_NOT_FOUND。
注意路径已经漂过至少两轮(报错里是 -4796,现在 config 里是 -4793),说明这不是偶发。
为什么值得单独记一笔
merge=os-regen 管的正是生成物基线(json-schema.manifest.json 等,#4675)。这些文件的合并语义是「不要文本合并,标记待重生成」。驱动一坏:
pnpm check:merge-driver 跑的是 --self-test(用 scripts/ 下的相对路径),PASS,照不出 config 里那条绝对路径已经悬空 —— 自检和真实调用路径不是同一条。
建议方向(未实施,留给接手的人定)
- 驱动命令改成相对仓库根的调用,或用
! shell 形式让 git 在当前工作树里解析(!node "$(git rev-parse --show-toplevel)"/scripts/git-merge-regen.mjs ...),这样它不再绑定到某个具体 worktree;
- 或者让
check:merge-driver 额外断言 merge.os-regen.driver 里的脚本路径当前可解析,坏了就红 —— 现在这条断言不存在。
复现
git config --show-origin --get merge.os-regen.driver # 看它指向哪个 worktree
ls "$(git config --get merge.os-regen.driver | sed 's/^node "//; s/" .*//')" # 大概率 No such file
出处
在 #4391(crypto.hash 退役)实施中撞到,与该单本身无关,按 Prime Directive #10 单独归档、不在那个 PR 里顺手改。
现象
在 worktree 里
git merge origin/main,合并驱动直接崩:而当时我的 worktree 是
objectstack-issue-4391,objectstack-issue-4796早已不存在。根因
merge.os-regen.driver存在共享的/home/user/objectstack/.git/config里(linked worktree 共用同一份 config),而且存的是绝对路径:pnpm install的 prepare 步骤(. prepare: git integration registered (merge.os-regen.driver))每次都把它重写成当前 worktree 自己的路径。于是在多 agent 并行的容器里:pnpm install→ 驱动指向 A 的 worktree;pnpm install→ 驱动被改指向 B;git worktree remove)→ 驱动指向一个不存在的路径;merge=os-regen映射的文件,驱动就 MODULE_NOT_FOUND。注意路径已经漂过至少两轮(报错里是
-4796,现在 config 里是-4793),说明这不是偶发。为什么值得单独记一笔
merge=os-regen管的正是生成物基线(json-schema.manifest.json等,#4675)。这些文件的合并语义是「不要文本合并,标记待重生成」。驱动一坏:git checkout origin/main -- <files>后整体重生成,没有出事;gen:schema报得出来)。一个坏掉的驱动把「有保护」变成「没保护」,而下一个 agent 未必会去读 merge 的 stderr。pnpm check:merge-driver跑的是--self-test(用scripts/下的相对路径),PASS,照不出 config 里那条绝对路径已经悬空 —— 自检和真实调用路径不是同一条。建议方向(未实施,留给接手的人定)
!shell 形式让 git 在当前工作树里解析(!node "$(git rev-parse --show-toplevel)"/scripts/git-merge-regen.mjs ...),这样它不再绑定到某个具体 worktree;check:merge-driver额外断言merge.os-regen.driver里的脚本路径当前可解析,坏了就红 —— 现在这条断言不存在。复现
出处
在 #4391(
crypto.hash退役)实施中撞到,与该单本身无关,按 Prime Directive #10 单独归档、不在那个 PR 里顺手改。