Skip to content

merge.os-regen.driver 指向「上一个装过依赖的 worktree」的绝对路径 —— 该 worktree 一删,全容器的生成物合并驱动就坏了 #4868

Description

@os-zhuang

现象

在 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 并行的容器里:

  1. agent A 建 worktree、pnpm install → 驱动指向 A 的 worktree;
  2. agent B 建 worktree、pnpm install → 驱动被改指向 B;
  3. A 或 B 按规矩收尾删掉自己的 worktree(AGENTS.md 要求 git worktree remove)→ 驱动指向一个不存在的路径;
  4. 此后容器里所有 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 里顺手改。

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions