8

我和我的同事对发布/SCM 系统中标签的价值和使用存在争议。我们期待 StackOverflow 社区提出他们的想法,以帮助我们解决问题。

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

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

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

编辑:我有点担心“最佳”方式取决于底层的 SCM 系统。要么选择 Subversion 来寻找答案,要么尽可能让它与 SCM 无关。

4

8 回答 8

4

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

当然,你有可能把它搞砸,但它总是可以撤消的。确实没有理由不这样做,并且有几个原因可以说明它在未来可能有用。对我来说,这是不费吹灰之力的。

我同意您也应该使用分支并在那里进行开发,但是无论何时您实际发布某些内容,都应从中制作一个标签。

于 2009-04-08T13:30:17.887 回答
4

从与 SCM 无关的角度来看,标签与修订版非常不同。

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

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

SVN 的问题是修订、标签和分支都实现相同。
但我仍然更喜欢将标签用作“只读”分支的选项。

于 2009-04-08T14:16:18.557 回答
1

是的,您想使用标签。

将标签视为特定修订的标签或名称。根据我的经验,标记项目中的重要里程碑非常有帮助,无论是用于生产版本还是临时 QA 版本。您通常会想回到过去并查看特定版本的源代码。

如果您在发布时进行分支,您总能找出哪个版本发布到生产环境中,但与仅查看标签相比,这有点痛苦。如果您不使用发布分支,那么很容易忘记使用哪个修订版来创建特定构建。

svn 的问题在于它模糊了标签和分支之间的区别。任何人都可以随时提交标签,因此不能保证它是固定/不可变的。在 PVCS 等其他 VCS 中,“标签”是不可更改的。您可以采用团队约定来防止提交标签,甚至可以使用提交挂钩来防止提交标签。

于 2009-04-08T14:20:12.057 回答
1

我们在创建新基线时使用标签(标签)。我们每周做一次,但有些团队甚至一天做几次。

(对我们而言)重点始终是确保新基线是稳定的:所以它不仅仅是一个构建,而是一个通过整个测试套件的构建,几个小时的自动化测试以及潜在的手动探索性测试。

然后基线用作下一次迭代期间所有任务的起点:每个新任务都是从基线开始的新分支,已知基线是稳定的,因此任务中的任何问题都应该易于在任务本身内部追踪.

通常我们只在主分支(或主干或主分支,取决于您的 SCM 风格)上放置标签(标签),这是所有其他分支的集成点。

When we release an official product we create a "release branch for it" so it will only receive fixes while new development stays on "main". Then these "maintenance branches" (hopefully only one or two at a time) can be tagged too.

于 2009-04-15T09:34:06.373 回答
0

我喜欢将标签视为“只是修订的花哨名称”。我一直这样想他们,而 IIRC 在善变中他们就是这样。然而,在颠覆中,正如你所说,它们确实是 trunk/* 到 tags/fancy-name/ 的(廉价)副本

老实说,我会结合两种策略来获得最佳结果:发布时标记和分支。您的标签称为 1.0.0,分支 1.0-MAINT。错误修复进入分支,错误修复版本再次成为标签(1.0.1 可能由一个标签在某个时候为 1.0-MAINT 别名。)

但是不要忘记 subversion 中的标签和分支实际上是同一件事:廉价副本。它们之间的唯一区别是您/您的团队赋予它们的语义,所以它几乎可以归结为让人们同意一种特定的方法并坚持下去(可能在服务器上强制执行,例如不允许在标签中提交/除了发布协调员等)

我看到第二种方法的问题是:如果你重新发布 1.0,你将如何轻松区分该领域的软件?这意味着您可能有一个 1.0 和另一个 1.0 实际上指的是不同的代码库...。

于 2009-04-08T13:35:50.807 回答
0

项目源代码(和可执行文件)的不可变快照对于进行任何类型的测试(无论是结构化测试还是现场使用)都是非常宝贵的。对于结构化测试,您将创建可能在未来数月或数年内引用的数据。每当您重新访问该数据时,墨菲定律说您需要知道它来自什么代码,除非您费心引用源代码的特定快照,否则不可能有把握地判断源代码对应于什么那个测试数据。

我无法告诉你有多少次有人来找我说“这个微控制器代码不起作用,你能帮忙吗?” 我问他们,“你用的是什么版本?” 他们说“我不确定”,因为他们没有做好发布管理(至少在设备上贴一个标签,最好将版本信息放在可以实时查询的 EEPROM 中)。>:(

于 2009-04-08T17:42:56.000 回答
0

在 SVN 中,使用标签和跟踪修订之间的技术差异为零。我发现自己基于 SVN 的实现只是一个廉价的副本并弄乱了你的“结构空间”来最小化标签的使用。

真正的区别在于将特定基线传达给大型开发人员团队。修订跟踪带来了额外的抽象层,可能成为错误的来源。我们都知道,当您与 50 多个开发人员打交道时,任何错误来源都会成为混乱和浪费时间的领域。详细标签可以消除这种混淆并消除对基线目的的任何疑问。

于 2009-04-08T18:45:04.293 回答
0

我会结合这两种方法。每当您发布版本时,请对其进行标记。标签永远不会改变,因此“1.0.0”标签的存在表明您不应该尝试将其他任何东西作为 1.0.0 发布。

同时,到了做 1.0.0 的时候,我会把它放到一个 1.0 的分支上。所以流程是:将主干分支到 1.0,将这个新的 1.0 标记为 1.0.0,然后部署。然后可以在 1.0 分支上进行错误修复(以避免与现在可能已经在主干上的任何 1.1 目标开发混淆)并合并到主干中。固定 1.0 的每个版本都从 1.0 分支标记为 1.0.x。这基本上是我们在使用 Perforce 时使用的方法,并且确实与 Subversion 非常相似。(阅读回复,我认为这与文森特的建议几乎相同)

至于关于标签是多余的评论,因为你有修订号——这在很大程度上是正确的,除了标签还指定了一个范围:即存储库中的哪些文件被标签覆盖。您可以合理地要求某人查看/svn/proj1/tag/1.0.0,他们会立即查看一个连贯的工作区。如果您要求他们查看修订版 X,他们必须首先查看修订版 X 以查看它正在更改(例如)/svn/proj1/trunk/Makefile 并因此推断 /svn/proj1/trunk/@X 是什么他们应该看看。如果修订 X 触及 proj1 和 proj2 中的文件会发生什么?这当然是邪恶的,但严格来说你应该说/svn/proj1/trunk/@X。修订号列表存储在哪里?我们怎么知道 1.0.0 是版本 X?恕我直言,应该可以仅从存储库中确定。

在像 Git 这样的系统中,标签和分支基本上仍然是相同的东西(只是对对象数据库的引用),但约定是标签引用不会改变,而分支引用会改变(最好对它们如何改变有一个特定的约束)。Perforce 也有“标签”,它们是独立于变更列表将一组文件修订分组在一起的方式;这本质上是一个标签,但更令人困惑:历史上我们使用的变更列表编号(相当于 Subversion 修订编号)用它们应该所在的分支名称来限定版本来识别版本。两者几乎相同,所以在这里我猜是 TMTOWTDI。

于 2009-04-08T19:09:25.467 回答