リモートで既にマージしているブランチをWindowsで一括削除する方法が無かったので作成ました。
この記事は以下のサイトを参考にしています。Linuxをお使いの方は以下のサイトを参照してください。
コマンドの使い方
注意
このコマンドを実行したことにより、作成中のコードが消失するなどの損害が発生しても筆者は一切責任を負いません。
コマンド実行前に必ず全ブランチの変更(コミット)をリモートにプッシュしてください!!!
- コマンド実行前に、必ずデフォルトブランチ(mainブランチなど)にチェックアウトする
- 未コミットのファイルの対応などユーザーの判断が必要になることもあるので、チェックアウトは自動化していない
- 以下のコマンドを実行する
ブランチ削除コマンド
$encTemp = [Console]::OutputEncoding; try { [Console]::OutputEncoding = [Text.Encoding]::UTF8; git fetch -p && git pull && git branch -vv | Select-String "^\s*(.+?)\s+?[0-9a-f]+?\s+?\[.+?: gone\]" | ForEach-Object { $_.Matches.Groups[1].Value } | % { git branch -d $_ };} finally { [Console]::OutputEncoding = $encTemp; }
コマンドの説明
-
$encTemp = [Console]::OutputEncoding;
- 後述のパイプ内文字コード変更のために、既存の文字コード設定をバックアップしています
-
try
- 例外処理のトライ
-
[Console]::OutputEncoding = [Text.Encoding]::UTF8;
- パイプ内の文字コードをUTF-8に変更しています
- これをしないと、後述の
git branch
の結果をSelect-Stringに処理させることができません
-
git fetch -p
- リモートブランチの変更を同期(フェッチ)しています
- 削除されたリモートブランチの状態もここで取得しています
-
git pull
- デフォルトブランチの変更をプルします
- これをしないと後述のブランチ削除処理が不完全になった記憶(うろ覚え)
-
git branch -vv
- ブランチの一覧を出力します
-
Select-String "^\s*(.+?)\s+?[0-9a-f]+?\s+?\[.+?: gone\]"
- 出力されたブランチ一覧から、リモートでマージ済みのブランチ名を抽出します
-
ForEach-Object { $_.Matches.Groups[1].Value } | % { git branch -d $_ };
- 前処理で抽出したブランチ名を使用して、そのブランチを全て削除します
-
finally
- tryと一緒に使用しているfinally句
- 途中でエラーが発生しても必ず実行する処理を後ろに記載しています
-
[Console]::OutputEncoding = $encTemp;
- 最初に変更した文字コードの設定を元に戻します