代码之家  ›  专栏  ›  技术社区  ›  Garret Wilson

更新Git tagger电子邮件[副本]

git
  •  0
  • Garret Wilson  · 技术社区  · 8 年前

    长话短说,我正在编写一个脚本,将一个非常大的项目从(gasp)Microsoft SourceSafe迁移到Git,我正试图保留SourceSafe项目标签(本质上是Git中的标签)的作者。我知道你可以修改Git提交的作者和提交者的名字/日期,但是你能对Git标记做同样的修改吗?

    0 回复  |  直到 9 年前
        1
  •  8
  •   torek    9 年前

    TL;博士

    使用新的所需数据重新创建标记。但如果别人以前有,他们可能不会接受你的新的。或者他们可以!这取决于

    实际上,你 不能 ,而你不能(以及你能做什么)这一事实在剩下的答案中起着重要的作用。

    所有Git对象都有一个hash ID作为它们的“真名”。哈希是通过计算对象内容的加密校验和形成的。这意味着您永远不能更改任何Git对象。 1个 可以 do是构造 新的 对象,然后说服所有拥有旧对象的人停止使用它,而使用新对象。

    这就是 git commit --amend 是否(以及各种交互式折扣选项 edit reword 也可以)。首先我们将原始的Git对象提取到普通数据中,在那里我们可以对其进行操作;然后我们进行操作并要求Git构造一个新对象;最后我们停止使用旧对象并开始使用新对象。

    对于 小费承诺 (见 the definition of head in the gitglossary )对新的承诺,忘记原来我们刚刚更换的。它 看起来像

    如何应用于标记

    Git有两种标记,一种是 lightweight tag 带注释的标记 tag object

    因此,要“更改”标记对象,我们必须执行与“更改”提交对象相同的操作:将其复制到 新的 标记对象。

    没有内置命令来执行此操作,但是很容易从 git cat-file -p 这使您可以将原始标记提取到普通数据中,并 git mktag ,它允许您将普通数据转换为新的标记对象。例如 v2.2.1 Git的Git存储库中的标记以以下开头:

    $ git cat-file -p v2.2.1
    object 9b7cbb315923e61bb0c4297c701089f30e116750
    type commit
    tag v2.2.1
    tagger Junio C Hamano <...
    

    object 行是标记指向的提交:

    $ git cat-file -t 9b7cbb315923e61bb0c4297c701089f30e116750
    commit
    

    所以我们可以把这个标签复制到另一个 tagger :

    $ new_hash_id=$(git cat-file -p v2.2.1 | sed -e .... | git mktag)
    $ git update-ref refs/tags/$name $new_hash_id
    

    其中 sed $name 是标记的名称。然后我们会做一个轻量级的标签 $new_hash_id

    标签可以是PGP签名的

    上面的标签接着说:

    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1
    

    然后在里面有一个PGP签名。此签名包含除签名本身之外的所有数据。如果复制并修改此标记,则应完全放弃原始签名(它将无效,并且将无法通过任何应用的测试);是否可以并且应该用新签名替换它,如果可以,则由谁来决定。

    标记不应更改其目标对象

    现有的轻量级标记

    $ git rev-parse v2.2.1
    7c56b20857837de401f79db236651a1bd886fbbb
    

    这是我们到目前为止一直在查看的数据。

    这个 tag对象将有一些其他的、不同的hash ID 没有其他人

    保证 你可以确定这个标签是 正确的 标记,并且它指向的提交对象是原始提交,而不是某个特洛伊木马。如果你 改变 一个现有的标签,你颠覆了这个意图。此外,一些知道前一个标签值的人会拒绝接受新的值:您不会 使它们更新现有标记。只要你这么做 之前 其他人都有标签,但是,他们永远不会知道,你会没事的。


    或者,您不能更改Git对象的内容,除非您可以 break the hash . 另见 How does the newly found sha1 collision affect git?

        2
  •  4
  •   Skander Hamza    9 年前

    git tag -d <tag-name> 
    git push origin :refs/tags/<tag-name>
    git config --global user.name "John Doe"
    git config --global user.email johndoe@example.com
    git tag <tag-name> [commit]
    git push origin <tag-name>