修改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中进行操作。
任何关于如何编辑带注释的标签的建议。
发布于 2019-09-20 21:21:45
简短的回答是否定的。
更长的答案是,它们与提交完全一样可修改:一点也不,但是如果您足够努力,您可以得到一个新的、不同的提交--在这种情况下是带注释的标记--并且您可以诱使人们认为您更改了某个现有的对象。
带注释的标记由一个轻量级标记组成--以refs/tags/
-that开头的引用指向类型为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 tag
或git mktag
)创建一个新的标记对象,但是如果内容不同,哈希ID也会不同。然后,您可以使用git update-ref
来使轻量级标记名指向新的标记对象。
这不会以任何方式修改现有对象。然而,天真的用户现在会不加批判地检查标记,没有注意到refs/tags/v2.4.0
名称产生一个新的和不同的标记对象ID,读取新的和不同的标记对象,并认为标记已经改变。(如果标记对象中的标识符仍然具有v2.4.0
名称,那么从某些角度来看,所有的东西都是同步的,而且标记可能真的发生了变化!)
尝试将这个新更新的标记发送到其他Git存储库可能成功或失败,这取决于它们替换现有标记名称空间引用的策略以及它们是否有前一个标记对的副本。
https://stackoverflow.com/questions/58035227
复制相似问题