公司特定的颠覆回购布局

时间:2011-01-04 10:26:39

标签: svn repository structure

首先,我将解释在我们公司中使用Subversion的一些历史。 我们在大约3年前开始使用Subversion。我们将它与TortoiseSVN一起用作客户端。

我们有3个完全不同的项目存储库没有任何共同点。

但在1个存储库中,我们有大约6个共享dll的产品/项目(用于压缩,xml,basetypes等) 我们有大约20个这些常见的dll(仍在更新中)。

所以这20个Common Dll和六个需要它们的项目一起在主干中。

现在主干真的被填满了,其缺点是所有项目都相互依赖。因此,如果对一个项目的1个常见dll进行了更改,那么所有其他项目都需要更新,需要进行调整和验证。

由于这不是那么方便(特别是当您想要发布产品然后从其他产品中获得一些新的变化时),我们想要为每个项目拼接一切。仍然保持大主干在不同项目之间同步。

因此,我们为每个项目创建trunk / branches / tags文件夹,并仅执行该项目所需的dll的svn副本。

情况:

之前:

  -branches
  -tags
  -trunk
      -Common DLL 1
      -Common DLL 2
      -Common DLL 3
      -Common DLL 4
      -Common DLL 5
      -Project 1
      -Project 2
      -Project 3

立即

  -Projects
      -Project1
          -branches
          -tags
          -trunk
              -Common DLL 1
              -Common DLL 2
              -Project1
      -Project2
          -branches
          -tags
          -trunk
              -Common DLL 2
              -Common DLL 3
              -Common DLL 4
              -Project2

这种方法的优点是你可以更好地了解不同项目的dll,你可以将每个单独的项目检查为完全递归而不是部分检查。 当我们进行公共dll的同步(对于发布很重要)时,我们也有更多的控制权,而且我们没有其他项目开发人员提交的未完成的工作提交。

但是:我们在合并这些Common Dll时遇到了很多问题。随着(最新)TortoiseSVN,我们不断有“树冲突”。还有很多合并问题(有时会回溯一个多月,而不记得真正改变了什么)。

同样重命名dll出错了,Tortoise总是将项目中尚未包含的所有主干dll添加到该项目的工作副本中。然后,您必须在签入之前手动删除这些。

我知道我们永远不应该使用“重新整合分支”,但还有两个选择。谁知道哪一个最好?

我们可以继续保持这种回购结构,还是应该改变它。 将所有Common Dll放入另一个Repo然后使用外部更好吗?

THX

3 个答案:

答案 0 :(得分:1)

  

将所有Common Dll放入另一个Repo然后使用外部是否更好?

不一定是“另一个回购”,但你绝对应该将它视为一个独立的项目。您的布局应如下所示:

  -Project1
      -trunk
      -branches
      -tags
  -Project2
      -trunk
      -branches
      -tags
  -CommonDLL1
      -trunk
      -branches
      -tags
  -CommonDLL2
      -trunk
      -branches
      -tags
   -...

然后Project1/trunk可能会有一个svn:externals属性,其中包含以下内容:

-r148 ^/CommonDLL1/trunk CommonDLL1
-r157 ^/CommonDLL2/trunk CommonDLL2

此属性会导致subversion在您执行结帐或更新时自动在CommonDLL1的工作副本中创建文件夹CommonDLL2Project1/trunk

注意外部定义如何包含修订号。这确保了如果您在CommonDLL1中更改某些内容,则在您明确更改外部定义中的修订号之前,这不会影响Project1 。这对于项目标签的不变性尤其重要。

这种方法有一些缺点,你必须权衡好处:

  • 如果您通过CommonDLL1的工作副本进行更改Project1,那么当更新后神奇地消失时,您可能会感到困惑。这是因为SVN不会自动调整外部定义中的修订号。您必须明确地更改它并提交更改。教育你的团队。

  • 您的持续集成服务器不会自动发现最新的Project1/trunk不再针对最新的CommonDLL1/trunk进行构建。当您在外部定义中更改修订号时,您将只能找到相关信息。

答案 1 :(得分:0)

我认为第二种方法比第一种方法好得多。但是一开始有点难以管理。

答案 2 :(得分:0)

倾向于将事物分成(明智的)合乎逻辑的独立单位。有趣的是,Git DVCS提高了意识:人们想要签出/ trunk / project这样做是不可能的,并且一般的反应是将项目(算作独立单元)切入自己的回购。

虽然这些细粒度的包(“/ project / trunk”方法)涉及更多的工作,但每个组件的独立性最终都会为人们所用。项目/代码的分离导致人们更多地考虑API和交互。换句话说,可能不再需要了解整个图片,只能专注于几个组件。

请参阅Xorg,它采用这种拆分存储库方案(在每个方案中都有自己的主/主干)。

对于您来说,这意味着:您的“现在”状态符合此描述。遗憾的是TSVN无法处理存储库状态;糟糕的工具交互与SVN几年前制定的设计决策相结合。