2019年7月11日木曜日

[GitHub] Squash and merge したブランチを自動でまとめて消す



PR を普通にマージしたときは、merged なブランチを列挙して branch -d すればよかったのですが、
(こんな感じ: git branch --merged | grep -v \\* | grep / | xargs -I % git branch -d %)
「Squash and merge」すると、実際にブランチをマージしているわけではないので、branch --merged に列挙されず、上記方法でお掃除できずに困ってました。

結構、ローカルブランチが溜まってきたのでお掃除したいなーと思い、調べてみたらドンピシャな記事がありました。
GitHub で Squash merge されたブランチを削除する · ryym.log

詳しいことは、こちらの記事を読んでいただければと思います。


で、これで終わると、この記事自体の内容がないよう、となってしまうので、自分好みにカスタムした alias をおいておきます。

del-squashed-branch = "!f(){ base_branch=${1:-master} && echo ${base_branch} && git checkout -q ${base_branch} && git for-each-ref refs/heads/ "--format=%(refname:short)" | while read branch; do mergeBase=$(git merge-base origin/${base_branch} $branch) && [[ $(git cherry origin/${base_branch} $(git commit-tree $(git rev-parse $branch^{tree}) -p $mergeBase -m _)) == "-"* ]] && git branch -D $branch; done; git checkout -q -;};f"
  del-sq = !git del-squashed-branch `git def-branch`
  def-branch = !git ls-remote --symref origin HEAD | head -n 1 | cut -f 1 | cut -d "/" -f 3-

もとの shell command だと master との比較になってましたが、他のブランチを指定できるようにしました。
iutest の開発中は develop に PR 出して、ある程度安定したら master にマージするようにしているので、
develop ブランチを指定して、お掃除したかったのでこうしました。

また、短いエイリアスの方はデフォルトブランチを指定するようにしました。
(これは仕事のときに使うことを想定してこうした)

今回は以上です。


追記
git symbolic-ref --short refs/remotes/origin/HEAD | cut -d "/" -f 2
では正しく GitHub のデフォルトブランチを取得できてませんでした。
git ls-remote --symref origin HEAD | head -n 1 | cut -f 1 | cut -d "/" -f 3-
に修正しました。


0 件のコメント:

コメントを投稿