長い間整備されていないリポジトリに対して、いくつかのブランチを残しつつ、大部分のブランチを削除する作業をしたので、メモを残す。
やり方は以下。
- コマンドで、全既存ブランチ名をテキストファイルに書き込む。
- 手動で、テキストファイルから残したいブランチを削除する(削除したいブランチを残すことに注意)。
- コマンドで、テキストファイルをインプットとして、ブランチを一括削除する。
※わざわざ一度テキストファイルに書き込んでから消したいブランチを選別している理由は、今回の場合残す必要のあるブランチが少数かつ特にそれぞれに規則性があるわけではなかったので、テキストファイルから目視で選別するのが効率的だと考えたからだ。逆に、消したいブランチ(あるいは残したいブランチ)の数が多すぎて手動でのピックアップが大変だったり、ブランチに規則性があって上手いことコマンドなどで一括指定できる場合はそうすれば良い。
# ブランチ名一覧を一旦テキストファイルに書き込む。
git branch -a -r --sort=refname --format="%(refname:short)" > deleteBranches.txt
# deleteBranches.txtから残したいブランチを取り除く(削除したいブランチを残すことに注意)
# deleteBranches.txtからブランチ名先頭の“ref/remotes/origin”を削除しておく。VSCodeとかなら複数行操作ができるので一気に消せるはず
# cat + xragsを使って一括削除。ブランチ数が多い場合はコマンド実行後に一定時間待つ必要あり。(参考:消去ブランチ数200程度で3~5分かかった)
# originのところは人によって異なる可能性あり。適宜指定する。
cat deleteBranches.txt | xargs git push --delete origin
ちなみに削除後はリポジトリをローカルにクローンしている人全員に、リモートと状態をあわせてもらうことなると思います。コマンドは以下です。GUIのGitクライアント使ってる場合は普通にFetchボタン押せば大丈夫だと思います。
git fetch --prune
既存ブランチの一覧化
複数人で開発しているリポジトリだと、どのブランチを消せばよいか事前にメンバーに聞く必要があると思います。メンバーも忙しいし昔のことは覚えてないと思うので一覧表をつくってあげると良いでしょう。以下の様なコマンドで、作成者、ブランチ名、最終更新日の表をさっとつくれます。
# --sort, --formatの中身は適宜調整してください。
git branch -a --sort=authorname --format="%(authorname),%(refname),%(authordate:short)" > branches.csv
xargsの解説
xargs
は標準入力やファイルからリストを読み込み、コマンドラインを作成して実行するコマンドです。ここではcatの結果をパイプで渡してます。
ちなみに、xrags
の後に続くコマンドの引数によって動作が変わります。今回のgit push
コマンドのような引数を1つ受け取るコマンドの場合は、同じコマンドが行数分実行されます。
git push --delete origin branchA
git push --delete origin branchB
git push --delete origin branchC
(...以下渡された行数分実行される)
引数が複数のコマンドの場合は、1行が1引数の形でコマンドが実行されます。便利ですねxargs
。