为什么带注释的标记对象存储标记名称?

时间:2018-04-25 14:53:04

标签: git git-tag

this answer所示,git带注释的标签有几个属性,例如

> git cat-file -p v0.1

object 5cf4de319291579d4416da8e0eba8a2973f8b0cf
type commit
tag v0.1
tagger JDB <jd@domain.com> 1521058797 -0400

Version 0.1-beat

前两个属性给出了SHA1和标记所指向的目标对象的类型。第三个属性提供标记的名称v0.1

但此标记表示为文件.git/refs/tags/v1.0。所以我们已经有了一种从字符串v0.1映射到标记对象及其属性的方法。 为什么我们需要标记对象在其属性中包含标记名称?分支机构不存储其名称。提交对象不存储其SHA1。是否存在某种情况,您可能会引用标记而不是其名称?

2 个答案:

答案 0 :(得分:1)

除了您自己的答案(标记指向标记的对象ID),您可能希望标记对象存储标记名称的其他原因:

  • 如果引用“松散”,那么就像你说的那样存储为.git/refs/tags/v0.1。但它可能会被包装。因此,如果您想依靠refs元数据来映射标记名称,那就不那么容易了。 (无论如何,手动在.git目录中徘徊应该始终是B计划。)

  • 对象哈希,对于签名标签,签名不会覆盖标签的文件名。如果你想要保证提交5cf4de319是“v0.1”的意思,那么你需要标记对象来明确地存储这个事实。

<强>更新

我再次不确定这是否会转化为“实际上重要”的原因,但还有一件事需要考虑:

注释标记与指向注释标记中的标记对象的轻量级标记之间的区别是什么?我有最佳答案:姓名不匹配。

答案 1 :(得分:0)

好的,此问题中的the answer I referenced还包含对此问题答案的线索:指向标记的标记使用目标标记的SHA1而不是其名称作为参考。

因此,如果创建的tag2指向tag1,则tag2指向tag1对象,而不会实际显示tag1的名称。因此,如果任何git命令或UI必须取消引用tag1,如果tag2的对象不包含该信息,则它无法直接知道它指向的标记被称为tag2

也许还有其他原因,但这是我能想到的。也许还有其他东西(除了标记之外)可能通过其SHA1引用标记,因此需要引用标记对象提供引用标记的名称。