mcpField
W
worktree

worktree

github.com/jimweller开发45 次安装
代码仓库

关于 worktree

worktree 是用于并行分支开发的 Git worktree 管理技能,支持创建、列出、变基、合并和移除 worktree,并在操作前执行安全检查。

主要功能

  1. 01为新分支创建 worktree
  2. 02列出 Git worktree
  3. 03将分支合并到 main
  4. 04将分支变基到 main
  5. 05移除已合并的 worktree 和分支
  6. 06变更前检查安全条件

适用场景

  1. 01并行开发多个分支
  2. 02将功能分支变基到最新 main
  3. 03把 worktree 分支合并到 main
  4. 04清理已合并的 worktree

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jimweller/clanker-skills --skill worktree

安装后在 Claude Code 中输入/worktree确认已加载。

详细介绍

STARTER_CHARACTER = 🎋

Git Worktree 管理

管理用于并行分支开发的 git worktree。Worktree 位于 ~/.worktrees/<repo>/<branch> 下。分支名称中的斜杠会创建嵌套目录(例如,feature/foo 会变成 ~/.worktrees/<repo>/feature/foo)。

参数

从用户消息中提取操作和分支名称。 第一个参数是操作。第二个参数是分支名称(create、merge、rebase、remove 操作必需)。 如果未指定操作,默认使用 list。

路径发现

所有操作都根据 git 确定路径,而不是通过 dirname 计算。

PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
REPO_NAME=$(basename "$PRIMARY")
WORKTREE_DIR="$HOME/.worktrees/$REPO_NAME/<branch>"

PRIMARY 是原始克隆(git worktree list 中的第一项)。其他 worktree 位于 ~/.worktrees/$REPO_NAME/ 下。

操作

create

在 ~/.worktrees/<repo>/<branch> 下创建一个带新分支的 worktree。如果主 worktree 中存在 .llmtmp/,则将其复制过去。如果在 tmux 中运行,则打开一个名为 wt:<branch> 的新 tmux 窗口。不会切换焦点。

PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
REPO_NAME=$(basename "$PRIMARY")
WORKTREE_DIR="$HOME/.worktrees/$REPO_NAME/<branch>"

mkdir -p "$(dirname "$WORKTREE_DIR")"
git worktree add "$WORKTREE_DIR" -b <branch>

[ -d "$PRIMARY/.llmtmp" ] && cp -r "$PRIMARY/.llmtmp" "$WORKTREE_DIR/.llmtmp"

[ -n "$TMUX" ] && tmux new-window -d -n "wt:<branch>" -c "$WORKTREE_DIR"

创建后,报告 worktree 路径以及 tmux 窗口编号(如果已创建)。

list

显示所有 worktree。

git worktree list
merge

将当前 worktree 的分支合并到 main。请从功能 worktree 中运行。

预检查:确认当前分支不是 main。如果当前分支是 main,则拒绝操作。

PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
BRANCH=$(git rev-parse --abbrev-ref HEAD)

git -C "$PRIMARY" fetch origin && git -C "$PRIMARY" pull
git -C "$PRIMARY" merge "$BRANCH"
git -C "$PRIMARY" push origin main

如果发生冲突,请先帮助用户解决冲突,再推送。

rebase

将分支变基到最新的 main 上。必须在该分支的 worktree 内运行。

预检查:确认当前分支与 <branch> 一致。如果不一致,则拒绝操作并指导用户切换到正确的 worktree。

git fetch origin
git rebase origin/main

如果发生冲突,请帮助用户解决。变基成功后,如果该分支之前已推送,则必须强制推送(仅可在根据安全规则获得明确许可后执行)。

remove

移除 worktree 并删除其分支。必须从主 worktree 中运行。

预检查:

  1. 确认当前目录是主 worktree(git rev-parse --show-toplevel 等于 $PRIMARY)。如果不是,则拒绝操作。
  2. 使用 git branch --merged 确认该分支已合并到 main。如果尚未合并,则拒绝操作并指导用户先合并。
PRIMARY=$(git worktree list --porcelain | awk '/^worktree / { print $2; exit }')
REPO_NAME=$(basename "$PRIMARY")
WORKTREE_DIR="$HOME/.worktrees/$REPO_NAME/<branch>"

git worktree remove "$WORKTREE_DIR"
git branch -d <branch>

PARENT="$(dirname "$WORKTREE_DIR")"
while [ "$PARENT" != "$HOME/.worktrees" ] && rmdir "$PARENT" 2>/dev/null; do
  PARENT="$(dirname "$PARENT")"
done

如果 git branch -d 因“not fully merged”而失败,请停止操作并告知用户先合并。绝不使用 git branch -D。

rmdir 循环会清理分支名称包含斜杠时留下的空父目录,并在没有剩余分支时移除每个仓库对应的目录。

安全规则

  • 仅进行本地合并。不要创建拉取请求。
  • 移除时,如果 worktree 中有未暂存或未提交的工作,请询问用户是要合并还是强制删除。
  • 绝不要手动删除 worktree 分支。只能使用 git worktree remove。
  • 绝不要手动删除 worktree 目录。始终使用 git worktree remove。
  • 未经用户明确许可,绝不要强制推送。
  • 根据 git worktree list --porcelain 确定路径。绝不要硬编码路径。

评论

支持 Markdown