24

将 git 标签“1.0”重命名为“1.5”后

git tag 1.5 1.0
git tag -d 1.0
git push origin :refs/tags/1.0

我的 git 存储库似乎处于不一致的状态。这是git describe输出:

warning: tag '1.0' is really '1.5' here
1.0-97-g88085b2

1.5-...它现在应该返回

git fsck --tags输出:

Checking object directories: 100% (256/256), done.
tagged commit aad9477bba4bcf44ea34ea9693aeffc98527ff01 (1.0) in b96ce67583239e198f9e2aff5175176d65779044
Checking objects: 100% (3975/3975), done.

如何删除对已删除标签的悬空引用?这是重命名标签的正确方法吗?

4

4 回答 4

34

几分钟前我遇到了同样的问题。已经提出的答案都没有涉及真正的问题,即摆脱消息warning: tag 'foo' is really 'bar' heregit describe仅列出标签的新名称。这在我的情况下尤其重要,因为我的构建系统用于git describe将用于构建构建的源记录到构建中。

复制问题

我可以通过这样做来复制问题:

$ git tag foo --annotate -m"original message"
$ git tag bar foo
$ git tag -d foo
$ git describe 
warning: tag 'foo' is really 'bar' here
foo

--annotate上面的标志-m暗示是多余的--annotate,但我已经将其包括在内以强调。)我尝试使用轻量级标签复制问题,但无法这样做。所以要复制这个问题,注释是必要的。

解决问题

其中一些涉及推倒已经推倒的东西,但我发现自己同意大卫卡尔普的说法,他说

然而,有时不准确(混乱)历史的长期痛苦是不值得的,而短期痛苦是值得的。

一旦你被困住了warning: tag 'foo' is really 'bar' here,那么你必须这样做:

$ git tag bar bar -m"original message" --force
$ git describe 
bar

如果消息需要更改,请根据需要进行调整。

如果已推送旧标签,则删除旧标签:

$ git push origin :refs/tags/foo

如果新标签已被推送,则更新它:

$ git push origin refs/tags/bar

避免问题

为了首先避免这个问题,你必须创建bar

$ git tag bar foo -m"original message"
于 2014-09-04T18:49:39.823 回答
2

每当有人建议重写历史(或者在这种情况下,重新标记历史)时,重申标准的谨慎——如果你可以避免它,就不要这样做。

然而,有时不准确(混乱)历史的长期痛苦是不值得的,而短期痛苦是值得的。

如果是这种情况,下面的文章给出了所需的步骤:如何重命名已推送到远程 git Repo 的标签

基本步骤是:

git tag new_tag old_tag
git push --tags
git push origin :refs/tags/old_tag
git tag -d old_tag
于 2013-01-17T14:55:02.957 回答
1

不确定这会有多大用处,但我在使用release-it时遇到了这个警告。在我的远程仓库中,有相同标签名称的轻量级和带注释的标签条目:

$ git ls-remote --tags origin
302883ef0cb2df8975abfbd24bbe89f64cf3da31    refs/tags/0.0.1
4852192308b404d74d7a4088c19a4629299f6ea2    refs/tags/0.0.1^{}

(注意^{}第二个条目的标签名称之后)

这对于带注释的标签(?)似乎很正常,所以不要认为这本身就是问题,但是在我删除所有标签并重新标记所有内容后问题就消失了。例如对于上面的标签...

git tag -d 0.0.1                # Delete local tag
git push --delete origin 0.0.1  # Delete remote tag
git tag -a -m "" 0.0.1 4852192308b404d74d7a4088c19a4629299f6ea2  # Recreate [annotated] tag
git push --tags                 # Push tag(s) to remote repo
于 2019-03-11T21:56:37.317 回答
-3

不,我认为这不是 git 中标签的正确工作流程。

git 的一个基本规则是: 不要乱用你已经推送过的东西。

由于您已经推送了标签 1.0,因此您不想在本地将其重命名为 1.5,然后尝试推送它。将 1.0 标签留给后代,创建一个新的 1.5 标签,然后推送它。真的——这就是标签的用途。因此,您可以在 6 个月后重新创建您的软件在 1.0 版时的样子。

于 2013-01-17T14:28:16.593 回答