关于 sc-push
sc-push 是用于将 Git 更改推送到多个远程端的技能,并可为各远程端单独设置规则。它支持路径排除、分支选择、试运行预览及强制推送确认。
主要功能
- 01推送到指定或全部远程端
- 02按远程端排除路径
- 03选择要推送的分支
- 04通过试运行预览计划
- 05强制推送前确认
适用场景
- 01将一个分支发布到多个远程端
- 02对某个远程端省略指定路径
- 03执行前预览路径筛选推送
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ tony363/ superclaude --skill sc-push安装后在 Claude Code 中输入/sc-push确认已加载。
详细介绍
多远程推送技能
将更改推送到多个 Git 远程仓库,并为每个远程仓库配置不同设置。支持选择性内容筛选(为每个远程仓库排除路径)、分支映射和强制推送控制。
快速开始
# Push current branch to all remotes
/sc:push
# Push specific branch
/sc:push main
# Push with path exclusions for a remote
/sc:push --exclude efs:prompts/,secrets/
# Push to specific remotes only
/sc:push --remotes origin,staging
# Dry run to preview actions
/sc:push --dry-run
行为流程
- 解析 - 提取分支、远程仓库列表、排除项和标志
- 验证 - 检查 Git 状态、未提交的更改和远程仓库是否存在
- 规划 - 根据排除项制定每个远程仓库的推送计划
- 确认 - 显示计划,并针对强制推送征求用户确认
- 执行 - 依次推送到每个远程仓库
- 报告 - 汇总每个远程仓库的推送结果
标志
| 标志 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--remotes | string | all | 要推送到的远程仓库,以逗号分隔 |
--exclude | string | - | 每个远程仓库的排除项:remote:path1,path2 |
--dry-run | bool | false | 预览推送计划,但不执行 |
--force | bool | false | 对有排除项的远程仓库执行强制推送 |
--no-verify | bool | false | 跳过推送前钩子 |
阶段 1:解析参数
- 分支:第一个位置参数,或通过
git rev-parse --abbrev-ref HEAD获取当前分支 - 远程仓库:来自
--remotes标志,或通过git remote获取所有已配置的远程仓库 - 排除项:解析
--exclude remote:path1,path2;remote2:path3格式
阶段 2:验证 Git 状态
# Verify git repository
git rev-parse --is-inside-work-tree
# Get current branch
git branch --show-current
# Check for uncommitted changes
git status --porcelain
如果存在未提交的更改:
- 警告用户
- 询问用户是想先提交,还是只推送现有提交
验证每个目标远程仓库是否存在:
git remote -v
阶段 3:制定推送计划
针对每个远程仓库,确定推送策略:
简单推送(无排除项)
git push <remote> <branch>
筛选后推送(含排除项)
需要为特定远程仓库排除路径时:
- 暂存未提交的更改(如果存在)
- 创建临时分支:
git checkout -b tmp-push-<remote>-$$ <branch> - 从索引中移除排除路径:
git rm -rf --cached <paths>(如果路径不存在,则忽略错误) - 提交移除操作:
git commit -m "tmp: remove excluded paths for <remote> push" --allow-empty - 强制推送临时分支:
git push <remote> tmp-push-<remote>-$$:<branch> --force - 返回原分支:
git checkout <branch> - 删除临时分支:
git branch -D tmp-push-<remote>-$$ - 如适用,恢复暂存的更改
执行前展示计划:
Push Plan:
Branch: <branch>
Remote: origin
Strategy: direct push
Command: git push origin <branch>
Remote: efs
Strategy: filtered push (excluding: prompts/, secrets/)
Steps: temp branch -> remove paths -> force push -> cleanup
阶段 4:确认
对于任何需要强制推送的远程仓库:
- 执行前始终征求用户确认
- 明确说明将强制推送的内容及原因
- 未经用户明确确认,绝不强制推送到 main/master
阶段 5:执行推送
按顺序对每个远程仓库执行推送计划:
- 按顺序推送到每个远程仓库
- 分别报告成功或失败
- 失败时:记录错误,并继续处理其余远程仓库
- 清理所有临时分支
阶段 6:报告结果
## Push Summary
| Remote | URL | Strategy | Status |
|--------|-----|----------|--------|
| origin | github.com/user/repo | direct | Success |
| efs | github.com/org/repo | filtered | Success |
**Branch**: <branch>
**Excluded paths**: efs: prompts/, secrets/
错误处理
| 场景 | 操作 |
|---|---|
| 不是 Git 仓库 | 退出并报告错误 |
| 未找到远程仓库 | 报错并列出可用的远程仓库 |
| 存在未提交的更改 | 发出警告,并询问是提交还是继续 |
| 推送被拒绝(非快进) | 建议先拉取,绝不自动强制推送 |
| 强制推送到 main/master | 必须获得明确确认 |
| 清理临时分支失败 | 警告用户,并提供清理命令 |
| 网络故障 | 报告哪些远程仓库推送成功或失败 |
防护措施
- 未经用户明确同意,绝不强制推送到 main/master
- 执行前始终显示推送计划
- 即使发生故障,也要清理临时分支
- 即使发生故障,也要恢复暂存的更改
- 首次使用筛选推送时,默认执行试运行
- 临时提交绝不会出现在源分支历史记录中
工具协同
- Bash - 执行所有 Git 操作
- Read - 检查
.git/config中的远程仓库配置
评论
支持 Markdown