问题:开个分支要敲七遍命令
我桌面上有七八个仓库:blog、claude-code-skills、opencode……它们不在同一个 monorepo 里,而是各自独立的 git 仓库,散落在同一个目录下。
大多数人的项目不是"选择"了 polyrepo,而是自然就长成了 polyrepo。
想开一个 feature 分支做点事情,传统流程是这样的:
cd blog && git worktree add /tmp/feature/blog -b feature/login
cd ../opencode && git worktree add /tmp/feature/opencode -b feature/login
cd ../skills && git worktree add /tmp/feature/skills -b feature/login
# ... 还有四五个仓库
做完了还要一个一个删回去。七八个仓库,每次都是纯体力劳动。
如果你用 AI 编程工具,还有额外的问题:工作目录根目录下的 CLAUDE.md、.claude/ 这些上下文文件,到了新的 worktree 目录里就不存在了 —— Agent 丢失了所有指令和记忆。
aw 的解法
一条命令,批量检出整个工作区的新分支。
cd ~/projects
aw new --dir /tmp/my-feature -b feature/login
aw 扫描当前目录下的所有 git 仓库,对每个仓库执行 git worktree add,统一使用同一个分支名。完成后你得到一个完整的平行工作区:
每个 worktree 都是一个真实的 git 工作目录,有自己的分支,互不干扰。AI 上下文文件通过软链接共享,改一处处处生效。
做完了?
aw rm --force --branch
一条命令,所有 worktree 删除,分支清理,目录回收。
安装
# macOS (Apple Silicon)
curl -L https://github.com/lldxflwb/aw/releases/download/v0.1.0/aw-darwin-arm64 -o aw
chmod +x aw && sudo mv aw /usr/local/bin/
# 或者用 Go 安装
go install github.com/lldxflwb/aw@latest
单二进制,零依赖。macOS、Linux、Windows 都有预编译版本。
使用
创建工作区
cd ~/projects
aw new --dir /tmp/my-feature -b feature/login
实际输出:
Found 7 repos: blog, claude-code-action, claude-code-skills, opencode, rtk, sing-box-subscribe, surfboard
Target: /tmp/my-feature
Branch: feature/login
[blog] creating worktree → /tmp/my-feature/blog (branch: feature/login)
[blog] OK
[claude-code-action] creating worktree → /tmp/my-feature/claude-code-action (branch: feature/login)
[claude-code-action] OK
...
== workspace context ==
[link] CLAUDE.md
[link] .claude
== repo context ==
---
Done. 7/7 repos, 2 context links.
几秒钟,七个仓库全部检出到新分支,上下文文件自动链接。
看状态
cd /tmp/my-feature
aw status
REPO BRANCH STATUS AHEAD BEHIND LAST COMMIT
------------------ ------------- ------ ----- ------ ------------------------------------------
blog feature/login 1M 0 0 a300ba9 Add codex-plan blog post
claude-code-action feature/login clean 0 0 3428ca8 chore: bump Claude Code to 2.1.71
opencode feature/login clean 0 0 6f90c3d chore: update nix hashes
...
一眼看到所有仓库的分支、修改状态、ahead/behind。比挨个 cd 进去 git status 快多了。
清理
aw rm --force --branch
一键删除所有 worktree 和分支,清理 .aw/ 目录。不加 --force 会检查是否有未提交的修改,防止误删。--dry-run 可以先预览会删什么。
AI 上下文链接
批量 worktree 创建是 aw 的核心,上下文链接是锦上添花 —— 但确实很实用。
aw 会自动扫描并链接这些 AI 上下文文件:
CLAUDE.md、AGENTS.md、codex.md.claude/、.codex/、.cursor/、.cursorrulesaw.yml
两级链接:
- 工作区级 —— 源目录根下的上下文文件(如
~/projects/CLAUDE.md)链接到工作区根 - 仓库级 —— 各仓库内的上下文文件,只链接 git 未跟踪的。已跟踪的文件 worktree 里本来就有,不需要重复
这个设计意味着你可以在源目录随时修改 CLAUDE.md,工作区里的 Agent 立刻能看到最新内容。
Windows 兼容
Windows 默认不支持创建软链接(需要开发者模式或管理员权限)。aw 的处理方式是:
软链接失败时自动 fallback 到复制文件,并打印修复提示:
[warn] symlink failed for CLAUDE.md: ..., falling back to copy
[hint] to fix: enable Developer Mode (Windows Settings → System → For developers), then run 'aw relink'
开启开发者模式后,运行 aw relink 就能把所有复制文件升级为软链接。如果 relink 仍然失败,会自动恢复复制并提示具体原因。
设计决策
为什么用 git worktree 而不是 clone
git worktree 和源仓库共享 .git 数据库,不需要重新下载代码。创建一个 worktree 比 clone 快几个数量级,而且磁盘占用几乎为零。更重要的是,worktree 的分支和源仓库的分支是同一个 —— 不需要 push/pull 来同步。
为什么不用 monorepo
monorepo 需要全部代码在一个仓库里。现实中大多数团队的仓库是各自独立的,把它们合并成 monorepo 的成本远高于收益。aw 不改变你的仓库结构,只在需要时创建临时工作区。
workspace.json
每次 aw new 都会在工作区的 .aw/workspace.json 里记录完整状态:源路径、目标路径、分支名、所有仓库和上下文链接。aw rm 和 aw status 都依赖这个文件,不需要重新扫描或猜测。
–json 输出
所有命令都支持 --json,输出统一的 JSON 信封:
{"schema_version": 1, "ok": true, "data": {...}, "error": null, "warnings": []}
Exit code 也标准化:0 成功、1 部分失败、2 用法错误。这让 aw 天然适合被脚本、CI、MCP Server 等上层工具集成。
并发锁
写操作(aw new、aw rm)会在 .aw/lock 上加文件锁。Unix 用 flock,Windows 用 exclusive file。防止两个进程同时操作同一个工作区。锁超过 30 秒自动视为 stale 并回收。
限制
- aw new 不完全幂等:重复创建同名分支会被 git 拒绝,因为分支已存在。后续版本会检测已有分支并跳过
- 不支持嵌套 git 仓库:只扫描一级子目录,不递归
- 软链接在 Windows 需要额外操作:不是 bug,是 Windows 的限制,但 fallback + relink 的方案已经尽量平滑了
后续计划
- MCP Server —— 让 Agent 直接调用 aw 创建工作区
- Skill 集成 ——
/aw一键创建工作区并切换 Agent 工作目录 - aw.yml —— 配置文件,指定哪些仓库需要、哪些排除、上下文文件自定义
项目地址:aw