在多个仓库上并行运行 Claude Code 会话

Grove 是一款 macOS 菜单栏应用和命令行工具,它为多仓库项目的每个功能提供独立的工作区(workspace),即一个目录,里面放着你选中的每个仓库的 git worktree,全部处于同一个分支。在这个目录中启动 Claude Code,它就能看到整个产品,并行的会话之间也不会因为分支而互相干扰。应用界面为英文。

它还会集中显示你在各个项目、各个账号下的 Claude Code 会话,并能把会话从一个 Claude 账号迁移到另一个账号。

下载 Grove GitHub 上的源代码

或者用 Homebrew 安装:

brew install --cask efim0v/tap/grove

免费开源(GPL-3.0) · macOS 26 或更高版本 · Apple 芯片
0.2.0 版,(更新日志) · 安装说明

Grove 的 Workspaces 界面,项目名为 acme-shop:五个工作区排成一棵树,其中一个已展开,显示 web-client 和 api-server 在 feat/checkout-redesign 分支上的 worktree,以及其中的两个 Claude Code 会话。
截图展示的是虚构的演示数据。

每个功能一个工作区:每个仓库的 git worktree,同一分支

当 Claude Code 能在一个目录里看到整个产品时,它的效果最好。而产品一旦拆分在多个仓库中,并行的会话就会在分支上互相绊脚:一个会话在服务端仓库里切换了分支,另一个正在开发别的功能的会话,看到的代码就突然不对了。

Grove 工作区是为一个功能准备的目录,里面放着你选中的每个仓库的 git worktree,全部处于同一个分支。Claude Code 在这个目录中启动,拥有整个产品的一份独立工作副本;其他会话无论做什么,都切换不了它脚下的分支。

# 在这里启动 Claude Code:
~/Workspaces/acme-shop/checkout-redesign/
├── web-client/     feat/checkout-redesign
├── api-server/     feat/checkout-redesign
└── server-config/  feat/checkout-redesign

git worktree 是什么

git worktree 是仓库的一个额外工作目录:它有自己的文件和自己检出的分支,同时与仓库共享历史记录和远程仓库。让每个 Claude Code 会话在各自的 worktree 中运行,就能并行开发:一个会话开发新功能的同时,另一个修 bug。Grove 工作区则在同一个目录下,一次为产品的所有仓库做到这一点。

New Workspace 表单:名称为 loyalty-points,分支 feat/loyalty-points 由模板 feat/{name} 生成,Fork from 设为 base branches,勾选了五个仓库,每个仓库都有自己的基础分支。
只需一个名字和一次点击:Grove 会在每个仓库中运行 git worktree add。

Grove 工作区与 claude --worktree 的区别

Claude Code 自带的 --worktree 会在你运行它的仓库中新建一个 worktree,并在其中启动会话。如果你的产品只有一个仓库,这可能就够用了。产品拆分在多个仓库中时,两者的区别如下:

claude --worktreeGrove 工作区
仓库你运行它的那个仓库你选中的每个仓库,放在同一个目录下
位置仓库根目录下的 .claude/worktrees/<name>/;要放到别处,需借助 WorktreeCreate 钩子,或自己运行 git worktree add默认是 ~/Workspaces/<project>/<name>,由模板决定
分支worktree-<name>由模板生成,默认是 feat/{name}
起点worktree.baseRef:fresh(远程的默认分支)或 head(你本地的 HEAD),不能指定某个分支。如果给出 pull request 的编号或 URL,worktree 就从该 pull request 开始。每个仓库各自的基础分支(取自 origin/HEAD 或手动设置),或另一个工作区的分支
未纳入 git 的文件.worktreeinclude 会复制被 git 忽略的文件,例如 .env你选定的文件(例如 CLAUDE.md),以链接或副本的形式放到工作区根目录或每个仓库中
初始化让 Claude 来做,或自己执行初始化步骤;WorktreeCreate 钩子可以接管创建过程每个仓库一个创建后钩子
清理退出时,如果未命名会话的 worktree 是干净的,就删除它,否则先询问你工作区会一直保留,直到你用 git worktree remove 删除。创建失败时,应用会询问是否回滚这次已经创建的内容。
账号—Resume as…、Migrate to…、Share

