如何在git中删除格式不正确的远程分支/标签?

3

我不知道是怎么回事,但当我运行git ls-remote命令时,我们的远程代码库出现了以下这种命名的分支和标签:

refs/heads/abc^{}
refs/tags/def^{}

我似乎无法以常规方式删除它们:

git push origin :refs/heads/abc^{} 
fatal: remote part of refspec is not a valid name in :refs/heads/abc^{}

我该如何删除这些格式不正确的远程分支?

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tim Biegeleisen
@Tim Gitlab。我在那里看不到一个用于执行它的界面。 - Magnus
你尝试过简单地使用 git push origin :abc^{} 吗?你正在使用哪个服务? - isherwood
@isherwood 是的,我也尝试了缩写的 push。不确定你所说的“service”是什么意思?我正在使用 Gitlab。 - Magnus
@VonC,你以前见过这个问题吗? - Tim Biegeleisen
1个回答

2

那不是一个分支,而是一次不良分支的结果:

server$ echo echo 2e79bc84c11eda5d73add5a9dfc6bf03c50c432d > refs/heads/oogly

在这种情况下,我选择的SHA-1是一个带注释的标签。你无法让“git branch”或“git checkout”指向标签,它们总是会转向提交,但你可以让非Git感知工具(比如在这种情况下的echo)制作破损分支。
然后,在客户端:
client$ git ls-remote
[snip]
d1574b852963482d4b482992ad6343691082412f    refs/heads/master
2e79bc84c11eda5d73add5a9dfc6bf03c50c432d    refs/heads/oogly
676699a0e0cdfd97521f3524c763222f1c30a094    refs/heads/oogly^{}
[snip]

在服务器上删除实际分支(在此情况下为oogly,在您的情况下为abc)将使“去皮标签”也在客户端消失。请注意,如果您想保存标签,则应该指向一个标签,如果还没有标签。

我不知道这是如何在服务器上创建的。

请注意,这对于(带注释的)标签来说是完全正常的:服务器同时提供标签及其SHA-1和指向其所指向的底层对象的SHA-1。语法在gitrevisions中有文档记录:

   <rev>^{}, e.g. v0.99.8^{}
       A suffix ^ followed by an empty brace pair means the object could
       be a tag, and dereference the tag recursively until a non-tag
       object is found.

有趣!你的技巧奏效了...我创建了一个临时标签来保存位置,然后删除了底层的refs/heads/abc分支,正如你所预测的那样,它与坏的分支/标签具有1:1的对应关系,最后重新创建了标签/分支。成功了! - Magnus
抱歉我必须回溯一下:1)其中一些格式不正确的分支实际上已经是标签了,2)删除底层标签可以解决问题,但是推送新创建的替换标签会再次出现问题! - Magnus

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