为什么我应该关心轻量级与注释标签?

去年我从日常的VCS转换到了Git,并且仍然在努力把握“Git-think”的优点。

最近一直困扰着我的是“轻量级”与标注与签名标签。 似乎普遍接受的是,注释标签在所有实际用途上都优于轻量级标签,但是我为什么会遇到这种情况的解释似乎总是归结为“因为最佳实践”或“因为它们不同” 。 不幸的是,那些不知道为什么是最佳实践或者这些差异如何与我的Git使用相关的参数非常令人满意。

当我第一次切换到Git时,轻量级标签似乎是自切片面包以来最好的东西; 我可以指出一个承诺,并说“这是1.0”。 我无法理解一个标签如何能够超过这个标签,但我绝对不能相信世界上的Git专家更喜欢任意使用注释标签! 那么,喧哗是什么呢?

(积分:为什么我需要签署一个标签?)

编辑

我已经成功地相信 ,注释标签是一件好事 – 知道谁标记,什么时候是重要的! 作为后续工作,对良好标签注释的build议? 这两个git tag -am "tagging 1.0" 1.0并试图总结提交日志,因为以前的标签感觉像失去策略。

注释标签的优点是您知道是谁创build的。 就像提交,有时很高兴知道是谁做的。 如果您是开发人员,并且您看到v1.7.4已经被标记(已准备好)并且您不太确定,那么您与谁交谈? 名字在注释标签中的人! (如果你生活在一个不信任的世界里,这也会让人们不去标记他们不该做的东西)。如果你是一个消费者,那么这个名字就是一个权威的印章:那是Junio Hamano说这个版本的git是在这里释放。

其他的元数据也是有帮助的 – 有时候知道这个版本什么时候发布,而不是最后一次提交的时候是很好的。 有时候,这个信息甚至是有用的。 也许这有助于解释特定标签的用途。 也许候选版本的标签包含一些状态/待办事项列表。

签名标签几乎就像签署其他任何东西 – 它为偏执狂提供了更多的安全级别。 我们大多数人都不会去使用它,但是如果你真的想在把这个软件放到你的电脑上之前核实一切,那么你可能需要它。

编辑:

至于在标签注释中写什么,你说的没错 – 总是没什么用处。 对于版本号标签,隐含的理解是标识该版本,如果您对其他地方的更新日志感到满意,则不需要在其中放置一个。 在这种情况下,最重要的是标签和date。 我能想到的另外一件事就是从testing套件中获得批准。 看看git.git的标签:他们都只是说一些像“Git 1.7.3 rc1”; 所有我们真正关心的是Junio Hamano的名字。

但是,对于名称不太明显的标签,信息可能变得更加重要。 我可以设想为单个用户/客户端标记一个特定的专用版本,一些重要的非版本里程碑,或者(如上所述)为候选版本添加额外信息。 这个消息是非常有用的。

我个人对这个话题的看法略有不同:

  • 带注释的标签是为其他开发者准备发布的标签,很可能是新版本(也应该签名)。 不仅要看到谁被标记,何时被标记,还有为什么(通常是更改日志)。
  • 轻量级更适合私人使用,这意味着标记特殊的承诺能够再次find它们。 可能是审查他们,检查出来testing什么或什么的。

默认情况下,Git只会将注释标签看作git describe等命令的基准。 把注解的标签想象成对自己和其他人有持久含义的标志,而轻量级标签更像是以后自己find的书签。 因此,注释标签值得用作参考,而轻量级标签不应该是。

签署标签是签名者身份的保证。 例如,它可以让用户validation他们select的Linux内核代码与Linus Torvalds实际发布的代码是否相同。 签名也可以是签名者在该提交中为软件的质量和完整性作出的保证。

签署一个标签是一个简单的方法来声明一个版本的真实性。

这在DVCS中特别有用,因为任何人都可以克隆存储库并修改历史logging(例如,通过git-filter-branch)。 如果一个标签被签名,签名将无法在git-filter-branch操作中生存,所以如果你有一个策略,每个发行版都被提交者标记并签名,那么可以在存储库中检测到一个伪造的发行标签。

如果不是用于签名的话,我也不会在注释标签中看到太多的内容。

使用带注释的标签远程发布版本,本地未注释 ( 由Koraktor提及 )。

理由:

man git-tag说:

注释标签是为了发布,而轻量级标签是专用或临时的对象标签。

而某些行为则以这种build议有用的方式区分它们,例如:

  • 带注释的标签可以包含一个消息,创build者和date,不同于他们指向的提交。 所以你可以使用它们来描述一个版本而不用做一个发布提交。 轻量级标签没有额外的信息。 ( 由Jefromi提到 )
  • git push –follow-tags只会推送带注释的标签
  • 没有命令行选项的git describe只能看到带注释的标签( 由Novelocrat提到 )

也可以看看:

  • 在什么情况下,我应该添加-a标志到git标签命令?
  • 有注释和无注释的标签有什么区别?

我发现了一个很好用的轻量级标签 – 在GitHub上创build一个发行版。

我们确实发布了我们的软件,而且我们有了必要的提交,我们只是懒得去维护GitHub上的'Release'部分。 当我们稍微注意一下时,我们已经意识到,我们也想要添加一些以前的版本,并为他们提供正确的旧版本date。

如果我们只是在旧的提交上创build一个带注释的标签,GitHub会从标签对象中获取发布的date。 相反,当我们为这个旧提交创build了一个轻量级标签时,发布版本开始显示正确的(旧)date。 Source @ GitHub帮助,“关于发布”

看起来也可以为注释提交指定所需的date,但对我来说看起来并不那么简单: https : //www.kernel.org/pub/software/scm/git/docs/git-tag。 HTML#_on_backdating_tags

在我的办公室里,我们会把发布的网页地址放在标签主体中。 发布网页详细介绍了自上次发布以来所有不同的新function和修复。 pipe理层不会在git仓库中查找发生了什么变化,并且很高兴有一个简要的清单,说明该版本中的内容。