Git标签,为什么这个重复标签在遥控器?

时间:2011-03-17 22:29:48

标签: git

30bd19ef190cf664356c715b56044ce739f07468        refs/tags/Prod_Release_2.3
4ae15ee04c2c41bfc7945e66f4effc746d52baec        refs/tags/Prod_Release_2.3^{}

以上是我的集中存储库(裸)中git ls-remote --tags个列表标记的输出。

对于Prod_Release_2.3我只期望1个标签,我不知道这个Prod_Release_2.3^{}来自哪里。

在centralrepo1中,Prod_Release_2.3的id与centralrepo2的Prod_Release_2.3 ^ {}的id相同,反之亦然。

在我的本地存储库中只有一个标记Prod_Release_2.3

有什么不对吗?或者这是设计?

中央存储库托管在Ubuntu上,我在我的开发机器中使用msysgit。

2 个答案:

答案 0 :(得分:28)

Git中有两种类型的标签:“轻量级”和“注释”。

轻量级标签只是在refs/tags/命名空间中引用指向其他对象的引用。它们是使用git tag <tagname> [object]而不是-a-m-F-s-u创建的。

带注释的标签实际上是一种指向其他对象的单独的Git对象(tag object)。标记对象存储提交者信息,作者信息,消息(类似于commit objects),并且它们指向任何单个其他对象(与提交中的提交对象不同,指向一个tree object和零个或更多其他提交对象)。

当你有一个带注释的标签时,你通常也有一个指向它的引用。从技术上讲,这个ref本身就是一个“轻量级”标签,但我们通常不会单独描述它们。

通常,两种标记都指向提交,但它们可以指向任何类型的Git对象(标记,提交,树或blob)。 git.git repositoryrefs/tags/junio-gpg-pub指向包含维护者的GPG公钥的blob。此外,torvalds/linux-2.6.gitrefs/tags/v2.6.11指向树。尽管在技术上允许指向非提交对象的标记,但它们可能会破坏或混淆某些工具,因此应尽可能避免使用它们。


语法^{}后缀(在gitrevisions(7)中描述)是标记解除引用语法(有时称为“剥离标记”语法)。对于标记对象,它将计算为标记对象指向的第一个非标记对象(它将递归地引用标记对象链,直到找到非标记对象为止)。对于非标记对象,它与没有^{}后缀的意思相同。

中央存储库中的refs/tags/Prod_Release_2.3引用指向名为30bd19ef190cf664356c715b56044ce739f07468的标记对象 该标记对象最终指向一些名为4ae15ee04c2c41bfc7945e66f4effc746d52baec的非标记对象(可能是提交)。

因此,refs/tags/Prod_Release_2.3^{}解析为4ae15ee04c2c41bfc7945e66f4effc746d52baec

答案 1 :(得分:6)

这不是标记,它是指向标记指向的提交的指针。您可以在git show-ref man page

中详细了解相关信息