0

我对 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之外的所有远程分支。我该怎么做呢?

谢谢。

4

3 回答 3

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
于 2016-09-16T05:40:53.183 回答
1

要删除远程对象,您无需向其推送任何内容——例如,

git push origin :master

将删除远程存储库中名为“master”的任何内容。

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

gitrevisions(7)手册页中描述了血淋淋的细节。

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

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

您可以尝试通过使用一点 shell hack 来减少这种乏味:

$ ( 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以指示子外壳的输入结束)。


PS顺便说一句,我认为由于Git在获取时支持通配符refspecs,例如

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

这也适用于推动。但似乎没有——至少

git push origin ':refs/tags/*'

Git 1.8.1 似乎不适用于我。

于 2013-03-31T18:40:04.093 回答
0

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

git push REMOTE_NAME :BRANCH_NAME

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

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

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
于 2013-03-31T18:41:35.773 回答