git-svn で取り残されたリモートブランチを削除するスクリプトをつくった
ローカルは git(git-svn)、サーバ(リモート)は svn な構成で開発している時に、 外でブランチを削除した際にローカルで fetch とかして git branch -r してもリストに出続けてうざい。。
git svn fetch は存在しないブランチの削除まではしてくれないんすね。。
で、いつの間にか削除されたリモートブランチが大量に残ってしまっていちいち確認してチマチマ削除するのが面倒なのでスクリプトをつくってみた。
(実は削除するオプションとかあったらどうしよ。。。)
~/bin/git-svn-br-rm
パスが通ったところに git-svn-br-rm というファイルで下記シェルスクリプトを設置する
#!/bin/sh repo_url=`git svn info | grep 'URL:' | awk '{print $2}' | perl -pi -e "s/(branches|trunk|tags).*/branches/g"` svn_list=`svn list $repo_url | awk -F'/' '{print $1}'`; git_list=`git br -r | grep -v 'trunk\|tags\/'`; perl -e "@a=qw/ `echo $svn_list` /; @b=qw/ `echo $git_list` /; @diff=grep{!{map{\$_,1}@a}->{\$_}}@b; print join(\"\n\", @diff);" | \ awk '{print "git branch -D -r "$1"\nrm -rf ./.git/svn/refs/remotes/"$1}'
使い方
$ cd path/to/git-svn-working-directory $ git svn-br-rm git branch -D -r dev-Foo-iss1234 rm -rf ./.git/svn/refs/remotes/dev-Foo-iss1234 git branch -D -r dev-Bar-iss777 rm -rf ./.git/svn/refs/remotes/dev-Bar-iss777
ビビりなので実行はせずに削除するコマンドを吐き出すだけです。
dry_run の意味も込めて。。
実行したい時はパイプで sh に渡せば OK
$ git svn-br-rm | sh
※tagsは基本消すことがないので対応してないです;-(