Claude Code 的相关信息来自它的 worktree 文档,于 2026 年 10 月 13 日核对。

按项目习惯设置工作区

  • 从正确的起点创建分支。每个仓库都从自己的基础分支开始(从 origin/HEAD 自动识别,或按仓库单独设置),也可以从另一个工作区的分支开始,因此工作区可以叠加。
  • 分支名由模板生成,默认是 feat/{name}。
  • 每个工作区都有共享文件。CLAUDE.md 等文件会以链接或副本的形式放进每个新工作区,放在根目录或每个仓库中。
  • 创建后钩子。每个仓库都可以在新建的 worktree 中运行自己的 shell 命令。
  • 启动默认值。每个项目都有默认的 Claude 账号、模型和 effort 级别。
  • 状态一目了然。每个工作区都会显示创建了多久、未提交的改动和其中的会话。
项目设置:工作区根目录、分支模板 feat/{name}、seed 文件、默认的 Claude 账号、模型和 effort 级别,各仓库的基础分支覆盖设置,以及创建后钩子。

跨项目、跨账号查看所有 Claude Code 会话(会话管理)

Grove 会找出你所有账号下、每个项目和工作区中的 Claude Code 会话,并显示哪些正在运行、哪些在等你回应、哪些已经关闭。在 Projects 界面上,点一下就能跳到正在运行的会话,无论它在 cmux 还是 Terminal.app 中。

  • 新建或恢复。在启动面板中选择账号、模型和 effort 级别,然后在 cmux 或 Terminal.app 中打开会话。
  • 按工作所在的位置分组:按项目、按工作区,每个会话都标出分支和账号。
Projects 界面:acme-shop 和 field-notes 两个项目,列出它们正在运行和等待中的会话,每个会话旁都有 Go 按钮。
各个项目及其中正在运行的会话。
项目的 Claude 标签页:会话及其状态、工作区、分支和账号,每个会话都有 Go 或 Resume 按钮。
一个项目的会话,正在运行的排在前面。

把 Claude Code 会话迁移到另一个账号

Claude Code 把每个账号放在单独的文件夹中:默认账号是 ~/.claude,你在 Grove 中添加的每个账号是 ~/.claude-accounts/<name>。会话不必一直留在最初启动它的账号上:比如某个账号的限额用完了,可以换你的另一个账号继续。

Resume as…
以另一个账号继续会话,不复制任何内容:关联账号通过 ~/.claude 共享会话文件夹。
Migrate to…
把会话复制到另一个账号(会话记录、记忆、文件历史、任务),即使该账号正在使用中也可以。
Share
把会话移入共享存储,每个关联账号都能看到它。
每个会话一个写入方
如果某次迁移会让一个会话同时有两个写入方,例如在一个账号下恢复仍在另一个账号下运行的会话,Grove 会拒绝执行。

具体步骤见指南《切换账号后继续同一个 Claude Code 会话》(英文)。

Accounts 界面:personal 账号标记为 canonical,下面是它的会话以及各自的模型和 effort 选择器;再往下是 work 账号,标记为 shared。

比 Claude Code 30 天清理保留更久的会话记录

Claude Code 会删除超过 cleanupPeriodDays 天的会话记录,默认是 30 天。Grove 在 ~/.claude/grove/transcripts/ 中为每份会话记录保留一个硬链接;如果某个账号中的会话记录不见了,无论是你删的还是 Claude Code 的清理删的,Grove 都会把它恢复。默认最多保留 90 天,总量上限 500 MB。

在 Settings → Transcript safety-net 中可以修改这两项限制,或关闭会话记录镜像。要彻底删除一份会话记录,请使用 Sessions 界面上的 Purge。

跨仓库的提交图与代码统计

