CVS/SVN分支和标记的最佳实践

11

我将负责决定我们的CVS/SVN代码库中标记分支的方式。

有没有相关文献可以帮助我理解如何最好地使用CVS?包括分支、标记等方面的操作?

谢谢。

13个回答

22

我在FreeBSD项目中进行10多年的CVS个人经验是:尽快切换到其他工具。CVS是基于文件而不是快照/变更集导向,这使得分支之间的合并相当痛苦。在CVS中使用分支也很痛苦。

至于CVS资源,请参见CVS Home

如果您想讨论SVN,我建议阅读SVN Book本身和这个问题


我只使用CVS几年,但很快形成了相同的看法。从零开始时,我们使用SVN,并发现它虽然不是完美的,但仍然更可取。 - Marcus Downing
2
我对CVS最大的问题是提交不保证具有原子性。这可能会导致很多麻烦。使用现代版本控制系统吧,SVN在大多数情况下都表现不错。 - rmeador
2
CVS中的提交在同一目录中是“原子性”的(由于锁定),但在外部不是。最近的版本(1.12)在RCS文件中存储了提交ID,但仍然是一个hack。 - Keltia

6

5

实用的经验规则:

  • 为每个构建打标签(即,每个具有构建编号的构建,任何你可能发送给测试人员或其他人的构建)。
  • 每次需要分支时都要进行分支。

通常您需要对发布版本进行分支,以便测试和发布补丁。您可能有其他分支的原因。

使用Subversion肯定是更好的选择。


1
“Tag every build” 应该翻译为 “每个发布版本都打标签”?尽管最好每次提交都构建,但为每个修订版本打标签并没有太多意义。 - Dirk Vollmar
我认为最好说:为每个公共构建打标签。针对测试人员或用户等离开开发人员的构建。 - abatishchev
1
我不认为有必要吝啬,但如果你想这样做,“每个公共构建”可能是可以的。如果从一个构建到另一个构建出现问题,如果你标记了上一个构建,那么回滚会更容易。 - Darcy Casselman
作为开发人员,您应该为自己和团队的每个功能和错误分支。这不应该是一个争论的问题,只需要去做,您会看到好处的。 - PositiveGuy
如果我在做那件事,我肯定会使用像Git或Mercurial这样的分布式版本控制系统,否则我就是个傻瓜。虽然你可以在SVN中使用功能分支,但合并时涉及到的痛苦程度意味着你最好迁移到专门为此类任务构建的工具上。 - Darcy Casselman
显示剩余4条评论

5
我建议你在Windows上使用 SVN,在Linux上使用 Git 。不要使用CVS,个人认为它很糟糕。
首先请参阅SVN Book
将每个公共构建(发布)标记。分支是将主干复制出来的一种方式,例如另一种开发方式。每次需要时都要进行分支存储库 :)

5

我相信这是来自编程恐惧症:

克里斯·比尔梅勒(Chris Birmele)关于分支和合并的论文是我发现的最好的介绍这个基本源控制任务的方法。有数十种分支方式,没有一种正确的方式。熟悉您的选项,以便了解每种选项的权衡。

分支和合并入门


3

3
如果您想使用Subversion作为起点: 将“trunk”视为您的开发完整历史记录。每个发布过的东西都必须在某个时候以某种形式出现在主干上。 在复杂的开发任务中使用开发分支(从主干创建)。完成任务后,使用重新集成合并将更改从分支合并到主干中。这样,您只需要对主干进行一些特定的提交,而不是许多与同一任务相关的提交。不再需要这些开发分支时,请将它们删除。将其命名为“FeatureX”之类的名称。 使用版本分支(再次从主干创建)来管理营销版本,这些版本将用于向客户发布/部署到线上。版本是主干修订版本的子集。要使用它们,请在适当的修订版(可能不是标头)上从主干创建分支,并手动记录从主干合并到该分支的修订版,合并您需要的任何其他修订版,但仅来自主干。不要直接在版本分支上开发,只能从主干合并-尽管合并可能需要额外的工作才能使其与版本兼容。像“Version2.4”这样的名称。 每当您制作一个构建或热修复版并发布给客户或部署到线上时,请从版本分支创建特定的标记。名称如“2.4.1”,“2.4.2”等。
以这种方式工作,您可以使用Subversion的合并跟踪(版本1.5及以上)以逐个修订的方式查看每个标签中确切包含的内容。要做到这一点,请获取您的标签或版本分支的工作副本,并执行“svn mergeinfo --show-revs merged http://svn/trunk c:\workingcopy\”。这对审计员、自动生成的发布说明、测试人员以及您自己对于确切包含和排除的内容都非常有用。使用带有此信息的自动生成矩阵,以一目了然的方式查看不同版本包含的内容。

你说所有的更改都应该先进入主干,而不是直接开发到版本分支。我同意,但如果要修复版本分支中代码已经不存在的错误(可能由于代码清理或功能删除),该怎么办? - Fredrik Boström

3

2
您应该离开CVS。CVS是旧的,而且在分支/标记方面不是很快(分支/标记创建取决于项目中文件数量的线性关系)。
您应该首先考虑您的分支策略:
- 稳定主干 - 功能分支 - 开发人员分支 - 不稳定主干/发布分支 - 平台分支
这在很大程度上取决于您的项目和开发理念。
如果您想使用SVN,您真的必须考虑您的存储库布局,因为几乎所有软件项目都是基于模块的,您应该找到一种结构,可以轻松地标记所有需要的模块。 SVN以其基于文件夹的分支/标记方法不易实现此要求。
这意味着,多存储库布局比维护稳定的标记系统更加困难。我更喜欢“全部标记”的方法,但这是我的个人选择。

这意味着,多仓库布局更难维护稳定的标记系统。不知道你的确切意思是什么,我想知道是否可以通过使用svn:externals在标记之前将多个仓库布局合并在一起来解决这个问题。 - RjOllos
1
你可以使用外部库来实现,但是如果你的子项目也在使用外部库,情况会变得非常棘手。无法在所有项目中搜索所有外部库,而且在多个层次上维护外部库也很麻烦。 - Peter Parker

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接