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

时间:2012-08-30 08:18:53

标签: git

我无法移除名为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没有看到这个分支。


可以请任何人解释一下“幕后”会发生什么,我该如何删除这个分支?

4 个答案:

答案 0 :(得分:9)

试试这个:

git push origin :refs/heads/origin/featureBranch

您始终可以在refs/heads/下的技术名称中引用分支。

分支存储为.git/refs/下的小文本文件。本地分支位于.git/refs/heads/下,远程分支位于.git/refs/remotes/<remotename>/下。因此可以在master.git/refs/heads/master找到类似.git/refs/remotes/origin/master的简单分支,但您的错误分支实际上位于.git/refs/heads/origin/featureBranch下。它不会与origin存储库上的远程分支混淆,因为它不在refs/remotes/origin/下,而是在refs/heads/下。

在远程服务器上,origin/featureBranch分支是 local 到服务器,因此它将存储在refs/heads/下。当推送到给定分支时,您可以通过其名称或路径来识别它,因此如果名称不起作用,只需使用以refs开头的完整路径。

你是如何结束这个奇怪的分支名称的?我无法确定,因为我不知道你做了什么,但是当我使用git push --mirror时,我遇到了同样的问题,它推送了所有引用,包括远程引用,因此,它会创建一个origin/branchname作为本地分支。

答案 1 :(得分:2)

这应该有效:

$ git push origin :featureBranch

您已经指定了推送的位置,origin/只是您本地分支的名称。

背景:当git进行提取时,它会创建所谓的“远程跟踪分支”。 那些与你自己的分支没有什么不同,它们只是以远程名称(例如origin / master)为前缀,并在本地表示服务器分支(所有提交都已被提取)。

当您执行推送源时,您根本不是指本地远程跟踪分支,而是告诉Git“推送到源sourcebranch:targetbranch”

答案 2 :(得分: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输出中消失。您还可以使用origin检查分支是否在git ls-remote git@github.com:myCompany/my-repo.git上。

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

答案 3 :(得分:0)

只需将origin放在冒号后面:

git push origin :featureBranch

正如Michael解释的那样,这意味着将“无所事事”推向命名分支。 Here是一个更完整的解释。