claude-code-monorepo-single-key · ZH · 2026-10-26

在 monorepo 里用一把聚合站 key 开多个 Claude Code 窗口:并行会话怎么不互相踩

在同一个 monorepo 里同时跑多个 Claude Code 会话,冲突往往来自文件写覆盖和花费归属不清,而非 key 本身。本文给出目录约定、git worktree 隔离、后端与额度分配三类做法,让一把聚合站 key 支撑多条并行流而不互相踩。

问题的真实来源

很多人以为并行会话的问题是「一把 key 不够用」。实际上,聚合站的一把 key 本来就是为多模型、多会话设计的,真正会出问题的是下面三件事:

  • 工作目录重叠:两个会话在同一个 checkout 里改文件,git status 里混成一团,谁都说不清哪次改动属于谁。
  • 后端不分:所有会话都打同一个模型,排查问题时看不出哪条流在烧哪部分额度。
  • 花费无归属:月底看到一份总账单,无法回溯到具体任务。

下面按「目录 → 隔离 → 分配」的顺序处理。

一、把「一个仓库」拆成「一个入口 + 多个工作区」

monorepo 天然适合按包划分工作区。约定一条简单规则:每个并行的、有文件写入的会话,独占一个目录。

  • 只读类任务(问架构、找调用点、写文档草稿)可以共享主 checkout,因为它们不落盘。
  • 任何会产生提交的会话,都需要独立目录。
  • 目录名带上任务标识,例如 wt/payments-retry、wt/auth-cleanup,让 ls 一眼看出有哪些流在跑。

这条约定比任何工具都重要。先有「谁拥有哪个目录」的心智模型,工具才有意义。

二、用 git worktree 做文件级隔离

git worktree 是解决并行会话写冲突最直接的手段:它让同一个仓库的多个分支同时检出到不同目录,共享一份 .git 对象库,不重复克隆。

典型做法:

  • 主目录留在主分支,作为「看得见的基线」。
  • 每开一条并行流,就为它建一个 worktree 和对应分支。
  • 会话结束后合并或丢弃分支,再移除 worktree。

这样做的好处:

  • 两个会话改同名文件也不会互相覆盖,因为物理路径不同。
  • 各自的 git diff 只反映自己的改动,评审时边界清晰。
  • 依赖安装(如 monorepo 的包级缓存)可以按 worktree 复用,不必每处重建。

注意 worktree 不是沙箱:多个 worktree 共享同一份 .git,分支操作、stash、rebase 仍会互相影响。约定「每个 worktree 只操作自己的分支」即可。

三、后端按任务类型分配,而不是随机

聚合站的价值在于一个 key 可以调多个模型。并行会话时,把「用哪个模型」当成一项显式决策:

  • 重推理 / 架构设计:选长上下文、推理能力强的模型,通常也是单价较高的那一档。
  • 批量改写 / 机械重构:选成本更低的模型,把贵的额度留给真正需要的会话。
  • 工具调用密集的流:优先选函数调用稳定的模型,减少反复重试带来的额外消耗。

关键是在启动会话时就确定并记录,而不是在同一个终端里随手切换。这样当某条流出现异常花费时,你能对上号。

聚合站按官方价 ×1.3 扣费,这个倍率是统一的,不随模型变化。所以省钱的空间来自「选对模型档位」和「减少无效重试」,而不是靠切换渠道。

四、给每个会话一个可见的花费标签

一把 key 走所有会话,账单上是合并的。要做归属,靠的是外部记录,而非 key 本身:

  • 会话启动时,在终端标题或会话首条消息里写明任务名。
  • 在仓库根放一个轻量的 sessions.md 或 issue,登记「任务名 / worktree 路径 / 模型 / 开始时间」。
  • 结束时补一行结果,形成可追溯的流水。

这不精确到 token,但足以回答「哪个任务最费」这个实际问题。对大多数团队来说,这个粒度已经够用。

五、并发连接本身要注意什么

同一把 key 同时打多个会话,在服务端看起来就是多个并发请求。需要留意的是:

  • 不要把并发数开到远超自己实际处理能力的程度,否则你只是在制造排队和自己看不懂的失败率。
  • 遇到限流或超时,先看是不是某条流出错后进入重试循环——重试是并行场景里最常见的隐性花费来源。
  • 给每个会话设置合理的超时,失败要快速失败,而不是无限重试。

聚合站不改变底层模型的限流特性,它只是把多个提供方的入口统一到一把 key 上。所以限流策略仍取决于你选的那个模型。

六、一套可直接照做的流程

  1. 主 checkout 保持干净,只做只读探索。
  2. 为每个有写入的任务建 worktree 和分支,命名与任务一致。
  3. 在该 worktree 目录里启动会话,首条消息写明任务名与所选模型。
  4. 在 sessions.md 登记一行。
  5. 会话结束:合并或丢弃分支 → 移除 worktree → 补记结果。

按这套流程,一把聚合站 key 可以稳定支撑多条并行流:文件不互相覆盖,模型选择有据可查,花费有归属。真正需要管理的从来不是 key 的数量,而是目录边界和决策记录。

关于贡献 key 的一点补充

如果你同时在向聚合站贡献 key,注意返还是按官方价 ×1.1(优质 ×1.2)以 USDC 结算,与你自己使用时的 ×1.3 扣费是两条独立的账。并行会话只影响你的使用侧花费,不影响贡献侧的返还计算。把这两本账分开记,比混在一起看更清楚。