首先,我将解释在我们公司中使用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
答案 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
的工作副本中创建文件夹CommonDLL2
和Project1/trunk
。
注意外部定义如何包含修订号。这确保了如果您在CommonDLL1中更改某些内容,则在您明确更改外部定义中的修订号之前,这不会影响Project1
。这对于项目标签的不变性尤其重要。
这种方法有一些缺点,你必须权衡好处:
如果您通过CommonDLL1
的工作副本进行更改Project1
,那么当更新后神奇地消失时,您可能会感到困惑。这是因为SVN不会自动调整外部定义中的修订号。您必须明确地更改它并提交更改。教育你的团队。
您的持续集成服务器不会自动发现最新的Project1/trunk
不再针对最新的CommonDLL1/trunk
进行构建。当您在外部定义中更改修订号时,您将只能找到相关信息。
答案 1 :(得分:0)
我认为第二种方法比第一种方法好得多。但是一开始有点难以管理。
答案 2 :(得分:0)
倾向于将事物分成(明智的)合乎逻辑的独立单位。有趣的是,Git DVCS提高了意识:人们想要签出/ trunk / project这样做是不可能的,并且一般的反应是将项目(算作独立单元)切入自己的回购。
虽然这些细粒度的包(“/ project / trunk”方法)涉及更多的工作,但每个组件的独立性最终都会为人们所用。项目/代码的分离导致人们更多地考虑API和交互。换句话说,可能不再需要了解整个图片,只能专注于几个组件。
请参阅Xorg,它采用这种拆分存储库方案(在每个方案中都有自己的主/主干)。
对于您来说,这意味着:您的“现在”状态符合此描述。遗憾的是TSVN无法处理存储库状态;糟糕的工具交互与SVN几年前制定的设计决策相结合。