| name | nop-git-worktree |
| description | 涉及git worktree的操作优先使用这个skill。管理 Git bare 仓库和多个并行 worktree 的开发环境。支持初始化 bare 仓库结构、自动生成分支名并创建 feature worktree。 |
前置依赖
本 skill 仅覆盖 worktree 生命周期管理(初始化、创建、删除 worktree)。
所有通用 Git 操作(commit、sync、rebase、历史搜索)由 nop-git-master skill 处理。
当用户请求涉及 worktree 内的通用 git 操作时,应同时加载 nop-git-master。
职责边界
| 操作 | 归属 skill |
|---|
| 初始化 bare + worktree 项目结构 | 本 skill |
| 创建/删除 feature worktree | 本 skill |
| 在 worktree 中提交代码 | nop-git-master (COMMIT) |
| 在 worktree 中同步远程更新 | nop-git-master (SYNC) |
| 在 worktree 中 rebase/squash | nop-git-master (REBASE) |
| 历史搜索 (log/blame/bisect) | nop-git-master (HISTORY_SEARCH) |
| 合并 Feature 分支回主分支(编排流程) | 本 skill(但各步骤内的 git 操作委托给 nop-git-master) |
重要提示
⚠️ 必须遵守的操作规则
-
所有 git worktree 相关命令必须在 .bare 目录中执行
- ✅ 正确:
git -C .bare worktree add ../feature-xxx -b feature-xxx
- ❌ 错误:
git -C .bare worktree add feature-xxx -b feature-xxx
-
创建 worktree 时使用相对路径
- ✅ 正确:使用相对路径
../
- ❌ 错误:使用绝对路径
-
遇到错误时,按顺序清理
cd ~/app/nop-entropy-wt
git -C .bare worktree remove ../nop-entropy-feature-xxx 2>/dev/null || true
rm -rf nop-entropy-feature-xxx 2>/dev/null || true
git -C .bare worktree prune
git -C .bare branch -D feature-xxx
-
操作目录
| 操作类型 | 执行目录 |
|---|
| 创建/删除 worktree | cd ~/app/nop-entropy-wt && git -C .bare worktree ... |
| 查看 worktree 列表 | cd ~/app/nop-entropy-wt && git -C .bare worktree list |
| 查看/操作分支 | cd ~/app/nop-entropy-wt && git -C .bare branch ... |
| 在 worktree 中开发 | cd ~/app/nop-entropy-wt/nop-entropy-feature-xxx |
目录结构
project-root/ # 项目根目录(如 ~/app/nop-entropy-wt)
├── .bare/ # Git bare 仓库(中心),所有 git worktree 操作在此执行
│ ├── HEAD
│ ├── config
│ ├── objects/
│ ├── refs/
│ └── ...
├── nop-entropy-master/ # 主分支 worktree(开发时在此目录),目录名=项目名-分支名
│ └── ...
├── nop-entropy-feat-auth/ # 特性分支 worktree,目录名=项目名-分支名
│ ├── .mvn/
│ │ └── maven.config
│ └── ...
└── nop-entropy-fix-login/ # 修复分支 worktree,目录名=项目名-分支名
├── .mvn/
│ └── maven.config
└── ...
命名规则:worktree 目录名 = <PROJECT_NAME>-<BRANCH_NAME>,便于在 IDE 中区分。
操作:初始化 bare + worktree 项目结构
参数:
- 项目根目录 (必填): 如
~/app/nop-entropy-wt
- 远程仓库 URL (可选): 如
https://gitee.com/user/repo.git
- 本地仓库路径 (可选): 现有 git 仓库的路径
cd ~/app/nop-entropy-wt
git clone --bare https://gitee.com/canonical-entropy/nop-entropy.git .bare
git -C .bare config core.longpaths true
PROJECT_NAME=$(git -C .bare config --get remote.origin.url | sed -E 's|.*/([^/]+?)(\.git)?$|\1|')
DEFAULT_BRANCH=$(cat .bare/HEAD 2>/dev/null | sed 's@^refs/heads/@@')
if [ -z "$DEFAULT_BRANCH" ]; then
DEFAULT_BRANCH=$(git -C .bare symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@')
fi
git -C .bare worktree add "../${PROJECT_NAME}-${DEFAULT_BRANCH}" "$DEFAULT_BRANCH"
git -C .bare worktree list
操作:创建新的 feature worktree
参数:
- 需求描述 (必填): 自然语言描述的功能需求
- 项目根目录 (必填): 如
~/app/nop-entropy-wt
分支名生成规则:
| 需求类型 | 前缀 | 示例 |
|---|
| 新功能 | add-, feat- | add-user-auth, feat-payment |
| 修复 | fix- | fix-login-error, fix-crash |
| 重构 | refactor- | refactor-db, refactor-job-scheduling |
| 性能优化 | perf-, optimize- | perf-query, optimize-cache |
| 紧急修复 | hotfix- | hotfix-security |
| 文档 | docs- | docs-api |
| 测试/杂项 | test-, chore- | test-auth, chore-deps |
cd ~/app/nop-entropy-wt
PROJECT_NAME=$(git -C .bare config --get remote.origin.url | sed -E 's|.*/([^/]+?)(\.git)?$|\1|')
BRANCH_NAME="refactor-job-scheduling"
WORKTREE_NAME="${PROJECT_NAME}-${BRANCH_NAME}"
if git -C .bare branch --list "$BRANCH_NAME" > /dev/null; then
git -C .bare worktree remove "../$WORKTREE_NAME" 2>/dev/null || true
rm -rf "$WORKTREE_NAME" 2>/dev/null || true
git -C .bare worktree prune
git -C .bare branch -D "$BRANCH_NAME"
fi
git -C .bare worktree add "../$WORKTREE_NAME" -b "$BRANCH_NAME"
mkdir -p "$WORKTREE_NAME/.mvn"
WORKTREE_ABS_PATH="$(cd "$WORKTREE_NAME" && pwd)"
cat > "$WORKTREE_NAME/.mvn/maven.config" <<EOF
-Dmaven.repo.local.head=$WORKTREE_ABS_PATH/.nop/repository
-Dmaven.repo.local.tail.ignoreAvailability=true
EOF
git -C .bare worktree list
操作:合并 Feature 分支回主分支
当 feature 分支开发完成后,将提交合并回主分支。
⚠️ 本流程步骤 1 和 4 需要 nop-git-master skill 已加载。
前置:本流程假设 feature 分支有多个中间提交,需要软重置后重新组织提交。
PROJECT_NAME="nop-entropy"
DEFAULT_BRANCH=$(git -C ../.bare symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@')
if [ -z "$DEFAULT_BRANCH" ]; then
DEFAULT_BRANCH=$(git rev-parse --verify main 2>/dev/null && echo main || echo master)
fi
cd ~/app/nop-entropy-wt/${PROJECT_NAME}-${DEFAULT_BRANCH}
cd ../${PROJECT_NAME}-feat-xxx
git reset --soft "$DEFAULT_BRANCH"
git diff --cached --stat
cd ../${PROJECT_NAME}-${DEFAULT_BRANCH}
git merge feat-xxx --ff-only
cd ../${PROJECT_NAME}-feat-xxx
操作:删除 feature worktree
⚠️ 删除前必须检查是否有未保存的工作:
cd ~/app/nop-entropy-wt
PROJECT_NAME=$(git -C .bare config --get remote.origin.url | sed -E 's|.*/([^/]+?)(\.git)?$|\1|')
BRANCH_NAME="feat-xxx"
WORKTREE_NAME="${PROJECT_NAME}-${BRANCH_NAME}"
cd "$WORKTREE_NAME"
UNCOMMITTED=$(git status --porcelain 2>/dev/null)
UNPUSHED=$(git log --oneline "origin/$BRANCH_NAME..HEAD" 2>/dev/null)
if [ -n "$UNCOMMITTED" ] || [ -n "$UNPUSHED" ]; then
echo "⚠️ 工作树有未保存/未推送的更改:"
[ -n "$UNCOMMITTED" ] && echo " 未提交: $(echo "$UNCOMMITTED" | wc -l) 个文件"
[ -n "$UNPUSHED" ] && echo " 未推送: $(echo "$UNPUSHED" | head -5)"
echo "请先处理后再删除。如确认丢弃,请明确告知。"
exit 1
fi
cd ..
git -C .bare worktree remove "../$WORKTREE_NAME" 2>/dev/null || true
rm -rf "$WORKTREE_NAME" 2>/dev/null || true
git -C .bare worktree prune
git -C .bare branch -D "$BRANCH_NAME"
Maven 配置说明
| 分支类型 | Maven 配置 | 说明 |
|---|
| 主分支 (main/master) | 不配置 | 使用系统默认仓库(~/.m2/repository) |
| Feature 分支 | 配置 .mvn/maven.config | 使用独立局部仓库(.nop/repository),避免依赖冲突 |
WORKTREE_ABS_PATH="$(cd "nop-entropy-feat-auth" && pwd)"
cat > "nop-entropy-feat-auth/.mvn/maven.config" <<EOF
-Dmaven.repo.local.head=$WORKTREE_ABS_PATH/.nop/repository
-Dmaven.repo.local.tail.ignoreAvailability=true
EOF
故障排查
常见错误
| 错误信息 | 原因 | 解决方案 |
|---|
fatal: a branch named 'xxx' already exists | 分支已存在 | git -C .bare branch -D xxx |
fatal: '../xxx' already exists | worktree 目录已存在 | rm -rf xxx |
Preparing worktree (new branch 'xxx') failed | 路径格式错误或无效引用 | 参考清理步骤 |
Filename too long | Windows 路径超过 260 字符 | git -C .bare config core.longpaths true |
清理步骤
cd ~/app/nop-entropy-wt
PROJECT_NAME=$(git -C .bare config --get remote.origin.url | sed -E 's|.*/([^/]+?)(\.git)?$|\1|')
git -C .bare worktree remove "../${PROJECT_NAME}-xxx" 2>/dev/null || true
rm -rf "${PROJECT_NAME}-xxx" 2>/dev/null || true
git -C .bare worktree prune
git -C .bare branch -D xxx
Windows 长路径问题
cd ~/app/nop-entropy-wt
git -C .bare config core.longpaths true