Graph
每个仓库的提交图,包含分支、远程仓库和标签。可以从某个分支创建工作区,或在它的 worktree 中打开 Claude Code。
Stats
整个项目的代码行数,包括总量、语言分布,以及按仓库堆叠显示的历史增长。
Graph 标签页:web-client 仓库的提交图,包含功能分支、develop、origin/develop 和发布标签。
一个仓库的提交图。
Stats 标签页:整个项目共 137,850 行,分为代码和数据两部分,下方是按仓库堆叠的行数变化图。
五个仓库的代码行数。

grove 命令行:在终端或脚本中创建多仓库 worktree

命令行工具 grove 操作的是同样的工作区,提供 scan、workspaces、sessions、create、graph 和 doctor 命令,每个命令都支持 --json。

# 仓库及其 worktree
grove scan ~/code/acme-shop

# 项目的工作区,以树形显示
grove workspaces ~/code/acme-shop

# 用其中两个仓库创建工作区
grove create ~/code/acme-shop loyalty-points \
  --repos api-server,web-client

# 某个目录中的会话,以 JSON 输出
grove sessions ~/Workspaces/acme-shop/loyalty-points --json

# git、claude 和 cmux 都装好了吗?
grove doctor

命令行工具使用 Grove 的默认布局(工作区位于 ~/Workspaces/<project>/<name>,分支为 feat/<name>),而不是应用中各个项目自己的设置。

与其他工具的比较

能并行运行 Claude Code 的工具有很多。下面的信息来自各工具自己的网站或 README。

工具 简介 平台 每个任务的仓库 智能体 把会话迁移到另一个账号 许可证
claude --worktreeClaude Code 内置:在新的 worktree 中启动会话同 Claude Code当前仓库Claude Code—Claude Code 的一部分
ConductorMac 应用,在相互隔离的工作区中并行运行编程智能体;智能体也可以在云端沙盒中运行macOS、iOS未说明Claude Code、Codex、Cursor、OpenCode未说明未说明
Claude Squad基于 tmux 和 git worktree 的终端应用未说明;需要 tmux未说明Claude Code、Codex、Gemini、Aider 等未说明AGPL-3.0
Nimbalyst可视化的工作环境;任何会话都可以拥有自己的 worktreemacOS、Windows、Linux、iOS未说明Claude Code、Codex;OpenCode 和 Copilot 处于 alpha 阶段未说明MIT
Superset并行运行多个编程智能体,每个都有自己的 worktreemacOS、iOS;Linux 为实验性支持;暂不支持 Windows未说明任意 CLI 智能体未说明Elastic License 2.0(源码可用)
Emdash开源的智能体开发环境;并行任务各有独立的 worktreemacOS、Windows、Linux未说明25 种以上智能体未说明Apache-2.0
Vibe Kanban面向编程智能体的看板;其 README 称项目即将停止维护未说明未说明Claude Code、Codex 等未说明Apache-2.0
Worktrunk用于管理 git worktree 的 CLImacOS、Linux、Windows未说明Claude Code、Codex 等未说明MIT 或 Apache-2.0
ivarCLI:一个功能横跨多个仓库,一个分支、一份计划,每个仓库一个 PRmacOS、Linux多个,同一分支Claude Code、OpenCode、OMP未说明Apache-2.0
gw(nicksenap/grove)CLI:一个工作区文件夹,内含多个仓库在同一分支上的 worktreemacOS、Linux多个,同一分支不绑定特定厂商未说明MIT
claude-swap切换当前 Claude Code 账号的 CLI,可选配 macOS 菜单栏;能在触及限额前切换;带用量仪表盘Windows、macOS、Linux/WSL—Claude Code切换账号;当前会话可以继续MIT
cmux(可与 Grove 配合使用)面向 AI 编程智能体的 macOS 终端macOS—任意 CLI 智能体未说明GPL-3.0 或更高版本
Grove菜单栏应用和 CLI:多仓库工作区,跨账号的 Claude Code 会话macOS 26 或更高版本,Apple 芯片多个,同一分支启动并列出 Claude Code 会话;工作区就是普通目录Resume as…、Migrate to…、ShareGPL-3.0

