我正在研究的SVN中的一个项目(通过git-svn)经常创建分支,然后用trunk重新整合,然后删除。
现在该项目有大约10个尚未删除的分支,但在git中,git branch -r显示大约50个。
我可以一次删除这些,检查它们是否仍然存在于svn存储库中,但它是缓慢而乏味的。有没有办法将我的git远程分支列表与svn repo同步?
答案 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