mcpField
S
sc-push

sc-push

github.com/tony363开发2069 次安装30 周前更新
代码仓库

关于 sc-push

sc-push 是用于将 Git 更改推送到多个远程端的技能,并可为各远程端单独设置规则。它支持路径排除、分支选择、试运行预览及强制推送确认。

主要功能

  1. 01推送到指定或全部远程端
  2. 02按远程端排除路径
  3. 03选择要推送的分支
  4. 04通过试运行预览计划
  5. 05强制推送前确认

适用场景

  1. 01将一个分支发布到多个远程端
  2. 02对某个远程端省略指定路径
  3. 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

行为流程

  1. 解析 - 提取分支、远程仓库列表、排除项和标志
  2. 验证 - 检查 Git 状态、未提交的更改和远程仓库是否存在
  3. 规划 - 根据排除项制定每个远程仓库的推送计划
  4. 确认 - 显示计划,并针对强制推送征求用户确认
  5. 执行 - 依次推送到每个远程仓库
  6. 报告 - 汇总每个远程仓库的推送结果

标志

标志类型默认值说明
--remotesstringall要推送到的远程仓库,以逗号分隔
--excludestring-每个远程仓库的排除项:remote:path1,path2
--dry-runboolfalse预览推送计划,但不执行
--forceboolfalse对有排除项的远程仓库执行强制推送
--no-verifyboolfalse跳过推送前钩子

阶段 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>
筛选后推送(含排除项)

需要为特定远程仓库排除路径时:

  1. 暂存未提交的更改(如果存在)
  2. 创建临时分支:git checkout -b tmp-push-<remote>-$$ <branch>
  3. 从索引中移除排除路径:git rm -rf --cached <paths>(如果路径不存在,则忽略错误)
  4. 提交移除操作:git commit -m "tmp: remove excluded paths for <remote> push" --allow-empty
  5. 强制推送临时分支:git push <remote> tmp-push-<remote>-$$:<branch> --force
  6. 返回原分支:git checkout <branch>
  7. 删除临时分支:git branch -D tmp-push-<remote>-$$
  8. 如适用,恢复暂存的更改

执行前展示计划:

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:执行推送

按顺序对每个远程仓库执行推送计划:

  1. 按顺序推送到每个远程仓库
  2. 分别报告成功或失败
  3. 失败时:记录错误,并继续处理其余远程仓库
  4. 清理所有临时分支

阶段 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