-1

我需要一些帮助来为我的代码库设计 SCM。代码库相当复杂,所以首先,我将尝试描述它。

代码库由许多不同产品的代码组成,Product1为了Product2简单起见(实际上还有更多)。每个Product都有多个Projects与之关联的Core Application软件,例如,和支持软件,例如iOSAndroid应用程序(这因产品而异)。每个Project都需要使用它的通用代码Product(即CoreiOSAndroid应用程序都需要共享一些通用代码)。此外,Products需要彼此共享内部库。

实际上,您最终会得到这样的结构:

Library1
Library2
Product1
├── Common
├── Core Application
├── iOS
└── Android
Product2
├── Common
├── Core Application
├── iOS
└── Android

绝对需要以下功能:

  1. 能够检查项目的最小代码集 - 例如,如果我想构建Product1's Android应用程序,我只想检查Library1, Library2, Product1/Common, Product1/Android. 代码库非常庞大,检查所有内容将花费大量时间
  2. 将共享库、公共代码和项目代码的状态恢复到特定修订版 - 例如,我需要像 2 个月前一样构建以测试错误,Product2's Core Application我需要Library1,Library2和全部恢复到相同的修订版Product2/CommonProduct2/Core Application
  3. 在保留历史记录的同时将文件移动到不同的共享文件夹 - 不可能一开始就将 a 的所有正确代码Product放入Common文件夹中。随着时间的推移不断变化的需求和新产品的需求,这意味着曾经存在的代码Product2/Core Application需要迁移到Product2/Common,甚至可能Library2

目前,我们使用的系统是一个巨大的 SVN 存储库,其中包含所有Products,ProjectsLibraries. 在 SVN 中可以进行选择性代码签出,因此我们可以选择仅签出特定文件夹。因为它都是一个存储库,所以一切都很好地恢复到相同的修订版。当我们分支或标记时,我们分支/标记整个存储库!

我想要的是适当地模块化代码库,例如,Library1存在于它自己的存储库中,并且简单地包含在其他存储库中。这实际上是不可能的svn::externals,因为它违反了要求 2。

我想使用某种形式的 DVCS,原因如下:

  1. 性能 - SVN 在提交大的变更集时很慢
  2. 分支/合并 - 尝试合并大型 SVN 分支是一场噩梦,我们不惜一切代价避免它。我知道使用 DVCS 会容易得多
  3. 对模块的适当支持。我知道 Git 有子模块,而 Mercurial 有子仓库,这似乎符合我的设计目标,但看起来你必须在更改修订时手动更新子仓库。我希望它在 1 个简单的步骤中完成。
  4. 更清晰的存储库结构。使用 subrepos,每个项目都将是自己的存储库,具有清晰的结构和清晰的依赖项集

有任何想法吗?

4

1 回答 1

1

Mercurial 最近发生了一些变化,旨在使子存储库更容易和更有效地使用。我没有密切关注它们——你可能想看看最近的hg-crew提交历史,看看里面是否有任何东西可能会影响你的决定。

我广泛使用了 Git 和 Mercurial,但肯定对 Mercurial 有更深入的了解,并且更喜欢使用它。我已经将项目从 ClearCase、SVN 和 Git 迁移到 Mercurial,并且在所有情况下,过渡都非常顺利 - 重要的是有几个人可以为您的团队设置工作流程并设置有代表性的测试存储库和先试试。

hg convert扩展可以将存储库从各种来源转换为 Mercurial 存储库,并且可以使用文件映射仅转换部分存储库、重命名文件/目录等。我确信 Git 上有类似的东西,但我从来不需要使用它。

于 2013-03-26T20:02:43.207 回答