🧼

ローカルに潜むリモートで削除済みのブランチを安全に一括で削除したいとき

2023/11/30に公開

いますよね。あなたの手元にも、きっと。
リモートではとっくに削除されたのに、ローカルにはいつまでも潜んでいる ████ のようなブランチが...

スクリプト

そんなとき、これが便利です(Gist にあるのでよければ使ってください)。

説明

要素ごとに補足します。

  • git fetch --prune:リモートリポジトリで(PR のマージなどによって)削除されたブランチに対応するリモート追跡ブランチを、ローカルから削除する。
  • git branch -vv:ローカルのブランチ一覧をアップストリームブランチと共に出力する。
  • grep ': gone]':出力の中で ": gone]" という文字列を含む行を検索する。これはリモートリポジトリで削除されたブランチの行に一致する。
  • awk '{print $1}':hit した各行からスペースで区切られた最初のフィールド(作業ブランチ名)を抽出する。
  • xargs -r git branch -d:xargs でコマンドライン引数を引き継ぎ、各作業ブランチをローカルから削除する。-r オプションで削除対象がない場合に不要にコマンドが実行されることを防ぐ。

つまり、上記は「リモートリポジトリで削除されたブランチに対応する、ローカルのリモート追跡ブランチ/作業ブランチを安全に一括削除する」スクリプトです。

削除されるのはあくまでもアップストリームブランチが設定されているブランチのみです。すなわち、リモートリポジトリでの削除が追跡できたものに限定されるため、一度も push されていないブランチが誤って削除されることもありません。

おまけ

私の場合は以下のワンライナーをエイリアス登録しています。
月曜日の朝に実行すると気持ちよく一週間をスタートできますね!(ただし個人差あり)

git fetch --prune && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d
GitHubで編集を提案

Discussion