关于 safe-git-ops
safe-git-ops 是处理常见 Git 操作的技能,帮助区分仓库状态问题、权限限制和网络故障。它采用操作前检查和分级流程,并对破坏性命令及 worktree 操作设定谨慎步骤。
主要功能
- 01操作前检查仓库状态
- 02按风险分级处理提交与推送
- 03区分冲突、权限及网络故障
- 04针对 worktree 的操作指引
- 05破坏性命令需先确认
适用场景
- 01诊断失败的 Git 操作
- 02按变更范围准备提交与验证
- 03在 worktree 中处理 Git 操作
- 04判断推送失败是否由网络导致
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ a-green-hand-jack/ ml-research-skills --skill safe-git-ops安装后在 Claude Code 中输入/safe-git-ops确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/commit-paths.mdfailure-modes.mdworktrees.mdscripts/project-push详细介绍
安全 Git 操作
帮助用户执行常见的 Git 操作,避免混淆沙盒故障、仓库状态问题和真正的内容冲突。
技能目录结构
<installed-skill-dir>/
├── SKILL.md
├── scripts/
│ └── project-push
└── references/
├── failure-modes.md
├── commit-paths.md
└── worktrees.md
渐进式加载
- 始终阅读
references/failure-modes.md - 当用户要求提交、推送、加快收尾,或选择验证/重新安装范围时,阅读
references/commit-paths.md - 当仓库使用
git worktree、.git指向另一个目录,或用户提到多个工作树时,阅读references/worktrees.md
核心行为
- 将预检与会改变状态的 Git 命令分开
- 区分沙盒或权限故障与合并冲突
- 将工作树视为特殊情况,因为它们可能会在可见工作目录之外写入共享 Git 元数据
- 对
reset --hard、checkout --、删除分支或丢弃储藏等破坏性操作,先征求用户同意 - 优先使用非交互式 Git 命令
- 使用分级风险的提交路径,避免低风险的文本/文档更改承担完整验证、完整冒烟测试或完整技能重新安装的成本
- 对常规网络推送,优先使用稳定的封装命令
project-push <repo> <remote> <branch>,而不是临时拼凑命令,例如cd repo && git push、bash -lc "git push",或在相对路径和绝对路径的git -C形式之间切换。 - 对非简单的收尾任务,如果
sidecar-task-runner可以只读运行并减少主 Agent 的决策时间,则使用它进行提交前分类 - 如果沙盒阻止写操作,应明确说明并请求提升权限,而不是猜测是否存在冲突
- 网络 Git 操作失败时,在要求用户更改凭据前,先区分网络/沙盒访问问题、身份验证问题、Git 远程配置问题或仓库问题
- 倾向于尽早启用:如果用户含糊地报告 Git 故障,应假定本技能负责诊断,并在任何会改变状态的命令运行前介入
触发启发规则
出现以下任一情况时,立即使用本技能:
- 用户要求运行
git cherry-pick、merge、rebase、commit、stash、switch、checkout、branch或worktree - 用户说“Git 失败了”“合并出问题了”“cherry-pick 被阻止了”“有冲突”或“这个仓库为什么会变成这样”
- Agent 看到涉及以下内容的错误文本:
CONFLICTindex.lockoperation not permittedpermission deniedCould not resolve hostCould not read from remote repositoryConnection timed outNetwork is unreachable.git/worktrees/ORIG_HEADCHERRY_PICK_HEADbranch is already checked out
如果任务显然涉及大量 Git 操作,不要等到写入失败后才加载本技能。
避免误诊
除非 Git 已证实,否则绝不要说以下任何内容:
- 错误实际上与权限有关时,却说“这是合并冲突”
- 可能涉及公共 Git 目录时,却说“这只是当前工作树本地的问题”
- 真正的问题是脏状态、分离的 HEAD 或正在进行的操作时,却说“Git 坏了”
- 首次失败是沙盒限制导致的网络或 DNS 故障时,却说“你的令牌/SSH 密钥/远程仓库配置有问题”
- 不说明阻碍属于冲突、仓库状态还是沙盒问题,就说“直接重试”
第 1 步——了解仓库
执行任何重要的 Git 操作前,检查仓库结构:
git rev-parse --show-toplevel
git rev-parse --git-dir
git branch --show-current
git status --short
如果用户提到工作树,或者 .git 是文件而不是目录,也要检查:
git worktree list
git rev-parse --git-common-dir
总结:
- 仓库根目录
- 当前分支
- 工作树是否有未提交的更改
- 是否为工作树
- 共享 Git 元数据是否位于当前目录之外
步骤 2 — 分类请求的操作
将请求归为以下类别之一:
inspect:状态、日志、差异、分支列表、远程仓库、工作树布局network_inspect:fetch、pull、push 的试运行检查、ls-remote、子模块更新,或任何会连接 Git 远程仓库的 Git 操作safe_write:add、commit、cherry-pick、merge、rebase、stash、创建分支、创建工作树destructive_write:reset、覆盖本地更改的 checkout、clean、删除分支、删除 stash、强制推送
对于 inspect,如果沙盒规则允许,直接运行命令。
对于 network_inspect,除非已获准使用网络,否则应预期沙盒运行环境会阻止 DNS 查询或出站连接。
对于 safe_write,先执行预检。对于 commit/push 收尾操作,使用 references/commit-paths.md 将更改归类为 Fast Path、Skill Path、Code Path 或 Risk Path,然后运行与该路径匹配的最小验证集。
对于 destructive_write,执行前必须获得用户明确确认。
步骤 3 — 执行任何会更改状态的 Git 命令前进行预检
在执行 safe_write 或 destructive_write 前,收集足够的上下文,以避免处理失败时草率应对:
git status --short
git branch --show-current
git rev-parse --short HEAD
对于常规 commit/push 收尾操作,除非适用 Risk Path,否则不要进行全面检查。Fast Path 收尾操作只需在 commit 前运行 git status --short、git diff --check、明确指定文件的 git add <files>,以及 git diff --cached --stat。
对于 cherry-pick、merge 或 rebase,还应先检查目标 commit 或分支:
git log --oneline --decorate -n 5
git show --stat --summary <target>
对于工作树,检查共享元数据的位置:
git rev-parse --git-common-dir
如果该命令很可能会写入沙盒可写根目录之外的共享 Git 元数据,请在运行前告知用户,并准备好请求提升权限。
如果用户明确要求执行限定于工作树的写操作,例如 cherry-pick、merge 或 commit,请在运行前明确说明,工作树可能需要写入公共 git 目录,而不只是可见的工作树路径。
步骤 4 — 正确执行操作并解读失败
Git 写操作失败时,先对失败进行分类,再告知用户发生了什么。
请遵循 references/failure-modes.md 中的指导。总体规则如下:
- 如果 Git 报告
CONFLICT、冲突标记,或要求解决文件问题,则属于代码冲突 - 如果 Git 报告
operation not permitted、permission denied、无法创建锁文件,或无法更新 refs 或工作树元数据,则属于沙盒或权限问题 - 如果 Git 在执行
fetch、pull、push、ls-remote或子模块操作期间报告 DNS 故障、API/主机连接失败、超时或网络不可达,则属于网络/沙盒访问问题,需在获得网络权限后重试 - 如果 Git 报告工作区状态不干净、未跟踪文件被覆盖、detached HEAD 不匹配,或缺少 commit,则属于仓库状态问题
除非 Git 确实报告了冲突,否则不要告诉用户“存在冲突”。
如果 Git 因 DNS/网络/沙盒限制而始终未能连接到主机,不要告诉用户“身份验证失败”“SSH 密钥错误”或“远程仓库不存在”。
步骤 5 — 当沙箱限制才是真正的问题时,妥善升级权限
如果重要的写入命令因沙箱限制而失败:
- 说明这是环境问题,而非代码冲突
- 指明被阻止的操作
- 如果已知,说明可能的写入目标,例如:
.git/index.lock.git/worktrees/...- 公共 git 目录下的共享 refs
- 请求提升权限,并重新运行同一命令
可以这样表述:
此
git cherry-pick失败看起来是沙箱写入限制所致,而非合并冲突。Git 需要更新共享的工作树元数据,因此我应该提升权限后重新运行该命令。
如果重要的网络 Git 命令因 DNS、API 或主机连接受阻而失败:
- 说明首次失败是网络/沙箱访问问题,尚不能证明是 Git 身份验证或远程配置故障
- 指明命令,例如
git fetch、git push或git ls-remote - 请求网络权限,并重新运行同一命令
- 只有在启用网络后重新运行,才能将错误归类为凭据、权限、仓库缺失、分支或服务器端错误
可以这样表述:
此
git ls-remote失败时并未连接到 GitHub;看起来是沙箱网络访问受限,而非仓库不存在或 SSH 密钥无效。我应该先获得网络权限并重新运行,然后再诊断凭据问题。
提交后的常规推送请使用稳定的包装器形式:
project-push <repo> <remote> <branch>
使用预检时找到的分支。除非包装器不可用,否则不要将同一推送改写为 cd <repo> && git push、git -C <repo> push 或由 shell 包装的变体。
步骤 6 — 工作树专属规则
当仓库使用工作树时:
- 假定
commit、cherry-pick、merge、rebase等类似命令可能会在当前工作树目录之外写入数据 - 尽早检查
git worktree list和git rev-parse --git-common-dir - 在确认 Git 尝试写入的位置之前,不要声称故障“仅限于此工作树”
- 删除分支或重置时要格外小心,因为其他工作树可能正在使用同一分支
详细处理规则请参阅 references/worktrees.md。
步骤 7 — 准确报告结果
完成后,明确报告以下结果之一:
- 成功
- 发生冲突,需要手动解决
- 沙箱或权限限制
- 网络/沙箱限制
- 仓库状态问题,需要用户选择
针对每种情况,告诉用户下一步该做什么,不要只给出含糊的 Git 输出。
正确示例:
git cherry-pick <commit>尚未进入合并冲突解决阶段。Git 无法在公共 git 目录下写入共享工作树元数据,因此这是沙箱问题。下一步是提升权限后重新运行同一命令。
错误示例:
cherry-pick 失败了,可能是冲突
推荐的输出格式
当用户询问“发生了什么?”或“为什么失败?”时,请按以下结构报告:
Operation: <git command>
Classification: success | content conflict | sandbox restriction | network/sandbox restriction | repository state problem
Evidence: <the key git message or state observation>
Why it happened: <short explanation>
Next step: <single concrete next action>
明确写出分类结论。这是避免草率诊断 Git 问题的关键保障。
此技能应能妥善处理的命令
git status、log、diff、show、branch、remotegit fetch、pull、push、ls-remotegit add、commit、stashgit cherry-pickgit mergegit rebasegit switch、checkout、checkout -bgit worktree list、git worktree add
需要格外谨慎的命令
git reset --hardgit checkout -- <path>git clean -fdgit branch -Dgit stash drop或cleargit push --force
未经用户明确批准,不要运行这些命令。