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 里顺手改。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions