Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

指定日以前の不要ブランチをまとめて消す

前回の続きっぽい記事です。

手当たり次第ブランチを切りまくっていると、問題になってくるのが不要ブランチの処分。
実験用のお砂場として弄り回した果てに存在すら忘れていたのがチラホラ...
以前も似たような事をやりましたが、あのバージョンだと日付以降の設定ができなかったり...とやや使い勝手が悪いです。
今回はgit標準のコマンドfor-each-refとUNIXツールを上手く活用して日付指定つきのブランチ削除に挑戦します。

実例:remotes/originにある2014年6月1日以前のブランチを消す(主要なものは除外)

git for-each-ref --sort=-committerdate refs/remotes/origin --format='%(authordate:short) %(refname)' > .tmpdata.txt

として一時データをおきます。

2014-07-02 refs/remotes/origin/f/bdd_cases
2014-05-10 refs/remotes/origin/f/a
2014-04-27 refs/remotes/origin/f/b
2014-04-19 refs/remotes/origin/f/c
2014-04-19 refs/remotes/origin/fix/a
...
2014-03-27 refs/remotes/origin/master

これを、awkを使ってコマンド化します。

awk '$1 < "2014-06-01" && $2 !~ /master/ {print $2}' .tmpdata.txt | sed -e "s/^refs\/remotes\/origin\//git push \:/" > cmd.bash

間違って重要ブランチを吹っ飛ばさないよう、awkの条件式で点検。
複雑化を嫌う場合にはコマンド化のあとにsedで除去するのも手かもしれません。
ともかく、終われば

$ cat cmd.bash
git push origin :f/a
git push origin :f/b
git push origin :f/c
git push origin :fix/a
...

というものができるので...
しめやかに実行。サヨナラ!

$ source cmd.bash 
To git@bitbucket.org:hogehoge/sample.git
 - [deleted]         f/a
To git@bitbucket.org:hogehoge/sample.git
 - [deleted]         f/b
...