重命名git标记会导致不一致
将git标记“1.0”重命名为“1.5”后,使用 我的git存储库似乎处于不一致的状态。以下是git descripe输出:重命名git标记会导致不一致,git,git-tag,Git,Git Tag,将git标记“1.0”重命名为“1.5”后,使用 我的git存储库似乎处于不一致的状态。以下是git descripe输出: warning: tag '1.0' is really '1.5' here 1.0-97-g88085b2 Checking object directories: 100% (256/256), done. tagged commit aad9477bba4bcf44ea34ea9693aeffc98527ff01 (1.0) in b96ce67583239e1
warning: tag '1.0' is really '1.5' here
1.0-97-g88085b2
Checking object directories: 100% (256/256), done.
tagged commit aad9477bba4bcf44ea34ea9693aeffc98527ff01 (1.0) in b96ce67583239e198f9e2aff5175176d65779044
Checking objects: 100% (3975/3975), done.
现在它应该返回1.5-…
git fsck--tags
输出:
warning: tag '1.0' is really '1.5' here
1.0-97-g88085b2
Checking object directories: 100% (256/256), done.
tagged commit aad9477bba4bcf44ea34ea9693aeffc98527ff01 (1.0) in b96ce67583239e198f9e2aff5175176d65779044
Checking objects: 100% (3975/3975), done.
如何删除对已删除标记的悬挂引用?这是重命名标记的正确方法吗?不,我认为这不是git中标记的正确工作流程 git的一条基本规则是:不要弄乱你已经推过的东西。
因为您已经推送了标记1.0,所以不希望在本地将其重命名为1.5,然后尝试推送它。将1.0标记留给后代,创建一个新的1.5标记,并将其推送。真的-这就是标签的用途。因此,您可以从现在起6个月后重新创建1.0版的软件。每当有人建议重写历史记录(或在本例中,重新标记历史记录)时,重申标准警告——如果可以避免,请不要这样做 然而,有时它不值得一段不准确(混乱)的历史所带来的长期痛苦,而短期痛苦是值得的 如果是这种情况,下面的文章给出了所需的步骤: 基本步骤是:
git tag new_tag old_tag
git push --tags
git push origin :refs/tags/old_tag
git tag -d old_tag
几分钟前我遇到了同样的问题。已经给出的答案中没有一个涉及到真正的问题,这就是摆脱信息
警告:标记“foo”在这里实际上是“bar”
,并获得git descripe
以仅列出标记的新名称。这在我的案例中尤其重要,因为我的构建系统使用git descripe
将用于构建的源代码记录到构建中
复制问题
我可以通过这样做来复制问题:
$ 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
,但我把它包括进来是为了强调。)我尝试用一个轻量级标记来复制这个问题,但未能做到这一点。因此,为了复制这个问题,需要一个注释
解决问题
其中一些涉及到推动已经被喷丸推动的事情,但我发现自己同意David Culp的观点:
然而,有时它不值得一段不准确(混乱)的历史所带来的长期痛苦,而短期痛苦是值得的
一旦您被困在警告中:标记“foo”实际上是这里的“bar”
,那么您必须执行以下操作:
$ git tag bar bar -m"original message" --force
$ git describe
bar
如果消息需要更改,请根据需要进行调整
要删除已推送的旧标记,请执行以下操作:
$ git push origin :refs/tags/foo
$ git push origin refs/tags/bar
要更新新标记(如果已推送):
$ git push origin :refs/tags/foo
$ git push origin refs/tags/bar
避免问题
要首先避免出现问题,您必须使用以下工具创建bar
:
$ git tag bar foo -m"original message"
不确定这会有多有用,但我在使用时遇到了此警告。在my remote repo中,对于相同的标记名,存在轻量级标记项和带注释的标记项:
$ 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
嗯,初始提交被标记为“1.0”,但实际上它应该被标记为“1.5”。因此,我尝试重新命名它。虽然这通常是一个很好的经验法则,但没有理由你不能做他试图做的事情,只要没有其他人在这里找到一种方法来从git历史中完全删除“1.0”标记,在我的情况下?老实说,我尝试了很多次,但无法复制你的悬空标记。您在顶部的过程似乎是重命名标记的标准方法,它对我很有效。非常感谢您的回答。很好!这个答案应该被接受,因为它是唯一一个解决(!)原始问题的答案。如果您执行
git标记栏-m“原始消息”-force
,那么您只需执行git push--force origin refs/tags/bar
,之后就无需删除。事实上,删除操作将删除更新的标记,之后您将无法再推送它。但这将更改更新标记的日期,对吗?值得注意的是:消息标记“%s”实际上是“%s”“
出自git descripe
,仅适用于带注释的标记,这就是为什么必须从带注释的标记开始重现问题的原因。这源于内部实现:带注释的标记实际上是一对实体,应该匹配,并且使用git-tag
为嵌入旧名称的现有带注释标记对象创建一个新的不匹配实体(轻量级标记名称)。这就是为什么必须创建一对新实体的原因(名为X的新轻量级标记指向名为X的带注释标记)。名为X的底层带注释对象可以直接指向原始带注释标记使用的同一提交对象,也可以指向原始带注释标记对象本身。要直接指向底层对象而不是旧标记,请使用git tag bar foo^{}-m“…”
:后缀表示“将标记解析为基础对象”。