将遗留代码库从cvs转移
介绍和背景
我们正在改变源代码控制系统,我们正在评估git和mercurial。 总代码基数约为600万行代码,所以不是很大,也不是很小。
首先让我首先简要介绍一下当前存储库设计的外观。
我们为完整的代码库提供了一个基础文件夹,在这个层次下面有几种不同的上下文中使用的各种模块。 例如,“dllproject1”和“dllproject2”可以看作是完全独立的项目。
我们正在开发的软件是我们称之为配置器的产品,可根据不同的客户需求进行无尽的定制。 总的来说,我们可能有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中是否有类似的方法来定义别名?
任何其他问题,建议,指针都非常受欢迎!
PS。 我已经搜索过类似的问题,但并不认为他们中的任何一个都适用于我的情况。
只是一个快速的评论,提醒你:
然后使用子模块作为定义配置的一种方式。
[...] CVS,也就是说,它真的最终面向“一次一个文件”模式。
这是很好的,你可以有一百万个文件,然后只检查其中的几个 - 你永远不会看到其他999,995文件的影响。
从根本上说,Git从未真正看过整个回购。 即使你限制了一些东西(比如只查看一部分内容,或者让历史回溯一点点),git仍然总是关心整个事情,并且传递知识。
所以如果你强迫它将所有东西看作一个巨大的存储库,那么git会非常糟糕。 我不认为这部分是真正可以修复的,尽管我们可以改进它。
是的,然后是“大文件”问题。 我真的不知道如何处理大文件。 我知道,我们吮吸他们。
上述两点主张为大型系统(和大型旧式存储库)提供更多面向组件的方法。
使用Git子模块,您可以在项目中检出它们(即使它是两步处理)。 然而,你可以使用工具而不是子模块管理更简单(例如git.rake)。
当我想修复一个在多个项目之间共享的模块中的错误时,我只是修复了这个错误并提交了它,并且只是做了更新
这就是我在供应商分公司所说的“系统方法”:每个人都在最新的(HEAD)上工作,并且对于少数项目是有效的。
尽管如此,对于大量的模块来说,“模块”的概念仍然非常有用,但其管理与DVCS并不相同:
对于与金融领域密切相关的模块(又名“相同功能域”,如“与PNL相关的所有模块 - 盈利和亏损 - 或”风险分析“),您需要使用最新的(HEAD)涉及的所有组件。
这可以通过使用子树策略来实现,而不是为了让您发布(推送)对其他子模块的更正,而是跟踪其他团队完成的作品。
Git允许使用额外奖金,这种“跟踪”不必在您的存储库和一个“中央”存储库之间进行,但也可以在您和其他团队的本地存储库之间进行,从而可以非常快速地在类似性质的项目之间来回整合和测试。
但是,对于不直接位于功能域中的模块,子模块是更好的选择,因为它们指的是模块的修订版本(提交):
当一个低级框架发生变化时,你不希望它被即时传播,因为它会影响其他所有的团队,然后他们将不得不放弃他们正在做的事情来调整他们的代码到新版本中(尽管你想要所有其他团队都要注意这个新版本,以便他们不要忘记更新该低级别组件或“模块”)。
这使您只能使用其他模块的官方稳定识别版本,而不是可能不稳定或未经过完全测试的HEAD。
至于Mercurial方面,建议还将大型遗留CVS / SVN存储库重构为更小的组件。 通用代码应该放入自己的库中,然后应用程序代码将依赖于这些库的方式与其依赖于其他库的方式类似。
Mercurial具有森林扩展功能,可让您管理“源树”的“森林”。 采用这种方法,您可以将几个较小的存储库合并为一个较大的存储库 对于CVS,你可以做相反的事情:检出大型存储库的一小部分。
我没有亲自使用过林扩展,其页面上说应该使用与Mercurial捆绑的更新版本。 但是,它在OpenJDK项目中被Sun等大型组织所使用。
根据Mercurial wiki中嵌套存储库页面的设计,目前正在开展将子存储库报告直接添加到Mercurial核心的工作。
链接地址: http://www.djcxy.com/p/92237.html下一篇: inversion of control