于 2026 年 10 月 13 日核对。“未说明”表示该工具自己的页面或 README 中没有提到;“—”表示该列不适用于该工具。

以下情况,其他工具更合适:

  • 只有一个仓库:claude --worktree。
  • Windows 或 Linux:Emdash 或 Nimbalyst。
  • 在 Linux 上用命令行管理多仓库 worktree:ivar 或 gw。
  • 在一个窗口里使用多种不同的智能体 CLI:Claude Squad、Superset 或 Emdash。
  • 在触及限额前自动切换账号:claude-swap。
  • 围绕智能体打造的终端:cmux,Grove 也在其中打开会话。

Grove 适合拆分在多个仓库中的产品:你在 Mac 上用 Claude Code 开发它,无论用一个账号还是多个账号。

常见问题

Claude Code 怎么多开,又不让会话互相冲突?

给每个任务一份独立的工作副本,也就是一个 git worktree;Anthropic 在文档中为并行会话介绍的就是这种做法。如果产品拆分在多个仓库中,Grove 工作区会为每个仓库各放一个 worktree,全部在同一个分支上。在这个目录中启动 Claude Code 即可。

Claude Code 能同时处理多个仓库吗?

--add-dir 能让会话访问更多目录,permissions.additionalDirectories 则让这个设置持久生效。它授予的是文件访问权限,而且 Claude Code 不会读取这些目录中的大部分 .claude/ 配置。Grove 工作区则把每个仓库(已经切到该功能的分支)都放在 Claude Code 启动的目录下。详见指南《让 Claude Code 同时处理多个仓库》(英文)。

Grove 工作区和 claude --worktree 有什么区别?

见上面的表格。简单来说,--worktree 只涉及一个仓库,而工作区涵盖你选中的每个仓库,并且都在同一个分支上。

每个工作区的基础分支、分支名和文件夹都能自己选吗?

可以。每个仓库都有自己的基础分支,分支名由模板生成,工作区根目录也由模板设定。

CLAUDE.md 等共享文件怎么放进每个工作区?

在项目设置中把它们列为 seed 文件。Grove 会把每个文件以链接或副本的形式放进每个新工作区,放在根目录或每个仓库中。

切换账号后,怎么继续同一个 Claude Code 会话?

  • Resume as… 以另一个账号继续会话,不复制任何内容。
  • Migrate to… 把会话完整复制过去。
  • Share 把会话移入共享存储。

如果某次迁移会让一个会话有两个写入方,Grove 会拒绝执行。详见指南《切换账号后继续同一个 Claude Code 会话》(英文)。

切换账号会丢失会话历史吗?

关联账号通过 ~/.claude 共享会话文件夹,所以在一个关联账号下启动的会话,其他关联账号也能看到。凭据、设置和插件仍由各个账号分别保留。

Claude Code 的旧会话为什么不见了?能保留下来吗?

Claude Code 会删除超过 cleanupPeriodDays 天的会话记录,默认是 30 天。Grove 的会话记录镜像默认最多保留 90 天、500 MB,也可以关闭。

最多能同时运行多少个 Claude Code 会话?

Grove 本身不设上限。每个会话都会计入它所用账号的用量限额。Grove 按项目和工作区列出会话,并显示哪些正在运行、哪些在等你回应。

需要 cmux 吗?

推荐使用,但不是必需的。启动面板可以在 Terminal.app 中打开会话;其他启动或恢复会话的按钮(例如 Resume 和 Resume as…)会在 cmux 中打开会话。你也可以自己在任意终端里进入工作区,启动 Claude Code。

Grove 支持 Codex 或其他智能体吗?

工作区就是一个普通目录,你可以自己在里面启动任何 CLI 智能体。Grove 只负责启动、列出和迁移 Claude Code 会话。

能从另一个目录恢复会话吗?

