我和我的同事正在就发布/SCM 系统中标签的价值和使用进行争论。我们希望 StackOverflow 社区提出他们的想法来帮助我们解决问题。

一方面声称标签是发布管理的一个有价值的补充。它们的使用示例:我们做了一个 Maven 版本,它创建了一个新标签(称为 1.0),这是用于此版本的代码快照。该标签应该是只读分支。当需要修复错误时,我们可以将标签复制到新分支(称为 1.1)。错误修复就在那里。这些修复可能会合并回主干,以便主开发分支获得错误修复。最后发布1.1并自动创建Tag 1.1。这个循环继续下去。标签的主要好处是,如果您出于任何原因需要重新发布 1.0 版,您可以放心地发布标签 1.0,因为它从未被任何人更改过。另外,说“发布标签 1.0”比说“发布分支 1.0 的修订版 1,这是没有修复的原始 1.0”更清晰。

另一方声称标签没有提供任何有价值的好处,特别是在像 Subversion 这样具有全局修订版的系统中,其作用类似于 CVS 中的标签。另外,Subversion 仅在提交标签时发出警告;它实际上并没有阻止它。他们的方法是在主干中开发,发布后你将创建一个名为 1.0 的分支。您将继续在 Trunk 中修复错误,如果您需要将这些错误修复重新发布到生产环境中,则可以将它们合并到 1.0 分支中并重新发布 1.0。在某个时候,也许在 Trunk 中进行重大修复或添加功能之后,您将发布并制作 Branch 1.1。循环继续。如果您需要发布原始 1.0 版本,则必须查看 Branch 1.0 修订版 1。

显然这两种方法都有效。我想听听社区对首选哪种方法以及原因的看法。

编辑:我有点担心“最好”的方式取决于底层的SCM系统。要么选择 Subversion 来寻求答案,要么如果可能的话,使其与 SCM 无关。

有帮助吗?

解决方案

从 SCM 不可知论的角度来看, 标签 与修订版有很大不同。

两者可能以相同的方式实现,都代表一条“时间线”,但他们的目标不同:

  • 一个标签代表一个 不可变的 状态所有文件都由唯一 ID 引用。这是一个名字 代表很多东西 但主要是稳定状态,...)
  • 修订代表提交事务(并非所有的 SCM 都有这些, ,尤其是采用“逐个文件方法”的旧方法)。所有提交并不代表“稳定”状态(如成功“编译”或“执行”)。它们只是全球历史的一个新元素。

SVN 的问题在于修订版、标签和分支的实现都是相同的。
但我仍然更喜欢使用标签作为 “只读”分支.

其他提示

在我看来,标签很有用。在项目生命周期的某个时刻,您有时会遇到错误或更改,并且您想知道它是否存在于以前的版本中。有理由将一个版本的代码与另一个版本的代码进行比较,以衡量性能和实际代码开发的效率。

当然,你有可能把事情搞砸,但它总是可以撤销的。确实没有理由不这样做,并且有几个原因可以解释它在未来可能有用的原因。对我来说这是理所当然的。

我同意您也应该使用分支并在那里进行开发,但是每当您实际发布某些内容时,请用它制作一个标签。

是的,您要使用的标签。

一个标签可视为只是一个标签或用于特定版本的名称。这是我的经验非常有帮助的一个项目,以标记重要的里程碑,无论是进行产品发布,甚至临时QA版本。你经常会想回到过去,看看源代码为特定版本。

如果您分支一经发布,你总是可以找出哪些修订发布到生产,但是这是一种痛苦相比,只是在寻找一个标签。如果你不使用的版本分支那么这将是很容易失去跟踪那些被用来修改创建一个特定的构建。

使用svn的问题是,它模糊了标签和分支之间的区别。任何人都可以随时提交标签,所以它不能保证固定/不变。在其他VCS像PVCS,“标签”是不可改变的。您可以采用团队会议,以防止对提交的标签,甚至可能使用commit钩子来防止提交到标签。

我们创建新的基线时使用标签(标签)。我们这样做是每周一次,但有些球队做到这一点,每天甚至几十倍。

(我们)总是确保新基线稳定点:所以这不仅仅是一个构建,是一个构建是通过整个测试套件,几个小时的自动测试以及潜在手动探索之辈

然后基线的下一次迭代过程中使用为出发点的所有任务:每一个新的任务,是一个新的分支从基线,这是众所周知的是稳定的开头,所以无论在任务被分解应易于内部跟踪任务本身。

