--- title: "Worktree 隔离" description: "多 Agent 并行工作时,共享同一目录会导致冲突。Git worktree 提供文件系统级隔离,让每个 Agent 拥有独立的工作空间。" keywords: ["Worktree", "git worktree", "文件隔离", "多 Agent 隔离", "并行安全"] --- ## 核心问题 多 Agent 并行工作时,共享同一工作目录会导致三类冲突: 1. **写入冲突**:两个 Agent 同时编辑同一个文件,后写的覆盖前写的 2. **状态干扰**:Agent A 的测试依赖某个环境状态,Agent B 的修改破坏了它 3. **不可区分**:半完成的修改混在一起,无法分辨哪些是哪个 Agent 的 Git worktree 是 git 原生的解决方案——在同一个仓库中创建多个独立工作目录,每个在自己的分支上。 ## 目录结构 ``` / ├── .claude/ │ └── worktrees/ │ ├── fix-auth-bug/ ← Agent A 的独立工作空间 │ │ └── .git ← 指向主仓库的链接 │ └── add-dark-mode/ ← Agent B 的独立工作空间 │ └── ... ├── src/ ← 主工作目录(不受影响) └── .git/ ← 主仓库 ``` 每个 worktree 是一个完整的文件系统视图,但共享同一个 git 历史。Agent 在自己的 worktree 中修改文件,不会影响主分支或其他 Agent。 ## 创建与恢复 ### 创建流程 ``` 检查是否已在 worktree 中(防嵌套) → 生成 slug → 创建 worktree → 切换进程工作目录 ``` **设计细节**: - 分支名遵循 `worktree/` 格式,slug 有严格的字符限制 - 创建后自动更新进程状态——所有后续文件操作自动在 worktree 中执行 - 系统提示和 CLAUDE.md 被重新加载,确保 AI 看到 worktree 中的上下文 ### 快速恢复路径 如果目标 worktree 已存在,直接读取指针文件获取 HEAD SHA——纯文件 I/O,无子进程。在大仓库中 `git fetch` 可能需要 6-8 秒,这个优化将恢复延迟降到接近 0。 **设计洞察**:恢复(resume)是比创建更频繁的操作。用户可能中断后重新开始,或者 Agent 在之前的 worktree 上继续工作。优化恢复路径比优化创建路径更有价值。 ### Hook 优先架构 如果用户配置了 `WorktreeCreate` hook,系统完全不调用 git,而是执行 hook 命令获取路径。这允许非 git 版本控制系统(如 Pijul、Mercurial)通过 hook 接入隔离机制。 ## 退出与清理 退出支持两种策略: | 策略 | 行为 | 适用场景 | |------|------|---------| | **keep** | 保留 worktree 和分支 | 后续需要合并或审查 | | **remove** | 删除 worktree 和分支 | 确认不再需要 | ### Fail-closed 安全防护 删除操作有多层安全防护: 1. 只允许删除通过 EnterWorktree 创建的 worktree(手动 `git worktree add` 的不会被删) 2. 有未提交文件或新提交时,拒绝删除(除非显式 `discard_changes: true`) 3. git 命令失败时,返回"未知"状态,拒绝删除 **设计哲学**:宁可让用户手动处理废弃的 worktree,也不冒险丢失工作。磁盘空间比丢失代码便宜得多。 ### 重新计数 validateInput 和实际执行之间可能有新的修改。删除前重新计数变更,确保不会误删。 ## 与子 Agent 的联动 子 Agent 的 `isolation: "worktree"` 参数自动在独立 worktree 中运行。子 Agent 的 worktree 管理与用户会话略有不同: | 维度 | 用户会话 | 子 Agent | |------|---------|---------| | Session 状态 | 完整持久化 | 无 session 状态 | | 清理策略 | 手动退出 | 自动清理(无变更则删除) | | 有变更时 | 用户决定 | 保留 worktree,返回路径 | **设计考量**:子 Agent 的 worktree 不需要用户手动管理——如果 Agent 没有产生任何修改,worktree 被自动清理;如果有修改,保留下来供主 Agent 后续合并。 ## Sparse Checkout 优化 大型 monorepo 中,完整检出可能需要数十秒。Sparse checkout 只检出特定目录,将创建时间降到几秒。 ## 接下来 - **子 Agent** — 理解使用 worktree 隔离的子 Agent 创建 - **协调者与蜂群** — 理解多 Agent 的高级编排 - **权限模型** — 理解工具权限的安全体系