如何将大型mercurial存储库分解为较小的存储库

时间:2011-09-12 22:14:38

标签: svn mercurial repository

这是this question,的副本,但特别是关于mercurial。

我有一个庞大的subversion存储库,我已经转换为mercurial。它现在看起来像这样:

MassiveFolder/
   .hg/
   bin/
   common/
   projA/
   projB/
   ...
   projX/
   makefile
   README

我希望在自己的存储库中跟踪每个子项目以获得更好的性能。请注意,它们都构建在相同的bin文件夹中。我不认为这会是一个问题,但我不确定我是否需要做任何事情来调整路径。可以安全地假设每个开发人员都会在同一个结构中克隆存储库,但如果有某种方法可以创建一个可以确保存储库的元存储库,那就更好了。

有没有一种标准的方法可以做到这一点?对于生成根文件夹中的makefile和自述文件,我该怎么办?

如果我必须通过其他一些不应该成为问题的过程重新导入到hg。使用单片存储库进行标准操作只需要太长时间,即使它已经将svn从水中吹走了。

2 个答案:

答案 0 :(得分:4)

您可以使用Mercurial的Convert Extension (您可能已经知道,因为您已将存储库从SVN转换为HG)并使用-filemap选项为其创建单独的HG存储库SVN子文件夹。
您需要include指令:

  

include指令导致文件或目录下的所有文件都包含在目标存储库中,并且排除了不在包含规则下的任何其他元素。

然后,您可以使用Mercurial Subrepositories在所需的文件夹结构中设置存储库:

  

子存储库是一种允许您将存储库集合视为一个组的功能。这将允许您作为一个组克隆,提交,推送和拉取项目及其相关库。

答案 1 :(得分:2)

我在小型存储库中成功使用的方法如下:

确定列出较小的存储库以及它们如何相互关联。

  • 从原始存储库克隆
  • hg rm您不想要的所有文件

如果子项目与顶级Makefile交织在一起,则可以在较小的存储库中添加一个顶级存储库。

这种方法保留了历史,并没有强迫人们重新回避。如果您对爆炸历史感到满意,转换就可以了,并且会缩小存储库大小。

警告的一个词(或几个):与一个存储库操作的简易性相比,子存储库有很多困难的行为。有些操作是递归的,有些则不是。合并特别是recurses,它通常会让我适应。确定整个系统状态可能具有挑战性,特别是随着子存储库数量的增加(我正在帮助管理一个包含> 100个子存储库的项目,并且,这是处理逻辑和最佳方式它)。