🔪

荒れに荒れたGitリモートブランチを成敗する

2020/10/06に公開

以前、わりと大きめなプロダクトの保守を頼まれたことがあったのですが、とんでもない数のリモートブランチが存在していて目眩がしたことがありました。その際にした対処について書いてみます。

現状把握

まずはリモートブランチ数をカウントしてみます。

git branch -r | wc -l

出力: 635

うわあ(ドン引き)
保守するの俺1人なんだけど…

コミット履歴を追ってみたところ、主に2種類のブランチが放置されていました。

  • マージ済みなのに未削除のブランチ
  • 開発途中で投げ出されたブランチ

このうち、(masterに)マージ済みなのに未削除のブランチ数をカウントしてみます。

git branch -r --merged | grep -vE '^\*|master$' | wc -l

出力: 529

🤬

悪・即・斬

マージ済みのリモートブランチの削除

マージ済みブランチには問答無用で消えてもらいます。

git branch -r --merged | grep -vE '^\*|master$' | sed -e 's% *origin/%%' | xargs -I% git push origin :%

これで削除できました。もう一度カウントしてみます。

git branch -r --merged | grep -vE '^\*|master$' | wc -l

出力: 0

☺️

リモートブランチの一括改名

次はこちら

開発途中で投げ出されたブランチ

この対処ですが、消してはまずいブランチが万が一ある可能性があるので、ブランチ名を変更することにしました。

ブランチ名にはディレクトリ構造が使える(/で区切れる)ので、特定のディレクトリにまとめて突っ込むことにします。頭文字がアルファベットの早いものだと一覧表示した際に邪魔になるのでできれば後ろの方にしたかったのと、小さじ1杯程度の憎しみを込めて、ブランチ名の先頭にzombie/をつけることにしました。

git branch -r --no-merged | grep -vE '^\*|master|zombie/' | sed -e 's% *origin/%%' | xargs -I% sh -c 'git branch zombie/% origin/% && git push origin :% && git push origin zombie/% && git branch -D zombie/%'

改名したくないブランチがある場合は、grep -vE '^\*|master|zombie/' の部分に追加してください。

まとめ

ブランチは要らなくなったら消そうね。

Discussion