可以。Grove 列出每个项目的会话,并在会话自己的目录中用 claude --resume 恢复它。

为什么 macOS 会阻止首次启动?

Grove 只做了 ad hoc 签名,没有经过 Apple 公证。在“系统设置 → 隐私与安全性”中点一次仍要打开即可;具体步骤见首次启动。

Grove 支持哪些 Mac?

搭载 Apple 芯片、运行 macOS 26 或更高版本的 Mac。

Grove 是免费开源的吗?

是的,采用 GNU GPL v3 许可证。0.2.0 及更早的版本以 MIT 许可证发布。

所需条件

你需要说明
搭载 Apple 芯片的 Mac,macOS 26 或更高版本
Claude Code 和 git
cmux(推荐)或 Terminal.app用于运行会话
在默认的 ~/.claude 中登录一个账号用于跨账号的 Resume as… 和会话记录镜像
Brow:在 MacBook 刘海中查看 Claude Code 额度(可选)安装了 Brow 时,Grove 会把 Brow 的浏览器路由脚本传给它启动的会话,这样登录页面会在该账号自己的浏览器配置文件中打开。

可搭配 cmux 或 Terminal.app 使用

Grove 是围绕 cmux 构建的:它把每个会话放在单独的 cmux 工作区中打开,点一下就能切换到正在运行的会话。Terminal.app 也能用:点击 New Claude、已关闭会话旁边的齿轮,或 Projects 界面上已关闭的会话时,会打开启动面板,其中有 Open in: Terminal 选项;Grove 也能把在 Terminal.app 中运行的会话调到前台。其他所有启动或恢复会话的按钮,例如 Resume、Resume as… 和 Add & log in,都会在 cmux 中打开会话。

工作区只是一个普通目录,所以你也可以自己在任何终端里进入它并启动 Claude Code。

安装 Grove

Grove 免费开源,需要搭载 Apple 芯片、运行 macOS 26 或更高版本的 Mac。

使用 Homebrew

菜单栏应用

brew install --cask efim0v/tap/grove

命令行工具 grove(按需安装)

brew install efim0v/tap/grove-cli

从发布页下载

从最新版本下载 Grove.zip,解压后把 Grove.app 移到 /Applications。发布页上还有命令行工具 grove-cli.zip 和 SHA256SUMS.txt。

校验下载的文件

shasum -a 256 -c --ignore-missing SHA256SUMS.txt

首次启动

Grove 只做了 ad hoc 签名,没有经过 Apple 公证,所以 macOS 会阻止首次启动。用 Homebrew 安装也一样,因为 Homebrew 会给 cask 下载的文件加上 macOS 的隔离标记。

  1. 从“应用程序”文件夹打开 Grove,macOS 会阻止它。
  2. 打开系统设置 → 隐私与安全性,找到关于 Grove 的提示,点击仍要打开,再点击打开确认。
  3. 点击菜单栏中的树形图标,打开 Settings,点击 Add project…,然后选择存放你各个仓库的文件夹。除非你修改模板,工作区都会创建在 ~/Workspaces/<project>/<name> 下。

也可以自己清除隔离标记,包括应用本身和通过浏览器下载的 grove 可执行文件:

xattr -dr com.apple.quarantine /Applications/Grove.app
xattr -d com.apple.quarantine grove

macOS 可能还会请求允许 Grove 控制 cmux 或 Terminal(系统设置 → 隐私与安全性 → 自动化)。

Grove 采用 GNU GPL v3 许可证;0.2.0 及更早的版本以 MIT 许可证发布。

Grove 会在你的 Mac 上改动什么

Grove 在 Claude Code 自己的文件夹里工作。下面列出了它在那里做的全部改动,以及如何撤销。

Grove 不会做的事。它不读取 Claude Code 的凭据;登录和限额是 Brow 的工作。它没有遥测,自己也不发出任何网络请求;它运行的 git 命令从不执行 fetch、pull 或 push。

每个账号的状态行

