Git-svn:批量删除孤立的远程分支

时间:2011-05-06 17:01:21

标签: git git-svn

我正在研究的S​​VN中的一个项目(通过git-svn)经常创建分支,然后用trunk重新整合,然后删除。

现在该项目有大约10个尚未删除的分支,但在git中,git branch -r显示大约50个。

我可以一次删除这些,检查它们是否仍然存在于svn存储库中,但它是缓慢而乏味的。有没有办法将我的git远程分支列表与svn repo同步?

3 个答案:

答案 0 :(得分:21)

这是我在几分钟内制作的快速解决方案。它利用了各地都无法提供的漂亮的正则表达式模式。

这抓住了一个干净的分支列表。我删除每行开头的格式空格,我现在忽略了标记:

git branch -r | sed 's|^[[:space:]]*||' | grep -v '^tags/' > git-branch-list

我从svn中获取了一个类似的分支列表,再次删除了格式和尾随正斜杠:

svn ls svn://path/to/branch/dir/ | sed 's|^[[:space:]]*||' | sed 's|/$||' > svn-branch-list

我对列表进行区分,找到svn列表中不存在的行,删除diff格式,摆脱“trunk”分支(这是一个git-svn方便)并将结果保存到新名单:

diff -u git-branch-list svn-branch-list | grep '^-' | sed 's|^-||' | grep -v '^trunk$' | grep -v '^--' > old-branch-list

现在我只为git-svn执行标准的分支删除程序:

for i in `cat old-branch-list`; do git branch -d -r "$i"; rm -rf .git/svn/refs/remotes/"$i"; done

这可能是更好的方法,但它确实有效。欢迎其他人接受并改进。

答案 1 :(得分:1)

为了获得更多相关答案,请说明您的分支列表看起来是什么(git branch -a)以及您希望哪些内容消失。

在没有这个的情况下,我只会做一些事情,以便你能够适应:

删除过时的引用(大概是在手动删除遥控器后?):

git for-each-ref --format="%(refname)" refs/obsoleteremote/ |
    xargs -n 1 git update-ref -d

Garbage使用

收集所有未引用的对象
git gc --prune=now

或者如果你的git-gc不足以支持--prune的参数,请使用

git repack -ad; git prune

答案 2 :(得分:0)

这是我的解决方案。需要在分支名称和Git分支列表中的前导空格中替换Subversion使用的尾部斜杠。 IFS应该处理分支名称本身内的空格。

cd $git_repo  
IFS="$(printf '\n')"; diff <(for i in `git branch -r`; do echo "$i" | sed 's/^  //g'; done | sort) <(for i in `svn ls http://host/my/svn/dir/branches`; do echo "$i" | sed 's/\/$//g'; done | sort) | grep '<' | cut -d' ' -f2 | xargs /usr/bin/git branch -r -d