重命名本地不存在的远程分支

时间:2013-03-31 17:09:17

标签: git bitbucket

我对git比较新。我正在使用bitbucket作为我的远程存储库。尝试将我的所有分支转换为标签后,我处于一个混乱的状态。我在bitbucket上的状态我有与分支同名的标签。我想删除无关的远程分支。

在当地,我有我想要的东西:

> git branch
* master

> git tag
1.1.0
1.2.0
1.3.0
1.3.1
1.3.2
2.0.1

到目前为止一切顺利。

然而,在bitbucket上,我有:

分支:

1.1.0
1.2.0
1.3.0
1.3.1
1.3.2
2.0.1
master

标记:

1.1.0
1.2.0
1.3.0
1.3.1
1.3.2
2.0.1

我想删除除master之外的所有远程分支。我该怎么做?

感谢。

3 个答案:

答案 0 :(得分:2)

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote

答案 1 :(得分:1)

要删除远程对象,您必须不对其进行任何操作 - 例如,

git push origin :master

将删除任何名为" master"在远程存储库中。

现在的事实是"主人"这里只是快捷方式,用于该引用的完整真实姓名,即" refs / heads / master"。标签位于" refs / tags"命名空间,所以如果你碰巧同时拥有一个名为" foo"的分支和标签。在远程存储库中,您可以使用要删除的对象的全名来消除任何歧义。

血腥细节详见gitrevisions(7) manual page

因此,要删除除master之外的所有远程分支,您必须执行以下操作:

git push origin :refs/heads/1.1.0 :refs/heads/1.2.0 ...

你可以尝试通过采用一些小的黑客来减少乏味:

$ ( while read b; do echo :refs/heads/$b; done | xargs git push origin )
1.1.0
1.2.0
1.3.0
1.3.1
1.3.2
2.0.1
^D

(^ D这里的意思是按ctrl-d表示子shell的输入结束。)


P.S。 顺便说一句,我认为,因为Git在提取时支持通配符refspecs,比如

git fetch origin '+refs/heads/*:refs/heads/*'

也适用于推动。但似乎它没有 - 至少

git push origin ':refs/tags/*'
使用Git 1.8.1

对我来说似乎不起作用。

答案 2 :(得分:0)

删除远程分支/标记的语法是:

git push REMOTE_NAME :BRANCH_NAME

如果标签或分支具有相同的名称,我不确定它们是否具有首选项。

更具体地说,您可以使用refs/heads refspec说明符指定它是一个分支:

git push REMOTE_NAME :refs/heads/BRANCH_NAME

假设您的遥控器名为origin,此命令应删除您提到的所有分支:

for branch_name in 1.1.0 1.2.0 1.3.0 1.3.1 1.3.2 2.0.1; do
    git push origin :refs/heads/$branch_name
done