多个 AI 代理共用同一个仓库
只要写入被仲裁,多个代理就能共用一个仓库:代理声明自己要动的路径,服务器把它们分配给它,并拒绝所有其他人,直到它释放为止。没有这层仲裁,第二个代理会在毫无提示的情况下抹掉第一个代理的工作。
会搞砸一切的那种情况
两个代理拿到两个都会碰同一个文件的任务。第一个读文件,想了二十秒,写入。第二个在第一个写入之前读到的是同一个版本,于是它直接写了上去。什么都没崩溃,什么提示都没有,第一个代理的工作凭空消失了。
只要代理数量超过一个,这种情况就不算少见,因为代理读得广、写得快。这也是几乎所有工具都选择隔离的原因:一个代理一台机器,一个代理一个分支。
其他产品的做法:每个代理一个 worktree
对这个问题最常见的回答是分区:给每个代理自己的 git worktree,一份完整的文件拷贝和独立索引,再想办法让各自的范围不重叠。Windsurf、Conductor 和 OpenHands 都是这么做的,大多数教程也这么推荐。
这样做有效,而且只有一个缺点:分区是一个承诺,不是一个保证。没有人真的核实范围是否重叠,一旦重叠了,要到合并的时候才会发现——那时两个代理都已经做完,已经没人记得当初的思路了。
占用机制,分三步
写入之前,代理先声明自己要动的路径。如果这些路径是空闲的,看板就分配给它;如果被占着,就拒绝。任何时刻,每个文件只有一个持有者。
工作过程中,一个观察者盯着磁盘上真正发生的写入,把每一次都归属到它的作者。落在别人占用路径上的写入会在落地前被拍下快照:之前的版本被保留下来,所以即使规则被绕开,也不会丢失任何东西。
结束时,代理释放自己的路径。文件立刻对下一个代理可用,不需要合并,因为从来就没有两个版本同时存活过。
屏幕上看到的是什么
每个窗口显示自己代理的工作过程,看板显示谁占着什么。你能看到一个代理在等,也能看到为什么。一个卡住的代理在造成损失之前就能被看见,这正是它和一条看不见的等待队列的真正区别。
人也一样能被看到。同一块画布上的多个人各自操作自己的代理,还能看到彼此带名字的光标。
什么时候这不是对的做法
如果你的任务真的互不相关,而且耗时很长,按机器隔离仍然合理:没什么需要仲裁,也没什么需要等待。当任务开始互相触碰——只要是在同一个功能上工作,几乎立刻就会发生——共享就更划算。对比页面 会逐个工具讲清楚这个选择。
直接回答
运行多个代理需要用 git worktree 吗?
这是大多数教程给出的答案,而且确实有效:每个代理一个 worktree,各自有自己的索引和文件,不会发生碰撞。代价始终一样:有多少代理就有多少份拷贝,结尾还要为每份拷贝合并一次。一个带文件占用机制的共享目录能同时省掉这两样,代价是代理有时要多等三十秒。
为什么不给每个代理一个分支?
这是常见做法,但它把成本挪到了最后。三个分支产生三次合并,冲突会在三个代理都做完之后才浮现,那时已经没人记得当初的思路了。共享目录会在冲突发生的那一刻就解决它。
如果一个代理不理会占用规则会怎样?
它没得选:这条规则由服务器强制执行,而不是提示模型自觉遵守。一个观察者监视实际的磁盘写入,把每一次写入归属到它的作者,而落在别人持有路径上的写入会在落地前被拍下快照,所以两个版本都还在。
同时能有多少个代理?
Pro 套餐五个代理窗口,更高的套餐更多。实际的限制不是机器,而是项目在某一时刻真正存在多少个互不依赖的活儿。