首页 > 解决方案 > 如何删除名称包含大括号的标签?

问题描述

在遥控器上显示标签

$ git ls-remote --tags origin
.....
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx refs/tags/v1.0.7^{}
.....

怎么去掉这个标签?

我努力了:

$ git push --delete origin v1.0.7^{}
fatal: invalid refspec ':v1.0.7^{}'

标签: git

解决方案


标记名称是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。


推荐阅读