GIT - 无法从远程仓库中删除特定分支

4

我无法删除名为origin/featureBranch的远程分支。我猜测这是因为分支名称以origin开头,但我不确定。

$ git branch -r | grep featureBranch
  origin/origin/featureBranch

$ git push origin :origin/featureBranch

    error: unable to push to unqualified destination: origin/featureBranch

    The destination refspec neither matches an existing ref on the remote nor
    begins with refs/, and we are unable to guess a prefix based on the source ref.

    error: failed to push some refs to 'git@github.com:myCompany/my-repo.git'

更新

$ git push origin :featureBranch 会得到同样的错误。

注意

在远程分支中是 origin/origin/myFeature,而本地分支是 origin/myFeature

我知道 origin 通常是什么意思,但在我的情况下 - 这是分支名称的一部分。

Github 没有看到这个分支。


请问是否有人可以向我解释这些背后发生了什么,并且如何删除这个分支?


@MichaelAnderson 对不起我的粗鲁 - 没有想伤害任何人。已更改说明 :) - Vitalii Zurian
4个回答

11

试一下这个:

git push origin :refs/heads/origin/featureBranch
你可以始终使用refs/heads/下的技术名称引用分支。分支存储为小文本文件,位于.git/refs/下。本地分支位于.git/refs/heads/下,远程分支位于.git/refs/remotes//下。例如简单的分支master将在.git/refs/heads/master.git/refs/remotes/origin/master找到,但是你的有问题的分支实际上会在.git/refs/heads/origin/featureBranch下,不会与origin存储库上的远程分支混淆,因为它不在refs/remotes/origin/下,而是在refs/heads/下。
在远程服务器上,origin/featureBranch分支是服务器本地的,因此它将存储在refs/heads/下。当推送到给定分支时,您可以通过名称或路径标识它,因此如果名称不起作用,只需使用以refs开头的完整路径。
你怎么会得到这么奇怪的分支名字呢?我不确定,因为我不知道你做了什么,但是当我使用git push --mirror时,我遇到了相同的问题,它会推送所有引用,包括远程引用,因此它将创建一个origin/branchname作为一个本地分支。

你是怎么得到这个奇怪的分支名称的?我正在与许多开发人员一起工作。有人创建了这个奇怪的名称,我不知道是谁、如何以及为什么 :) - Vitalii Zurian
@thecatontheflat 哦,我已经见过这种情况发生了半打次了。有人想检查源featureBranch分支,但使用了git checkout而不是git log,然后可能使用了他或她不理解的push.default设置进行了git push。这是新的git用户中非常常见的错误。 - Christopher
我不小心通过 git push origin myBranch:origin/master 或其他方式创建了这个问题,而您的建议解决了我的问题(出于某种原因还需要额外添加 "origin/")!谢谢。 - Kzqai

2

这应该可以正常工作:

$ git push origin :featureBranch

你已经指定了推送的位置,origin/只是你本地分支的名称。
背景:当Git执行fetch时,它会创建所谓的“远程跟踪分支”。这些分支与您自己的分支没有什么不同,只是以远程名称为前缀(例如origin/master),并在本地表示服务器分支(所有提交已经被获取)。
当你执行push origin时,你根本没有涉及到你本地的远程跟踪分支,而是告诉Git“把sourcebranch推送到targetbranch”。

1
请仔细查看我的问题 - 分支名称以 origin 开头,而不是远程存储库。在远程存储库中,它是 origin/origin/myFeature - Vitalii Zurian
哦,抱歉没看到。在这种情况下,我只需登录服务器并在本地删除分支。您可以进入裸克隆的存储库并执行git branch -D等操作。 - Tigraine

1

这段消息表示找不到任何匹配的分支。

The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.

如果我尝试删除分支两次,就会得到这个结果(第一次成功,第二次失败)。 或者如果该分支已被其他人删除。您可以尝试使用git remote prune,看看它是否从您的git branch -r输出中消失。您还可以使用git ls-remote git@github.com:myCompany/my-repo.git检查该分支是否在origin上。

origin/master这样奇怪(糟糕?)命名的分支在origin上删除对我来说完全没有问题:

$ git push origin master:origin/master
Counting objects: 3, done.
Writing objects: 100% (3/3), 218 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To ../bare/
 * [new branch]      master -> origin/master

$ git branch -r
  origin/origin/master

$ git push origin :origin/master
To ../bare/
 - [deleted]         origin/master

这取决于 Git 版本。我知道几个月前它曾经失败过,但现在似乎可以工作了。 - Sergiu Dumitriu
记录一下,我的 Git 版本是 1.7.3.2(不算很新,但也不算太老)。 - Michael Anderson
我在1.6.x版本中遇到了问题。 - Sergiu Dumitriu

0

只需在冒号后面放置origin

git push origin :featureBranch

正如Michael所解释的那样,这意味着将“nothing”推送到指定的分支。这里有一个更完整的解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接