モヒカンメモ

髪色が定期的に変わることに定評のある(比較的)若者Webエンジニアの備忘録

【GitHub】 マージ済みのremote branchを一括削除するコマンド

GitHubへマージ済みブランチが貯まると git clone するのにかかる時間が増えてしまったり、ブランチ一覧からお目当てのブランチを探すのが面倒になるなど、地味に生産性を下げるのでこまめにお掃除するのがオススメ。

コマンド

$ git branch --remotes --merged | grep -v "origin/main" | sed -E 's/  origin\/(.*)/\1/' | xargs -I{} git push origin :{}

解説

(1) マージ済みのブランチ一覧を取ってくる

$ git branch --help
...
OPTIONS
...
       -r, --remotes
           List or delete (if used with -d) the remote-tracking branches. Combine with
           --list to match the optional pattern(s).
...
       --merged [<commit>]
           Only list branches whose tips are reachable from the specified commit (HEAD if
           not specified). Implies --list.
$ git branch --remotes --merged
  origin/some-merged-branch-1
  origin/some-merged-branch-2
  origin/some-merged-branch-3
  origin/main

(2) 消しちゃダメなブランチを取り除く

例えば main ブランチを残しておきたいなら

$ git branch --remotes --merged
  origin/some-merged-branch-1
  origin/some-merged-branch-2
  origin/some-merged-branch-3
  origin/main

$ git branch --remotes --merged | grep -v "origin/main"
  origin/some-merged-branch-1
  origin/some-merged-branch-2
  origin/some-merged-branch-3

(3) "origin/" 部分をtrimする

sedで origin/ 以降だけを正規表現の参照で取り出す

$ git branch --remotes --merged | grep -v "origin/main"
  origin/some-merged-branch-1
  origin/some-merged-branch-2
  origin/some-merged-branch-3

$ git branch --remotes --merged | grep -v "origin/main" | sed -E 's/  origin\/(.*)/\1/'
some-merged-branch-1
some-merged-branch-2
some-merged-branch-3

(4) remote branchを削除する

単体のブランチ削除コマンドとxargsを組み合わせて全部消していく

$ git push --help
...
       git push origin :experimental
           Find a ref that matches experimental in the origin repository (e.g.
           refs/heads/experimental), and delete it.
$ git branch --remotes --merged | grep -v "origin/main" | sed -E 's/  origin\/(.*)/\1/'
some-merged-branch-1
some-merged-branch-2
some-merged-branch-3

$ git branch --remotes --merged | grep -v "origin/main" | sed -E 's/  origin\/(.*)/\1/' | xargs -I{} git push origin :{}
remote:
To github.com:aaa/bbb.git
 - [deleted]         some-merged-branch-1
remote:
To github.com:aaa/bbb.git
 - [deleted]         some-merged-branch-2
remote:
To github.com:aaa/bbb.git
 - [deleted]         some-merged-branch-3

削除対象がたくさんあるときは、xargsに -P n を指定して並列度上げると短時間で終えられる。