我需要一些帮助来为我的代码库设计 SCM。代码库相当复杂,所以首先,我将尝试描述它。
代码库由许多不同产品的代码组成,Product1
为了Product2
简单起见(实际上还有更多)。每个Product
都有多个Projects
与之关联的Core Application
软件,例如,和支持软件,例如iOS
和Android
应用程序(这因产品而异)。每个Project
都需要使用它的通用代码Product
(即Core
,iOS
和Android
应用程序都需要共享一些通用代码)。此外,Products
需要彼此共享内部库。
实际上,您最终会得到这样的结构:
Library1
Library2
Product1
├── Common
├── Core Application
├── iOS
└── Android
Product2
├── Common
├── Core Application
├── iOS
└── Android
绝对需要以下功能:
- 能够检查项目的最小代码集 - 例如,如果我想构建
Product1's
Android
应用程序,我只想检查Library1
,Library2
,Product1/Common
,Product1/Android
. 代码库非常庞大,检查所有内容将花费大量时间 - 将共享库、公共代码和项目代码的状态恢复到特定修订版 - 例如,我需要像 2 个月前一样构建以测试错误,
Product2's
Core Application
我需要Library1
,Library2
和全部恢复到相同的修订版Product2/Common
Product2/Core Application
- 在保留历史记录的同时将文件移动到不同的共享文件夹 - 不可能一开始就将 a 的所有正确代码
Product
放入Common
文件夹中。随着时间的推移不断变化的需求和新产品的需求,这意味着曾经存在的代码Product2/Core Application
需要迁移到Product2/Common
,甚至可能Library2
。
目前,我们使用的系统是一个巨大的 SVN 存储库,其中包含所有Products
,Projects
和Libraries
. 在 SVN 中可以进行选择性代码签出,因此我们可以选择仅签出特定文件夹。因为它都是一个存储库,所以一切都很好地恢复到相同的修订版。当我们分支或标记时,我们分支/标记整个存储库!
我想要的是适当地模块化代码库,例如,Library1
存在于它自己的存储库中,并且简单地包含在其他存储库中。这实际上是不可能的svn::externals
,因为它违反了要求 2。
我想使用某种形式的 DVCS,原因如下:
- 性能 - SVN 在提交大的变更集时很慢
- 分支/合并 - 尝试合并大型 SVN 分支是一场噩梦,我们不惜一切代价避免它。我知道使用 DVCS 会容易得多
- 对模块的适当支持。我知道 Git 有子模块,而 Mercurial 有子仓库,这似乎符合我的设计目标,但看起来你必须在更改修订时手动更新子仓库。我希望它在 1 个简单的步骤中完成。
- 更清晰的存储库结构。使用 subrepos,每个项目都将是自己的存储库,具有清晰的结构和清晰的依赖项集
有任何想法吗?