Git Worktree
没有 worktree 应该在用户不知晓其位置、来源和退出方式的情况下被创建。没有 worktree 应该在用户未要求的情况下被删除。
此技能在三个点上优先于其他创建 worktree 的技能(例如 superpowers:using-git-worktrees):路径、名称和审批。其他技能其余的工作流仍然有效。
各代理的工具
| 操作 | Claude Code | Codex |
|---|---|---|
| 创建 | git worktree add + EnterWorktree(path: ...) 以移动对话 | git worktree add 并使用 git -C/workdir 在 worktree 中工作 |
| 隔离的子代理 | Agent 使用 isolation: "worktree"(创建于 .claude/worktrees/) | 不适用 |
| 退出 | ExitWorktree(action: "keep") | 返回到原始目录 |
| 报告 | pwsh -NoProfile -File "<此技能所在文件夹>/scripts/worktrees-report.ps1" | 同上 |
<此技能所在文件夹> 是此 SKILL.md 所在的目录。该脚本需要 PowerShell 7+ (pwsh)。
1. 创建之前
- 检查您是否已经在 worktree 中(
git rev-parse --git-dir与git rev-parse --git-common-dir不同,且不在子模块中)。如果是,请勿在未要求的情况下创建另一个。 - 在相关仓库中运行报告,并保存结果以供第 4 步使用:
pwsh -NoProfile -File "<此技能所在文件夹>/scripts/worktrees-report.ps1" -Path "<repo1>;<repo2>" - 使用以下模板制定计划,并为每个 worktree 展示一个区块:
如果仓库包含子模块(Worktree 计划 - 仓库: C:\repos\loja - 基础分支: origin/main @ 3f2a9c1(git fetch 已立即执行) - 新分支: claude/feat-login-google - 名称: feat-login-google - 绝对路径: C:\repos\loja\.worktrees\feat-login-google - 相对路径: .worktrees\feat-login-google - 操作: git -C "C:\repos\loja" worktree add "C:\repos\loja\.worktrees\feat-login-google" -b claude/feat-login-google origin/main - 删除: git -C "C:\repos\loja" worktree remove "C:\repos\loja\.worktrees\feat-login-google" git -C "C:\repos\loja" branch -d claude/feat-login-google.gitmodules),请在计划中说明删除时需要--force以及原因。 - 紧接着,显示报告表格,列出这些仓库中已打开的 worktree(Worktree、大小、分支、丢失内容)。如果没有任何 worktree,请用一行说明。
- 等待用户明确同意。 只有获得同意后才创建。在 Claude Code 中,插件的钩子在命令执行时会额外要求一次确认。在 Codex 中,规则
codex/rules/git-worktree.rules对git worktree add执行同样的操作。
对于并行的多个子代理,请展示包含所有 worktree 的单一计划,并只要求一次确认。
标准
- 路径: 在两种代理中均为
<仓库根目录>/.worktrees/<名称>。例外情况是 Claude Code 中使用isolation: "worktree"的子代理,它始终创建在.claude/worktrees/中;在这种情况下,请在计划中注明该路径。 - 忽略文件夹而不提交: 在创建之前,运行
git -C <repo> check-ignore -q .worktrees/x。如果该文件夹未被忽略,则将.worktrees/添加到仓库的info/exclude文件中(路径为git -C <repo> rev-parse --git-path info/exclude)。此文件是本地的,不会产生提交。请告知已执行此操作。 - 名称:
<类型>-<简短描述>,采用 kebab-case,长度不超过 40 个字符。示例:feat-login-google,fix-timeout-pagamento。 - 新分支:
<代理>/<名称>,即claude/feat-login-google或codex/feat-login-google。如果仓库有自己的分支约定(钩子、CONTRIBUTING、历史),请遵循仓库的约定,并说明是哪一种。 - 基础: 默认情况下,为用户在主检出中的当前分支。如果任务独立于该分支,则使用
origin/<默认分支>。请先执行git fetch并显示基础分支的短哈希值。
2. Worktree 报告
当用户要求列出或清理 worktree 时,以及在上述步骤 1.2 中使用。
pwsh -NoProfile -File "<此技能所在文件夹>/scripts/worktrees-report.ps1" [-Path "<根目录或仓库>;..."] [-Json] [-SkipSize] [-Depth 6]
- 没有
-Path时,脚本使用GIT_WORKTREE_ROOTS环境变量,或者(如果没有该变量)使用当前目录。如果用户指令(CLAUDE.md、AGENTS.md)定义了仓库根文件夹,请传递该文件夹。 - 该脚本为只读。它会找到仓库、子模块以及不在仓库文件夹内的松散 worktree。
- 如果用户要求快速运行,请使用
-SkipSize。当需要详细信息(前/后提交数、远程状态、合并情况、最后提交日期、结论和删除命令)时,请使用-Json。
显示脚本打印的表格,必须包含以下四列且按此顺序:
| 列名 | 内容 |
|---|---|
| Worktree | 绝对路径 |
| 大小 | 磁盘空间 |
| 分支 | worktree 的分支,或 (detached @ <hash>) |
| 丢失内容 | 无,或删除后丢失的内容列表:未提交的文件、仅存在于该 worktree 的提交、Git 忽略的文件(例如 .env)。构建文件夹(node_modules、bin、obj...)不计入 |
不要添加额外的列。详细信息仅当有助于决策时放在表格下方。
被视为丢失的内容:
- 已修改或新增但未提交的文件。
- 不在任何远程、当前分支或默认分支上的提交。
- 非构建相关的被忽略文件。
- 在已初始化的子模块中:未提交的文件和仅存在于其中的提交。
- 被锁定的 worktree(
git worktree lock)会显示(locked...),并且在未经确认的情况下不会被删除。 - 如果文件夹已不存在,该列显示
无(文件夹已不存在...)。使用git worktree prune解决。 - 局限性:squash 或 rebase 合并无法被检测到,因此这些提交会显示为丢失。如果用户说明 PR 已被合并,请在远程确认。
报告结束时,总结删除那些不丢失任何内容的 worktree 后可释放的空间。
删除命令
当用户要求删除,或要求提供命令时,请使用 -Json 中的 ComandosRemocao 字段。完全按照原样复制命令,按顺序并放在一个代码块中。不要凭记忆编写命令。该字段已处理了三个陷阱:
- 被忽略的文件: 如果有会丢失的被忽略文件(例如
.env、.superpowers/),前几个命令会将其复制到~/worktree-backup/<repo>/<worktree>。复制必须在删除之前进行:删除后,就没有什么可复制的了。 - 子模块: 如果 worktree 包含已初始化的子模块,则删除命令会附带
--force,因为 git 拒绝没有此选项的git worktree remove。在提供此命令之前,请确认在“丢失内容”列中子模块不丢失任何内容,或者用户已接受丢失。 - 分支: 最后,
git branch -d删除分支,仅在分支已合并时成功。
如果您自己执行,请一次运行一个命令,并在第一个错误处停止。
3. 任务完成时
- 如果 worktree 的工作已被合并(merge 或推送到远程),请提供准备好的删除命令。
- 如果没有,请说明缺少什么:commit、push、PR。
- 在 Claude Code 中,使用
ExitWorktree(action: "keep")退出,并且仅在接受确认后通过 git 删除。ExitWorktree(action: "remove")仅适用于由EnterWorktree在同一对话中创建的 worktree。
不更改的规则
- 除非用户要求,否则永远不要删除 worktree 或分支。一次只删除一个,并在最后重新运行报告。
- 除非已获得该特定 worktree 的明确确认,否则永远不要使用
git branch -D或ExitWorktree(discard_changes: true)。git worktree remove --force仅当 worktree 包含子模块(参见“删除命令”)且用户已看到会丢失什么时才使用。 - 在未展示计划并获得确认之前,永远不要创建 worktree。