通常我们只能把主枝上的标签(标签)(或干线或主取决于你的SCM味),这是所有其他部门。

的结合点

当我们发布我们创建了一个正式的产品“的发布分支为它”,所以它只会而新的发展停留在“主”获得修复。然后这些“维护分支”(在一个时间仅希望一个或两个)可被太标记。

我喜欢去想标签为“只是一个奇特的名字为修订”。我一直想过他们的方式,并在IIRC善变他们这一点。在颠覆但是,就像你说的,他们确实是(便宜)主干/ *到标签拷贝/花哨的名称/

一经推出标签和分支:

老实说,我会结合两种策略以获得最佳效果。您的代码被称为1.0.0,分支1.0 MAINT。错误修正进入分支,和bug修正版本再次是标签(1.0.1可借打算在某一点别名1.0-MAINT的标记。)

不要但是忘了标签和分支在颠覆其实是同一件事:廉价仿制品。它们之间唯一的区别是你/你的团队属性,它们的语义,所以它几乎可以归结为让人们同意一个particualr方法,并坚持认为(可能在服务器上执行,如禁止提交在标签/除用于释放协调等)

我看到,虽然与第二方法的问题是:你打算怎么做软件之间的区别很容易在现场,如果你重新发布1.0吗?这意味着,你可能有一个1.0和1.0的另一个实际上指的是不同的代码库...

的项目的源代码(和可执行)不可变的快照是无价的做任何种测试,是否结构测试或现场使用。对于结构化测试,你将要创建一个可能被引用的几个月或几年在未来的数据。任何时候当你再次访问这些数据,墨菲定律说,你需要知道它来自哪个代码,除非你去引用的源代码的特定快照的麻烦,这将是不可能告诉有信心什么的源代码相对应该测试数据。

我不能告诉你某人的多少次来找我,说:“该微控制器代码不工作,你能帮忙吗?”我问他们,“你使用的是什么版本?”他们说:“我不知道”,因为他们没有做好发布管理(至少是把一个贴在设备上,更好地把版本中的EEPROM,可实时查询信息)。 >:(

在SVN,使用标签和跟踪修订之间的技术差异是零。我发现自己减少基于SVN的实现如何简直是一个廉价的拷贝和杂波你的“结构空间”标签中使用。

真正的差别来当的进行通信特定基线到大的开发团队。修订跟踪带来了额外的抽象层,它可以成为错误的根源。正如我们都知道,当你处理50多个开发商,任何错误源将成为混乱和浪费时间的区域。甲冗长标签可以消除这种混淆,并删除任何疑问,以基线的目的是什么。

我结合这两种方法。无论什么时候释放,标记它。标签应不会改变,所以“1.0.0”标签的存在,你不应该试图释放任何其他为1.0.0的指标。

与此同时,当是时候做1.0.0,我把它放到一个1.0分支。因此,流程为:支干线至1.0,这一标签新1.0为1.0.0和部署。然后bug修复可在1.0分支进行(以避免被混淆与任何1.1-针对性的发展可能已经主干现在),并合并到主干。固定1.0中的每一个释放被标记为从1.0分支1.0.x的。这基本上是我们在与Perforce的工作中使用的方法,这是非常相似的确实颠覆。 (通过回复阅读,我认为这是几乎相同Vincent的建议)

据有关标签是多余的,因为你有版本号的注释---这是基本上是正确的,只是标签也指定一个范围:即哪些文件版本库中的标签所覆盖。你可以合理地要求别人看/svn/proj1/tag/1.0.0和他们在一个连贯的工作区立即寻找。如果你问他们看看改版X,也得先看看改版X地看到,它正在发生变化(比如说)/ SVN / proj1 /主干/ Makefile文件,因此推断/ SVN / proj1 /主干/ @ X是什么他们应该看。如果修改X感动在proj1和proj2文件会发生什么?这当然是邪恶的,但严格来说,你应该说/ SVN / proj1 /主干/ @ X。在哪里存储版本号的名单?我们怎么知道1.0.0版本X?应该IMHO能够确定,仅仅从存储库

在如Git系统中,标签和分支仍是基本相同的事情(只是对象数据库的引用),但惯例的是,标签裁判没有改变,和分支裁判做(并优选与它们如何更改特定约束)。 Perforce公司也有“标签”,这是一起独立是修改的将一组文件修订的方式;它本质上是一个标签,但更令人困惑:与它们应该在识别版本分支的名称限定历史,我们使用的变更表号(相当于颠覆版本号)。两个几乎是相同的任何方式,所以在这里我想TMTOWTDI。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top