読者です 読者をやめる 読者になる 読者になる

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は基本消すことがないので対応してないです;-(