将遗留代码从CVS转移到分布式存储库(例如git或mercurial)。 初始库devise需要的build议

介绍和背景

我们正在改变源代码pipe理系统,我们正在评估git和mercurial。 总的代码基础是大约600万行代码,所以不是很大,也不是很小。

首先让我们先简单介绍一下当前版本库devise的外观。

我们有一个完整的代码库的基础文件夹,在这个层次下面有几个不同的上下文中使用的所有sorting模块。 例如,“dllproject1”和“dllproject2”可以看作是完全独立的项目。

我们正在开发的软件是我们所说的configuration器,可以根据不同的客户需求进行无尽的定制。 总的来说,我们可能有50个不同的版本。 但是,他们有一个共同点。 它们都共享一些强制模块(mandatory_module1 ..)。 这些文件夹基本上包含内核/核心代码和通用语言资源等。所有定制可以是其他模块(module1 ..)之间的任意组合。

由于我们目前正在使用CVS,我们在CVSROOT / modules文件中添加了别名。 他们可能看起来像这样:

core –a mandatory_module1 mandatory_module2 mandatory_module3 project_x –a module1 module3 module5 core 

所以如果有人决定在project_x上工作,他/她可以通过以下方式快速检出所需的模块:

 base>cvs co project_x 

问题

直观地说,将基础文件夹作为单个存储库是错误的。 作为程序员,您应该能够检查出当前正在使用的项目所需的确切代码子集。 你对此有什么想法?

另一方面,将这些模块中的每一个都放在单独的存储库中感觉更为正确。 但是这使程序员难以检查他们需要的模块。 你应该可以通过一个命令来完成这个任务。 所以我的问题是:在git / mercurial中定义别名是否有类似的方法?

任何其他问题,build议,指针,非常欢迎!

PS。 我已经search了类似的问题,但并不觉得其中的任何一个100%适用于我的情况。

只是一个快速的评论,提醒你:

  • 这些迁移通常提供重新组织源的机会,而不是沿着模块(每个都有一个存储库),而是沿着function域分割(同一个给定function域的几个模块放在同一个存储库中)。

然后使用子模块作为定义configuration的一种方式。

  • Git是没问题的,但是从Linus自己承认 ,把所有东西放到一个存储库中可能会有问题。

CVS,也就是说,它最终的目标是“一次一个文件”模式。

哪一个是好的,你可以有一百万个文件,然后只检查其中的几个 – 你永远不会看到其他999,995文件的影响。

从根本上说,Git从来没有看到整个回购。 即使你限制了一些东西(比如只检查一部分,或者让历史回溯一点点),git最终还是会一直关心整个事情,并把知识带到身边。

所以如果你强迫它把一切看作一个巨大的存储库,那么git会非常糟糕。 我不认为这个部分是可以修复的,尽pipe我们可以改进它。

是的,那就是“大文件”问题。 我真的不知道如何处理大文件。 我知道,我们吮吸他们。


上述两点主张为大型系统(和大型遗留存储库)提供更多面向组件的方法。

使用Git子模块 ,您可以在项目中检出它们(即使是两步处理)。 不过,你可以使用子模块pipe理工具( 比如git.rake )。


当我正在修复一个在多个项目之间共享的模块中的错误时,我只是修复了这个错误并提交了,并且只是做了更新

这就是我在卖方分部所说的“系统方法”:每个人都在最新的(HEAD)上工作,对于less数项目是有效的。
尽pipe如此,对于大量的模块来说,“模块”的概念仍然非常有用,但是对于DVCS的pipe理却不尽相同:

  • 对于与金融领域密切相关的模块(又名“在同一个function域”,如“所有与PNL相关的模块 – 盈利和亏损 – 或”风险分析“),您都需要使用最新的(HEAD)涉及的所有组件。
    这可以通过使用子树策略来实现,而不是为了发布(推)对其他子模块的更正,而是要跟踪其他团队完成的工作。
    Git允许额外的奖金,这个“跟踪”不需要在你的仓库和一个“中央”仓库之间进行,但是也可以在你和其他团队的本地仓库之间进行,这样可以很快在类似性质的项目之间来回整合和testing。

  • 然而,对于不直接在你的function域的模块,子模块是一个更好的select,因为它们指的是模块的修复版本(提交):
    当一个底层框架发生变化时,你不希望它被即时传播,因为它会影响到所有其他的团队,然后他们将不得不放弃他们正在做的事情,以便使他们的代码适应新的版本所有其他团队都要意识到这个新版本,以便他们不要忘记更新该低级别组件或“模块”)。
    这使您只能使用其他模块的官方稳定标识版本,而不是可能不稳定或未经过完全testing的HEAD。

至于Mercurial方面,build议也是将大型的传统CVS / SVN版本库重构成更小的组件。 公共代码应该放在自己的库中,然后应用程序代码将依赖于这些库,类似于如何依赖于其他库。

Mercurial有森林扩展 ,可以让你pipe理“源树”的“森林”。 采用这种方法,您可以将几个较小的存储库合并为一个更大的存储库 对于CVS,你可以做相反的事情:你签出一个大型版本库的一小部分。

我没有亲自使用过林扩展,它的页面说应该使用与Mercurial捆绑在一起的更新版本。 但是,它在OpenJDK项目中被 Sun等大公司使用。

目前还有一些工作正在按照Mercurial wiki中嵌套仓库页面的devise将子仓库报告直接添加到Mercurial核心。