【小ネタ】消し忘れのリモートブランチを一括表示・削除するワンライナー

2020.02.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさまリモートリポジトリに消し忘れのブランチはありませんか??

「1年以上の前のブランチ」「自分が作成していない詳細不明のブランチ」などが残っていて、消して良いかもわからない。。。。なんてことあるのではないでしょうか。

通常GitHubなどでfeatureブランチをpushしてpull requestがマージされれば、リモートのfeatureブランチは削除されます。が、

  • リモートにpushしたけど結局pull request作成しなかった
  • リモートにpushしてpull request作成したけど、必要なかったのでそのままクローズした
  • GitHubのブラウザからrevert commit作成したけど、やっぱり使わなかった

などの場合、リモートにブランチが残ります。

そこで今回は、「リモートブランチの詳細を一覧表示」したり、「マージ済みのリモートブランチを一括削除」したりするコマンド(ワンライナー)をいくつか紹介したいと思います。

ワンライナー

※そのままでは利用できない場合は、いい感じに編集してあげてください。

マージされずに残っているリモートブランチ一覧の詳細を取得

$ git branch -v -r --no-merged | grep -v -e master | awk -F ' ' '{print$2}' | xargs -i git show -s --format='%h,%cn,%s,%D,%cd' {}

0d772dd,cm-arais,add feature_2,origin/feature_2, feature_2,Fri Feb 28 20:38:03 2020 +0900
c1d4e27,GitHub,Revert "add feature_1",origin/revert-1-feature_1,Fri Feb 28 20:54:40 2020 +0900
...省略

masterブランチにマージされたが、まだ残っているリモートブランチ一覧の詳細を取得

$ git branch -v -r --merged origin/master | grep -v -e master | awk -F ' ' '{print$2}' | xargs -i git show -s --format='%h,%cn,%s,%D,%cd' {}

1227ff4,cm-arais,add feature_1,origin/feature_1, feature_1,Fri Feb 28 20:35:12 2020 +0900
...省略

masterブランチにマージされたが、まだ残っているリモートブランチ一覧を削除する

$ git branch -r --merged origin/master | grep -v -e master  | sed -e 's/origin\///g' | xargs -i git push -d origin {}

To github.com-cm:cm-arais/git_remove_merged_branch.git
 - [deleted]         feature_1
...省略

解説

gitコマンド

  • git branch -r

-rもしくは--remotesでリモートブランチの一覧を表示します。

  • git branch -v

-vもしくは--verboseでブランチの詳細情報を表示します。 コミットIDはブランチの先頭のコミットになります。

  • git branch --merged

マージ済みのブランチの一覧を表示します。 ちなみに、未マージのブランチは--no--mergedで表示できます。

  • git show -s

該当コミットIDの詳細を表示します。 通常diffが表示されるのですが、-sでこれを無効化します。

  • git show --format='%h,%cn,%s,%D,%cd'

該当コミットIDの詳細を指定フォーマットで出力できます。詳細はこちらを確認してください。

今回は、コミッター名%cnやコミット日時%cdなどの情報が欲しかったので入れています。

  • git push -d origin <branch_name>

対象のリモートブランチを削除します。

grepコマンド

  • grep -v -e master

-vで一致しないものを検索できます。 -eで検索ワードを指定します。

sedコマンド

  • sed -e 's/origin\///g'

文字列を置換しています。 リモートブランチの削除でorigin/が不要なのでここで取り除いています。

awkコマンド

  • awk -F ' ' '{print$2}'

-Fで区切り文字を指定して、2番目の列の文字を取得しています。

xargsコマンド

  • xargs -i <command> {}

標準入力を読み込み、それを引数として指定したコマンドを並列実行できます。

-i-I {}は同じ意味です。 パイプで渡ってきたデータが{}に置き換えられます。

余談

リモートブランチが消えてたのにローカルに残っている! という方はこちらを参考にするかと良いと思います。

私はホームディレクトリの.gitconfigに下記を追加しました。

[fetch]
    prune = true

まとめ

いかがだったでしょうか。

やはり、awkからのxargsって便利ですよね。

以上、どなたかの役に立てば幸いです。