Community编程与开发github.com

git-worktree

使用前创建、进入或移除 git worktree(git worktree add、EnterWorktree、带有 isolation "worktree" 的子代理、其他技能请求的 worktree),以及当用户想列出已打开的 worktree 或了解哪些可以删除时使用。它会展示计划并等待批准后再创建,为每个 worktree 生成带有结论的报告,并在任务结束时提出清理建议。

git-worktree 是什么?

Git Worktree 是一项专门用于管理 Git worktree 的 AI 代理技能,支持 Claude Code 和 Codex 平台。它的核心原则是:没有用户在位置、来源和退出方式上的认知,任何 worktree 都不应被创建;没有用户明确要求,任何 worktree 都不应被删除。该技能在创建 worktree 时具有优先级,可覆盖其他技能(如 `superpowers:using-git-worktrees`)中关于路径、命名和审批的逻辑,同时保留其余工作流。 技能提供了完整的 worktree 生命周期管理:创建前,它会自动检查当前是否已在 worktree 中,运行报告(`worktrees-report.ps1` 脚本,需要 PowerShell 7+)以展示现有 worktree 的状态,然后制定包含仓库路径、基础分支、新分支、名称、绝对/相对路径、创建命令和删除命令的详细计划,并在获得用户明确批准后才执行创建。对于并行子代理场景,会合并为一个计划并只需一次确认。 报告功能用于列出和清理 worktree,默认输出四列表格(Worktree、大小、分支、丢失内容),支持 `-Json` 参数获取详细信息(如 ahead/behind 提交、远程状态、合并情况、最后提交日期、结论和删除命令)。删除命令自动处理三种陷阱:备份丢失的忽略文件(如 `.env`)、为有初始化子模块的 worktree 添加 `--force`、以及最后删除分支。报告最后会总结删除无丢失 worktree 后可释放的空间。 技能还包含严格的不变规则:未经用户请求绝不删除 worktree 或分支(每次只删除一个,并在完成后重新运行报告);绝不使用 `git branch -D` 或 `ExitWorktree(discard_changes: true)` 而未获得特定 worktree 的明确确认;绝不在展示计划并获批准前创建 worktree。

兼容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/vitorpadovan/gitworktree-skill/tree/main/skills/git-worktree

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Git Worktree

没有 worktree 应该在用户不知晓其位置、来源和退出方式的情况下被创建。没有 worktree 应该在用户未要求的情况下被删除。

此技能在三个点上优先于其他创建 worktree 的技能(例如 superpowers:using-git-worktrees):路径、名称和审批。其他技能其余的工作流仍然有效。

各代理的工具

操作Claude CodeCodex
创建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. 创建之前

  1. 检查您是否已经在 worktree 中(git rev-parse --git-dir 与 git rev-parse --git-common-dir 不同,且不在子模块中)。如果是,请勿在未要求的情况下创建另一个。
  2. 在相关仓库中运行报告,并保存结果以供第 4 步使用:
    pwsh -NoProfile -File "<此技能所在文件夹>/scripts/worktrees-report.ps1" -Path "<repo1>;<repo2>"
    
  3. 使用以下模板制定计划,并为每个 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 以及原因。
  4. 紧接着,显示报告表格,列出这些仓库中已打开的 worktree(Worktree、大小、分支、丢失内容)。如果没有任何 worktree,请用一行说明。
  5. 等待用户明确同意。 只有获得同意后才创建。在 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 字段。完全按照原样复制命令,按顺序并放在一个代码块中。不要凭记忆编写命令。该字段已处理了三个陷阱:

  1. 被忽略的文件: 如果有会丢失的被忽略文件(例如 .env、.superpowers/),前几个命令会将其复制到 ~/worktree-backup/<repo>/<worktree>。复制必须在删除之前进行:删除后,就没有什么可复制的了。
  2. 子模块: 如果 worktree 包含已初始化的子模块,则删除命令会附带 --force,因为 git 拒绝没有此选项的 git worktree remove。在提供此命令之前,请确认在“丢失内容”列中子模块不丢失任何内容,或者用户已接受丢失。
  3. 分支: 最后,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。

相关技能