2011-09-15 53 views
2

我的正常模式是从主分支,做了大量的工作,然后rebase和git svn dcommit。我怎样才能清理我所有的旧分支?删除已经承诺的git分支

基本上我想找到在邮件中有git-svn-id:的那些分支和git branch -D那些。

注意:git branch --no-color --no-track --merged让我大部分的方式,但如果我遇到了我需要一个git fetch -f(因为一个疯狂的git-svn bug)的情况,我将不得不自己重新绑定所有分支。

+0

不应该所有的分支都有git-svn-id:在提交消息中?或者你指的是最新的提交? – prusswan

+0

是的,HEAD将只有一个'git-svn-id',如果已经合并 –

+0

好吧,那么我想这是使用一些批处理文件来列出本地分支并检查它们的情况。我可能会单独进行删除操作,因为它的风险很大 – prusswan

回答

0

一个排序的一班轮:

git for-each-ref --format='%(refname:short)' refs/heads | 
while read branch; do 
    if git show -s $branch | grep 'git-svn-id:'; then 
     git branch -D $branch 
    fi 
done 

请注意,这是未经测试;我不使用git-svn,它只是基于你问题第二段的要求。您可以先尝试使用echo而不是git branch -D,以确保分支列表看起来像您期望的。我可以在必要时帮助完善它。

+0

完美工作。你可以将它格式化为包含在.gitconfig中,这样我可以执行'git gcbr'并且它会清理我的分支? –

+0

@PaulTarjan:对于任何不重要的东西,最好将它放在一个名为'git-gcbr'的脚本的某个位置,以便稍后可以读取和编辑它。这也使得更容易做一些事情,比如增加一个干运行/强制选项,以防你想谨慎行事。 (或者你可以让它回显分支名称,检查并管道到'xargs git branch -D',我想。) – Cascabel