git - 如何删除名称包含大括号的标签?
问题描述
在遥控器上显示标签
$ git ls-remote --tags origin
.....
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx refs/tags/v1.0.7^{}
.....
怎么去掉这个标签?
我努力了:
$ git push --delete origin v1.0.7^{}
fatal: invalid refspec ':v1.0.7^{}'
解决方案
标记名称是v1.0.7
。
当你使用 时git ls-remote
,Git 会显示标签本身的目标对象,以及标签指向的更基础的对象。如果标签是轻量级标签,那么这两个在定义上是同一个东西,你只会看到一个项目:
04c6e9e9ca34226db095bbaa1218030f99f0b7c6 refs/tags/foo
然而,当标签是带注释的标签时,它指向的对象是带注释的标签对象——根据定义,它必须是,否则标签将是轻量级标签——并且该带注释的标签对象具有另一个底层对象。
^{}
如gitrevisions 文档中所述,查找底层对象的语法是在标签名称后加上.
<rev>^{},例如v0.99.8^{}
后缀 ^ 后跟一个空括号对意味着对象可以是一个标签,并递归地取消引用该标签,直到找到一个非标签对象。
因此:
$ git rev-parse v2.21.0
2bb64867dc05d9a8432488ddc1d22a194cee4d31
$ git rev-parse v2.21.0^{}
8104ec994ea3849a968b4667d072fedd1e688642
和:
$ git show v2.21.0 | head -3 | sed 's/@/ /'
tag v2.21.0
Tagger: Junio C Hamano <gitster pobox.com>
Date: Sun Feb 24 07:55:39 2019 -0800
$ git show v2.21.0^{} | head -3 | sed 's/@/ /'
commit 8104ec994ea3849a968b4667d072fedd1e688642
Author: Junio C Hamano <gitster pobox.com>
Date: Sun Feb 24 07:55:19 2019 -0800
这v2.21.0
是标签。该名称标识内部 Git 对象2bb64867dc05d9a8432488ddc1d22a194cee4d31
,该对象是带注释的标记对象:
$ git cat-file -t 2bb64867dc05d9a8432488ddc1d22a194cee4d31
tag
然后标记对象继续识别提交对象8104ec994ea3849a968b4667d072fedd1e688642
。因此,输出git ls-remote
包括:
2bb64867dc05d9a8432488ddc1d22a194cee4d31 refs/tags/v2.21.0
8104ec994ea3849a968b4667d072fedd1e688642 refs/tags/v2.21.0^{}
第一个是标签;第二个是底层提交。一个标签名称v2.21.0
意味着两件事,这取决于你如何询问 Git。