提出SVN的版本控制策略


9

我要全天候尝试为公司制定版本控制策略。我们目前使用的是SVN,但没有结构-我们基本上只有一个主干,并且只能使用它。最近,开发经理启动了另一个存储库,它充当我们的“标签”,但是由于它不是同一存储库的一部分,而是完全独立的存储库,因此必须与“ trunk”手动合并。实际上,只有一个文件夹,称为“ Dev”(在不同的日期实际上有不同的“ Dev”文件夹,但只有“ Dev”是主要文件夹),在此之下还有其他所有文件夹。所有其他项目。它根本不是按项目组织的,它没有分支/标签/树干或其他任何概念。最初设置的人(已久,当然)似乎根本不知道如何设置SVN,从那以后,没有人会因为担心破坏某些东西而费心地学习如何正确地做事。我们不使用任何类型的CI(不幸的是,也不使用自动化测试)。

首先,我们应该按项目分开吗?例如,我们有:两个ASP.NET网站(非Web应用程序,网站),一个Web服务,一个用于所有表脚本和存储过程的部署文件夹,两个用于外部项目的命令行客户端,这些客户端由网站和具有公用业务对象等的共享文件夹。这些应该是属于自己的带有分支/标签/树干设置的项目,还是应该像这样:

dev/
  branches/
  tags/
  trunk/
      Site1/
      Site2/
      WebService/
      SharedCode/

并具有所有分支,并且所有内容都具有整个Dev文件夹的副本?由于我们经常遇到需要在共享代码库和至少一个(通常是两个)网站中进行更改的情况,因此这种方法可能更容易被吞噬。

其次,我们定期向开发服务器和实时服务器发布(按我们的说法)。从我读过的最好的处理方式来看,所有开发都进入了trunk /,分支是“临时的”,用于添加可能影响主干的新功能,而标签用于发布?因此,我们每个月都在推动,我正在开发一个全新的模块。我将分支主干,并将该分支用于我的代码,编写和测试它以及其他内容。模块完成后,我会将其合并回主干(并可能删除分支),而当我们准备进行部署时,我们将对其进行标记(比如说“ May2011”)。如果我们在发布后进行了错误修复,则将在May2011标签中对其进行修复,然后将其合并到主干中(这样,主干也将获得此修复),然后May2011会因修复而再次推出?这是标记的意图吗?


5
外框策略:切换到git。
Rein Henrichs

如果可以选择的话,我会做(或Mercurial,因为我们是Windows商店)。我认为,尝试迁移到全新的源代码控制系统所面临的阻力比试图至少通过SVN设置适当的环境要更大。
韦恩·莫利纳

2
尽管我对DVCS感到很兴奋,但是Subversion是一个很好的工具。CVS或没有文件夹版本控制的其他解决方案会更糟。
马修·罗达图斯

2
@Wayne M-您可能会发现实际上相反。如果这样做可以使人们签署使用DVCS的所有优势,则可能更容易签署一份更合理的环境结构。作为过渡,您可能需要考虑使用gitsvn或hgsubversion尝试廉价的本地分支/存储库访问。一旦将它们钩住并习惯了工具,就可能会出现一个广泛的愿望,那就是迁移到DVCS作为主要仓库。
Mark Booth,

Answers:


5

如果要统一的构建过程,请确保将分支/标签/主干放在根目录,如下所示:

branches/
tags/
trunk/
  dev/
    ...

如果不需要统一的构建过程,则可以根据需要在每个项目中放置分支/标记/树干。但是,将它们放入每个项目后可能很难迁移到统一版本。统一的构建具有优势,例如消除了在项目之间发布共享组件的需求-它们都是构建的一部分。

就个人而言,我喜欢统一的构建过程。此外,我认为您不应该有一个“开发”项目。您应该将项目直接放在主干下,然后将主干分支到开发分支。使用发布标签。例如,我会这样:

branches/
  dev/
    Site1/
    Site2/
    WebService/
    SharedCode/
tags/
  release1/
    Site1/
    Site2/
    WebService/
    SharedCode/
trunk/
  Site1/
  Site2/
  WebService/
  SharedCode/

1
统一的构建具有优势,例如消除了在项目之间发布共享组件的需求-它们都是构建的一部分。
马修·罗达图斯

2
如果您需要多个统一的版本,则为每个目录在主干下创建目录。但是,我不会命名一个“ dev”,最好用一个分支来完成。例如,您可能有两个主要的开发组织-一个在设备驱动程序上工作,另一个在公司网站上工作。您可能需要两个单独的统一版本。
马修·罗达图斯

1
  1. 就svn中的代码结构而言,这实际上是个人选择。

我建议,如果项目是相关的或共享代码,则它们需要通用的主干。如果它们是独立的,则它们需要单独的干线甚至单独的存储库。如果您需要向第三方提供项目的svn历史记录副本,则将其保存在单独的存储库中会容易得多。

因此,在您的情况下,这听起来像您上面绘制的布局是合理的,因为您已经共享了代码,并且希望分支/标记包含该共享的代码。

  1. 您对标记和分支使用的描述听起来非常明智,这也是我期望使用svn的方式。据我了解,这确实是标记的意图。svn标签和分支中的BTW实际上是同一回事,但是在应用术语时就应用了它。

就我个人而言,我还要补充一点,所有致力于干线的事物都必须构建,必须是原子的并且不应破坏任何单元测试。分支用于未完成的工作。我希望后备箱在任何时候都可能成为候选版本。


您是说只有经过测试且可用于生产环境的代码才是主干吗?我认为任何提交的代码都应该构建并可能通过测试,而主干代码当然应该通过测试。但是,似乎SVN的目的是为了能够跟踪开发历史,并且如果不将其拆分为多个分支,这将变得更加容易。当主干处于经过测试且可用于生产的状态时,也许应该将主干合并到其中的分支?
杰斐逊先生

0

以下是布置Subversion存储库的最佳方法

project_a
     - branches
     - tags
     - trunk
project_b
     - branches
     - tags
     - trunk
project_c
     - branches
     - tags
     - trunk
master
     - branches
     - tags
     - trunk       
         - svn:external project_a
         - svn:external project_b
         - svn:external project_c

这样,您可以自己签出单个项目。

如果要检出所有3个项目并使用某些整体式构建脚本/系统进行统一构建,则使用带有svn:externals模块进行调查,将所有其他项目映射到master中 trunk

乍一看,这比较复杂,但这是使用Subversion解决此问题的最可维护和惯用的方法。


2
我非常不同意。该存储库不仅仅存储代码。它传达组织结构和组件之间的关系;这是一个至关重要的(尽管是隐性的)沟通渠道。如果将每个项目分开进行,则会给人为的和不必要的沟通障碍。
威廉·佩恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.