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 リポジトリではない | エラーで終了します |
| リモートが見つからない | 利用可能なリモートとともにエラーを表示します |
| 未コミットの変更がある | 警告し、コミットするか続行するか尋ねます |
| プッシュが拒否された(non-fast-forward) | 先にプルするよう提案し、自動で強制プッシュすることはありません |
| main/master への強制プッシュ | 明示的な確認を必須とします |
| 一時ブランチのクリーンアップに失敗 | ユーザーに警告し、クリーンアップ用コマンドを提示します |
| ネットワーク障害 | 成功または失敗したリモートを報告します |
安全策
- ユーザーの明示的な同意なしに main/master へ強制プッシュしません
- 実行前に必ずプッシュ計画を表示します
- 失敗した場合も一時ブランチをクリーンアップします
- 失敗した場合も退避した変更を復元します
- 初回使用時、フィルタリングしたプッシュはデフォルトでドライランにします
- 一時コミットがソースブランチの履歴に現れることはありません
ツール連携
- Bash - すべての git 操作
- Read - リモート設定を確認するために
.git/configを調査します
コメント
Markdown 対応