3

如果您想了解实际问题,请滚动到问题的底部。我只是觉得有必要解释一下情况。

事态

在我们公司,由于历史原因,我们有几个版本控制系统。目前我们正在尝试迁移到任何 git-fast-import兼容的分布式版本控制系统,真的,但我们目前的选择是 Mercurial。我现在说,因为一旦你迈出了这一步,在大多数情况下,从一个 DVCS 迁移到另一个 DVCS 会更容易。

我们基本上有三个我们想要加入的代码库以及一个已经提交到一个 SVN 存储库中的部分,我们想要将其分离出来。

所以我们有:

  1. 一个古老的 CVS 存储库
  2. 一个巨大的 (26 GiB) SVN 存储库,其中包含近 7000 个修订版,其中包含大量代码、一些实验性代码和实际垃圾(在转换过程中被过滤掉)以及来自不同版本的构建产品——它们旨在被分离到一个存储库中甚至只是他们自己的文件夹结构)
  3. 一个包含相关代码的 SVN 存储库,但不与其他两个共享文件(将其视为作为文件夹拼接)

巨大的 repo ( 2. ) 包含 CVS repo ( 1. ) 在不同时间点的状态快照。显然,CVS 存储库中没有任何标记,因为这可能很有用。最重要的是,快照在该快照状态之上应用了补丁。

也就是说2.中的一个子文件夹层次结构大致对应于1 .. 但是,无需担心它,因为我们的想法是在最初将其中一个文件夹拼接到不同的路径名下之后停用它们。所以这里没有命名冲突。

到目前为止我所做的

  • 经过一些研究,我选择了reposurgeon作为我选择的工具。这是一个非常强大的工具,实际上可以在git-fast-import流上进行外科手术。我热情地向任何负责类似迁移的人推荐它。
  • 至此,庞大存储库的转换已完全覆盖。文件和文件夹已被删除,旧符号已被删除。问题已被解决,诸如关闭分支(在 SVN 中)然后从另一个同名修订版中重新打开它之类的问题已得到修复,以使它们看起来是连续的。基本上所有的手术都做完了。(结果是 ~350 MiB 作为git-fast-import流,顺便说一句)
  • 较小的 SVN 存储库也主要包括在内,尽管仍有一些小任务。但是,由于我从庞大的 SVN 存储库中获得的经验,我相信这只是几个小时的事情。
  • 最后但并非最不重要的 CVS 存储库。我尝试了许多不同的工具,包括cvs-fast-export现在由 Eric S. Raymond 维护的reposurgeon. 我还考虑过转换为 SVN,只是发现cvs2svn用于执行此操作的工具集 () 也已扩展为导出到 Mercurial。

问题

虽然 SVN 转换需要很长时间才能达到我们可以称之为完成的地步,但 CVS 转换仍在进行中。

由于 CVS 没有存储库范围的修订历史记录,所有工具都必须尝试解析 RCS 文件并理解其内容以拼凑拼图。

通过在编辑器中编辑锁定的 RCS 文件(备份后),我能够手动删除一些非常糟糕的伤疤。这样,一些无效的修订(RCS 和 CVS 对什么是有效修订号有不同的想法)以及在某些文件中作为标记出现的符号和在其他文件中作为分支出现的符号已被清除。

我还能够预处理(CVS)存储库以删除我们不需要的许多分支和标签,在我们感兴趣的分支之前(rcsfile.py来自rcsgrep帮助)。基本上在那个特定点之前,我们只想要MAIN/ trunk/ default/的内容master,不管你想怎么称呼它。

但是,一些工具完全失败(例如cvs-fast-export崩溃),而另一些工具给出的结果有些混乱。

还不错,可以通过reposurgeon. 但是,六个分支甚至从未进入转换后的存储库。

例如,原因似乎在所有情况下,所有工具都会被您在 SVN 中找不到的特定特性所迷惑。

如果分支标签被强制“移动” cvs tag -B(但是,旧版本仍保留在文件中。

现在,新分支可能在原始分支发生后数小时、数天或数月开始。这似乎是让所有这些工具感到不安的原因。

虽然将孤立的分支也包括在内并修补那些“伤口”会很酷,但这不是优先事项。处理的大多数文件cvs tag -B不是源文件,而是类似文件GNUmakefile或其他项目文件。

但是,问题仍然存在,CVS 转换还没有完成,还需要一些时间。

经理们变得不耐烦了……

问题

是否可以先将两个 SVN 存储库拼接到一个 Hg 存储库中,然后(当 CVS 转换完成时)在这些更改中拼接,而无需初始化另一个不相关的 Hg 存储库?

(CVS repo)拼接不会导致路径冲突,我必须提前说。另一个存储库旨在通过其自己的子目录进行拼接,因此不会发生名称冲突。

我知道推送和拉取可以将两年前的提交引入今天某人的存储库。但是,这是否意味着 ahg transplant也有可能成功?即我可以期望能够将十年前的那些提交移植到联合 Hg 存储库中吗?

这样我可以将迁移分成几个阶段。

  1. 将两个 SVN 存储库合并为一个 Hg 存储库 - 基本上是现在
  2. 从现在开始的几周/几个月内,在转换后的(到 Hg 的)CVS 回购中拼接

通过(或任何其他扩展)这在技术上是否可行?hg transplanthg

如果是这样,我也会感谢有关潜在警告的任何建议。

4

0 回答 0