fix(executor): node_modules 软链写入仓库本地 exclude,杜绝被提交进历史

上一版软链修复有回归:.gitignore 的 `node_modules/`(带斜杠)只匹配目录不匹配软链,
导致 agent 的 `git add -A` 把 `node_modules -> /abs/path` 软链提交进分支,泄露本机绝对路径
(code review + 安全审计已正确 reject)。改为建软链前先把 node_modules 写进共享
<repo>/.git/info/exclude(git 的 info/exclude 取 common dir,worktree 也读它;untracked、幂等、
不动 tracked 的 .gitignore)。测试加回归断言:git add -A 后软链不出现在 status。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-13 09:18:18 +08:00
parent 217eb6aa1f
commit fcca3f95e0
2 changed files with 34 additions and 2 deletions
+5
View File
@@ -100,6 +100,11 @@ test('worktree:主仓有 node_modules 时软链进 worktree(让 .bin/tsc 等
assert.equal(readlinkSync(link), join(repo, 'node_modules'), '软链应指向主仓 node_modules');
assert.ok(existsSync(join(link, '.bin', 'tsc')), '经软链可解析到 .bin/tsc');
// 关键回归:软链绝不能被 git 收录(否则把本机绝对路径提交进历史)
gitSync(wt.dir, ['add', '-A']);
const staged = gitSync(wt.dir, ['status', '--porcelain']);
assert.ok(!staged.includes('node_modules'), `node_modules 软链不应被 git add 收录:${staged}`);
// remove 不应误删主仓 node_modules(软链被移除,目标保留)
await removeWorktree(repo, wt.dir);
assert.ok(existsSync(join(repo, 'node_modules', '.bin', 'tsc')), '主仓 node_modules 不受 remove 影响');