with one click
nop-git-worktree
// 涉及git worktree的操作优先使用这个skill。管理 Git bare 仓库和多个并行 worktree 的开发环境。支持初始化 bare 仓库结构、自动生成分支名并创建 feature worktree。
// 涉及git worktree的操作优先使用这个skill。管理 Git bare 仓库和多个并行 worktree 的开发环境。支持初始化 bare 仓库结构、自动生成分支名并创建 feature worktree。
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | nop-git-worktree |
| description | 涉及git worktree的操作优先使用这个skill。管理 Git bare 仓库和多个并行 worktree 的开发环境。支持初始化 bare 仓库结构、自动生成分支名并创建 feature worktree。 |
所有 git worktree 相关命令必须在 .bare 目录中执行
git -C .bare worktree add ../feature-xxx -b feature-xxxgit -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 |
创建适合 worktree 开发的项目结构:
.bare 目录作为 Git bare 仓库(中心)在已初始化的项目下创建新 worktree:
初始化项目结构:
创建新 worktree:
project-root/ # 项目根目录(如 ~/app/nop-entropy-wt)
├── .bare/ # Git bare 仓库(中心),所有 git worktree 操作在此执行
│ ├── HEAD # 当前默认分支
│ ├── config # Git 配置
│ ├── objects/ # Git 对象存储
│ ├── refs/ # Git 引用
│ └── ...
├── nop-entropy-master/ # 主分支 worktree(开发时在此目录),目录名=项目名-分支名
│ └── ... # 项目文件
├── nop-entropy-feat-auth/ # 特性分支 worktree,目录名=项目名-分支名
│ ├── .mvn/
│ │ └── maven.config
│ └── ...
└── nop-entropy-fix-login/ # 修复分支 worktree,目录名=项目名-分支名
├── .mvn/
│ └── maven.config
└── ...
关键说明:
.bare/ 目录:这是 Git bare 仓库,所有 git worktree 命令必须在此目录或通过 git -C .bare 执行<PROJECT_NAME>-<BRANCH_NAME> 格式,便于在 IDE 中区分不同项目的 worktreenop-entropy-master/, nop-entropy-feat-auth/ 等目录:这些是实际的工作目录,开发时在这些目录中进行 git 操作(如 git commit, git status)参数:
~/app/nop-entropy-wthttps://gitee.com/user/repo.git步骤:
cd ~/app/nop-entropy-wt
# 1. 创建 bare 仓库
git clone --bare https://gitee.com/canonical-entropy/nop-entropy.git .bare
# 或从本地克隆: git clone --bare ~/app/nop-entropy .bare
# 2. 启用长路径支持(Windows 平台重要配置)
# Windows 默认路径限制 260 字符,某些项目文件路径可能超限
git -C .bare config core.longpaths true
echo "Long paths enabled"
# 3. 识别项目名称(从 remote URL 提取)
PROJECT_NAME=$(git -C .bare config --get remote.origin.url | sed -E 's|.*/([^/]+?)(\.git)?$|\1|')
echo "Project name: $PROJECT_NAME"
# 4. 识别默认分支(优先从 .bare/HEAD 读取,兼容 bare 仓库)
DEFAULT_BRANCH=$(cat .bare/HEAD 2>/dev/null | sed 's@^refs/heads/@@')
# 如果 .bare/HEAD 读取失败,尝试从 remote 读取
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
echo "Default branch: $DEFAULT_BRANCH"
# 5. 创建主分支 worktree(目录名: PROJECT_NAME-BRANCH_NAME)
git -C .bare worktree add "../${PROJECT_NAME}-${DEFAULT_BRANCH}" "$DEFAULT_BRANCH"
# 6. 验证
git -C .bare worktree list
参数:
~/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
# 获取项目名称(从 remote URL 提取)
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}" # worktree 目录名: PROJECT_NAME-BRANCH_NAME
# 1. 如果分支已存在,先清理
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
# 2. 创建 worktree(目录名: PROJECT_NAME-BRANCH_NAME)
git -C .bare worktree add "../$WORKTREE_NAME" -b "$BRANCH_NAME"
# 3. 创建 Maven 配置(Feature 分支专用)
mkdir -p "$WORKTREE_NAME/.mvn"
# 获取 worktree 的绝对路径并替换变量为实际路径
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
# 4. 验证
git -C .bare worktree list
注意:所有 git worktree 相关命令必须在 .bare 目录中执行,或使用 git -C .bare 参数。
# 查看 worktree 列表
git -C .bare worktree list
# 删除 worktree(指定 worktree 目录名)
git -C .bare worktree remove nop-entropy-feature-auth
# 清理无效引用
git -C .bare worktree prune
# 移动 worktree
git -C .bare worktree move nop-entropy-old-name nop-entropy-new-name
# 切换 worktree 目录(目录名 = PROJECT_NAME-BRANCH_NAME)
cd ~/app/nop-entropy-wt/nop-entropy-master # 主分支
cd ~/app/nop-entropy-wt/nop-entropy-feature-auth # 功能分支
# 在 worktree 中查看状态
cd ~/app/nop-entropy-wt/nop-entropy-feature-auth
git status
git branch
在更新分支时,必须明确区分以下两种情况:
| 模式 | 场景 | 操作 | 是否需要确认 |
|---|---|---|---|
| 普通更新 | 特性分支同步主分支最新内容,保留自己的修改 | git rebase origin/master | 否(默认行为) |
| 强制重置 | 丢弃本地所有修改,完全同步主分支 | git reset --hard origin/master | 是(必须确认) |
问题:git fetch origin 可能只更新 FETCH_HEAD,而不更新 refs/remotes/origin/master,导致 origin/master 指向旧版本。
解决方案:必须使用强制更新语法:
# ❌ 错误:可能不会更新 refs/remotes/origin/master
git fetch origin
# ✅ 正确:强制更新远程跟踪分支
git fetch origin +refs/heads/master:refs/remotes/origin/master
验证远程同步状态:在执行任何分支更新前,必须验证本地 origin/master 是否真正同步:
# 1. 检查远程实际最新提交
git ls-remote origin refs/heads/master
# 2. 检查本地 origin/master 指向的提交
git rev-parse origin/master
# 3. 两者应该相同,如果不同说明需要强制 fetch
特性分支的默认行为:拉取主分支最新内容,然后将自己的提交叠加在上面。
cd ~/app/nop-entropy-wt
# 1. 【关键】强制更新远程跟踪分支(不是简单的 git fetch origin)
git fetch origin +refs/heads/master:refs/remotes/origin/master
# 2. 验证同步状态(可选但推荐)
git ls-remote origin refs/heads/master # 远程实际
git rev-parse origin/master # 本地跟踪
# 3. 在特性分支中 rebase(保留本地修改)
cd nop-entropy-feat-xxx
git rebase origin/master
# 4. 如果有冲突,智能解决后继续
git add .
git rebase --continue
⚠️ 必须先向用户确认:此操作会丢失所有本地修改!
cd ~/app/nop-entropy-wt
# 1. 【关键】强制更新远程跟踪分支
git fetch origin +refs/heads/master:refs/remotes/origin/master
# 2. 确认后强制重置
cd nop-entropy-feat-xxx
git reset --hard origin/master
主分支(master)始终与远程同步:
cd ~/app/nop-entropy-wt
# 1. 【关键】强制更新远程跟踪分支
git fetch origin +refs/heads/master:refs/remotes/origin/master
# 2. 验证同步
git log --oneline HEAD..origin/master # 应该为空
# 3. 更新主分支
cd nop-entropy-master
git pull --ff-only origin master
# 或者:git reset --hard origin/master
当需要更新所有 worktree 分支时:
cd ~/app/nop-entropy-wt
# 1. 【关键】强制更新远程跟踪分支
git fetch origin +refs/heads/master:refs/remotes/origin/master
# 2. 遍历所有 worktree 并更新
for wt in nop-entropy-*; do
if [ -d "$wt" ]; then
echo "=== Updating $wt ==="
cd "$wt"
behind=$(git rev-list --count HEAD..origin/master 2>/dev/null || echo "N/A")
if [ "$behind" != "0" ] && [ "$behind" != "N/A" ]; then
git stash -u -m "pre-rebase stash" 2>/dev/null
git rebase origin/master 2>&1 | head -5
git stash pop 2>/dev/null || true
fi
cd ..
fi
done
<PROJECT_NAME>-<BRANCH_NAME> 格式(如 nop-entropy-master, nop-entropy-feat-auth),便于在 IDE 中区分不同项目的 worktreegit worktree 相关命令:在 .bare 目录中执行,或使用 git -C .bare../nop-entropy-feature-xxx)git fetch origin 已同步远程git ls-remote origin refs/heads/master 验证远程实际状态git fetch origin +refs/heads/master:refs/remotes/origin/master 强制更新git log --oneline HEAD..origin/master 确认是否有新提交主分支 vs Feature 分支的 Maven 配置:
| 分支类型 | Maven 配置 | 说明 |
|---|---|---|
| 主分支 (main/master) | 不配置 | 使用系统默认仓库(~/.m2/repository) |
| Feature 分支 | 配置 .mvn/maven.config | 使用独立局部仓库(.nop/repository),避免依赖冲突 |
Feature 分支 Maven 配置文件格式:
# 示例:创建时自动计算绝对路径
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
实际生成的配置文件内容示例:
-Dmaven.repo.local.head=/Users/abc/app/nop-entropy-wt/nop-entropy-feat-auth/.nop/repository
-Dmaven.repo.local.tail.ignoreAvailability=true
参数说明:
maven.repo.local.head: 优先使用当前 worktree 的 .nop/repository 目录maven.repo.local.tail.ignoreAvailability=true: 忽略尾部仓库可用性检查,提高启动速度流程假设:
~/app/nop-entropy-wtnop-entropy~/app/nop-entropy-wt/nop-entropy-feat-stream-processing~/app/nop-entropy-wt/nop-entropy-master步骤:
# 获取项目名称
PROJECT_NAME="nop-entropy"
# 1. 更新主分支到最新
cd ~/app/nop-entropy-wt/${PROJECT_NAME}-master
git pull origin master
# 2. 软重置 feature 分支到基础分支(保留所有修改,但撤销提交历史)
cd ../${PROJECT_NAME}-feat-stream-processing
git reset --soft master
# 3. 查看修改内容
git diff --cached --stat
# 4. 生成提交信息并提交(遵循约定式提交格式)
git commit -m "feat: 实现流处理数据源接入
支持多种数据源接入:
- Kafka 数据源
- 文件数据源
- HTTP 数据源
- 数据库数据源"
# 5. 生成差异文件(可选)
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
git diff master > "${PROJECT_NAME}-feat-stream-processing-${TIMESTAMP}.diff"
# 6. 合并到主分支
cd ../${PROJECT_NAME}-master
git merge feat-stream-processing --ff-only
# 7. 同步主分支最新内容回 feature 分支
cd ../${PROJECT_NAME}-feat-stream-processing
git rebase master
约定式提交格式:
| 类型 | 含义 | 示例 |
|---|---|---|
feat | 新功能 | feat: 添加用户登录功能 |
fix | 修复 bug | fix: 修复登录时的空指针异常 |
refactor | 重构 | refactor: 优化数据库查询逻辑 |
perf | 性能优化 | perf: 减少重复的网络请求 |
docs | 文档 | docs: 更新 API 文档 |
test | 测试 | test: 添加单元测试覆盖 |
chore | 构建/工具 | chore: 升级依赖版本 |
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
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 | 路径格式错误或无效引用 | 参考清理步骤 |
worktree list 显示奇怪路径 | 在错误目录执行命令 | 参考清理步骤 |
Filename too long | Windows 路径超过 260 字符限制 | 启用长路径支持:git -C .bare config core.longpaths true |
error: unable to create file: Filename too long | Windows 路径超过 260 字符限制 | 启用长路径支持:git -C .bare config core.longpaths true |
| 分支显示已同步但实际落后远程 | git fetch 未更新远程跟踪分支 | 使用强制 fetch:git fetch origin +refs/heads/master:refs/remotes/origin/master |
症状:git status 显示与 origin/master 同步,但实际远程有新提交。
诊断步骤:
# 1. 检查远程实际最新提交
git ls-remote origin refs/heads/master
# 输出: 4ed4a35629860072fec6f7c1c0f16b3aadd2c31b refs/heads/master
# 2. 检查本地 origin/master
git rev-parse origin/master
# 输出: 813f1552cb826e3ddc72af8bd1fedc9d4d40df66
# 3. 如果两者不同,说明本地跟踪分支过期
解决方案:
# 强制更新远程跟踪分支
git fetch origin +refs/heads/master:refs/remotes/origin/master
# 验证更新成功
git rev-parse origin/master
# 应该输出与 git ls-remote 相同的 commit hash
问题描述: Windows 默认路径限制为 260 字符(MAX_PATH),某些项目(如 Nop 平台)的模板文件路径可能超过此限制。
解决方案:
cd ~/app/nop-entropy-wt
git -C .bare config core.longpaths true
# 以管理员身份运行 PowerShell
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
配置写入位置:
.bare/config 文件:[core]
longpaths = true
适用场景:
Filename too long 错误遇到路径混乱或无效引用时:
cd ~/app/nop-entropy-wt
# 获取项目名称(从 remote URL 提取)
PROJECT_NAME=$(git -C .bare config --get remote.origin.url | sed -E 's|.*/([^/]+?)(\.git)?$|\1|')
# 删除 worktree 引用(使用完整的 worktree 目录名)
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
# 重新创建(目录名: PROJECT_NAME-BRANCH_NAME)
git -C .bare worktree add "../${PROJECT_NAME}-xxx" -b xxx
cd ~/app/nop-entropy-wt
# 查看 worktree 详细状态
git -C .bare worktree list --porcelain
# 查看所有分支
git -C .bare branch -a