【问题标题】:Are git annotated tags modifyable? If so, how?git注释标签可以修改吗?如果是这样,怎么做?
【发布时间】:2020-01-21 22:01:06
【问题描述】:

在 git 中修改轻量级标签按预期工作。 git tag -f <tagname> <commit-id>

但是对带注释的标签使用相同的标签似乎会造成麻烦-

$ git cat-file -t tag2rag
tag

$ git cat-file -p tag2rag
object a7b4b4823f0222b79376e4c16bdbba0f3d1f5d33
type commit
tag tag2rag
tagger samshers <email@gmail.com> 1568930032 +00:00

tag to rag

那么,

$ git tag -f tag2rag 3096b
Updated tag 'tag2rag' (was 8931274)

那么,意想不到的

$ git cat-file -t tag2rag
commit

$ git cat-file -p tag2rag
tree b0053bf300da86e5aeabafb29d7dedcdbf713d51
parent 49c74fafd7c69e938052a4cba96ad62999438413
author samshers <email@gmail.com> 1568910804 +0000
committer samshers <email@gmail.com> 1568910804 +0000

wowfiles in

免责声明:嗯,我承认在发布后更改标签不是一个好的做法,并且可能会导致更多的协作问题。相反,应该创建并发布一个新标签。
那么这里的目的是了解 git 以及如何在 git 中做事。

关于如何编辑带注释标签的任何建议。

【问题讨论】:

    标签: git git-tag


    【解决方案1】:

    简短的回答是否定的。

    更长的答案是它们与提交完全一样可修改:根本没有,但如果你足够努力,你可以获得一个新的和不同的提交 - 在这种情况下是带注释的标签 - 你可以 欺骗人们认为你改变了一些现有的对象。

    一个带注释的标签由一个轻量级标签组成——一个以refs/tags/开头的引用——指向一个tag类型的内部Git对象:

    $ git cat-file -t v2.4.0
    tag
    

    底层对象有一个哈希 ID:

    $ git rev-parse v2.4.0
    67308bd628c6235dbc1bad60c9ad1f2d27d576cc
    

    此哈希 ID 是对象的 Git 样式校验和(标题 + 内容):

    $ git cat-file -p v2.4.0 | sed 's/@/ /'
    object 3d4a3ffe64162b45ae7c991fc60623ecb4678cfd
    type commit
    tag v2.4.0
    tagger Junio C Hamano <gitster pobox.com> 1430418320 -0700
    
    Git 2.4
    -----BEGIN PGP SIGNATURE-----
    [snip]
    

    您可以创建具有不同内容的新标签对象(例如使用git taggit mktag),但如果内容不同,哈希ID 也会不同。然后,您可以使轻量级标记名称指向新的标记对象,例如使用 git update-ref

    这不会以任何方式修改现有对象。然而,一个天真的用户现在会不加批判地检查标签,不会注意到 refs/tags/v2.4.0 名称会产生一个新的不同的标签对象 ID,读取新的不同的标签对象,并且 认为 标签有改变了。 (如果标签对象内的标识符仍然具有v2.4.0 名称,那么一切都是同步的,从某些角度来看,标签可能真的发生了变化!)

    尝试将此更新后的新标签发送到其他 Git 存储库可能会成功或失败,具体取决于他们关于替换现有标签命名空间引用的策略以及他们是否拥有先前标签 对的副本。

    【讨论】:

    • 再次发送。但是如果我删除标签并重新创建它会怎样。这样安全吗?
    • 删除和重新创建标签具有相同的效果:有一个带有新哈希 ID 的新对象(带注释的标签对象),以及一个保存新哈希 ID 的 ref。旧对象一直保留到 GCed。任何其他在标签名称下具有旧对象的 Git 可能会坚持使用旧对象,或者切换到新对象,具体取决于其他 Git 的策略。
    • 请注意,您通常可以告诉其他一些不会更新标签的 Git 来删除它的标签副本,然后告诉它创建一个具有相同标签的新标签姓名。默认情况下这是有效的,所以大多数服务器都遵守这个规则。它需要一个单独的“向服务器发送带有删除请求的推送”步骤。无论您如何在自己的 Git 中替换标签,您都可以这样做。
    猜你喜欢
    • 2017-11-14
    • 2012-04-08
    • 2021-06-30
    • 1970-01-01
    • 2011-04-22
    • 2023-04-10
    • 2023-04-07
    • 2019-01-21
    • 2017-09-26
    相关资源
    最近更新 更多