Grove 启动时,会把每个账号 settings.json 中的 statusLine.command 指向 ~/Library/Application Support/Grove/bin/ 中的一个小包装脚本。包装脚本把 Claude Code 发给状态行的内容(模型、上下文、费用)保存到该账号的 grove/usage/ 文件夹,再用同样的输入运行你原来的命令,所以你自己的状态行照常工作。

在 Accounts 界面上点击 monitoring 旁边的 Stop,就会恢复你原来的命令。

关联账号共享会话文件夹

在 Accounts 界面上点击 Link to shared store、共享该账号的某个会话,或第一次以另一个账号恢复会话时,账号就会被关联。之后,它的 file-history、tasks 和 session-env 文件夹,以及所涉及的每个工作区的 projects/<workspace>,都会变成指向 ~/.claude 内部的符号链接。

所有会被覆盖的内容都会先移到 <account>/grove-backup/。凭据、设置和插件永远不会共享。

Migrate to… 会写入另一个账号

除了会话本身的文件,Migrate to… 还会把以下内容合并到目标账号:.claude.json 中该项目的条目,settings.json 中的几个键(例如已启用的插件、模型和主题),以及源账号的插件。它从不覆盖目标账号中已有的内容。

会话记录镜像比 Claude Code 的清理保留更久

Grove 在 ~/.claude/grove/transcripts/ 中为每份会话记录保留一个硬链接;某个账号中的会话记录不见了,Grove 会把它恢复,包括你自己删除的。只要原文件还在,硬链接就不额外占用磁盘空间。镜像默认最多保留 90 天、500 MB 的会话记录。

要彻底删除一份会话记录,请使用 Sessions 界面上的 Purge。若想把保留策略交还给 Claude Code,请在 Settings → Transcript safety-net 中关闭 Keep a backup of every session,然后删除 ~/.claude/grove/transcripts/。

其他账号文件夹中的首次运行标记

在 ~/.claude 以外的账号文件夹中启动 Claude Code 之前,Grove 会在该文件夹的 .claude.json 里设置 hasCompletedOnboarding;如果该文件夹还没有主题,还会从 ~/.claude.json 复制你的主题。这样会话就不会打开 Claude Code 的首次运行设置。

Grove 自己的文件

~/Library/Application Support/Grove/ 中存放 Grove 的设置(config.json)、状态行包装脚本(bin/)和代码统计(stats/)。

工作区就是你仓库中普通的 git worktree 和分支。

如何撤销这些改动
  1. 在 Accounts 界面上,对每个账号点击 monitoring 旁边的 Stop。Grove 会放回它保存的状态行命令;如果原来没有,就删除这个键。
  2. 退出 Grove 并删除它:运行 brew uninstall --cask grove(命令行工具再运行 brew uninstall grove-cli),或者把 Grove.app 移到废纸篓。defaults delete dev.artemefimov.grove3 会删除它的偏好设置。
  3. 删除 ~/.claude/grove/(会话记录镜像和状态行数据)、其他每个账号文件夹中的 grove/ 文件夹,以及 ~/Library/Application Support/Grove/。只存在于镜像中的会话记录会随之一起删除。如果你还在用 Brow,请保留最后这个文件夹中的 oauth-usage-ledger.json,它属于 Brow。
  4. 关联账号没有 Grove 也能继续使用。删除 grove-backup/ 文件夹之前,请先看一遍里面的内容。
  5. 工作区会保留下来,因为它们就是 git worktree。要删除某个工作区,请在它的每个仓库中运行 git worktree remove,然后删除它的目录。

Brow 显示哪个账号还有余量

Brow 常驻在 MacBook 的刘海里,显示你所有 Claude 账号的用量限额。Grove 负责在账号之间转移工作,Brow 告诉你哪个账号还有余量。两者都可以单独运行,同时也是专为搭配使用而设计的。Brow 的指南(英文)介绍了如何在一台 Mac 上使用多个 Claude Code 账号。

Brow:在 MacBook 刘海中查看 Claude Code 额度 · GitHub 上的 Brow