3

多年来,我一直在使用 ComponentSoftware 的CS-RCS Basic来管理我的各种单一开发人员项目。它对我来说效果很好,但现在我想迁移到现代版本控制系统,在研究了我的选择后,我决定使用 Mercurial。

问题是我一直使用 CS-RCS 的中央存储库,现在我想为单个项目使用单独的 Mercurial 存储库,保留我的 RCS 存储库中的历史记录。

经过一些深入的谷歌搜索后,我得出结论,这样做的唯一方法是将我的 RCS 存储库转换为单独的 CVS 存储库,然后将它们转换为 Mercurial。这两个网站可能是最有帮助的:

为了与 Jeff Atwood 提出并回答我自己的问题的想法保持一致,我将为陷入这种情况的其他人回答这个问题,以防我以后不得不再次找到它。正如您将看到的,虽然我确实找到了解决方案,但它很笨拙并且至少存在一个重大问题。如果其他人有更好的方法,我当然想听听。

4

2 回答 2

1

这是我想出的方法,疣和所有。这有点“货物崇拜”,因为我对 CVS 基本上一无所知,对 Mercurial 也知之甚少:

我有一个可以拍摄快照的 Windows XP 虚拟机,所以我这样做了,然后安装了 CVSNT 和 Mercurial 的 Windows 命令行版本(我在我的主机上使用 TortoiseHg)。我在 VM 中执行此操作,因此可以轻松摆脱 CVSNT、Mercurial 以及在执行此一次性迁移时必须创建的任何其他内容。是的,我可能不必这样做,但虚拟机已经可用,而且多年来我已经从安装/卸载周期中得到了足够多的应用程序。:-)

据我所知,CVSNT 是唯一可以在 Windows 机器上轻松设置 CVS 服务器的可用程序。似乎这曾经是免费的,但所有者当前的网站现在要钱。这不是一件坏事,但我真的无法证明花钱只是为了进行一次性转换。我最终通过谷歌搜索找到了一个旧版本的 CVSNT 并安装它没有问题。

以下是我在学习如何进行此转换时所做的笔记:

长版

将所需的源代码文件夹从主计算机的驱动器复制到 VM 的驱动器。将 C:\RCS 文件夹结构中的各种“,v”文件复制到 VM 上的同一源代码文件夹。只需从 C:\RCS 的相应文件夹中复制 ,v 文件即可。在 VM 上打开命令提示符框并键入以下内容:

path %PATH%;C:\Program Files\cvsnt
mkdir \cvs-repo  [or clean the folder out if it already exists]
cvs -d \cvs-repo init
[A DIR of \cvs-repo should show a CVSROOT folder in there.]

复制您的源代码文件夹在\cvs-repo. \cvs-repo现在应该只有两个文件夹:CVSROOT 和您的新文件夹。也复制适当的“,v”文件。

mkdir \cvs-checkout [or clean that folder out if it already exists]
cd \cvs-checkout
cvs -d \cvs-repo co name_of_your_source_code_folder

"\cvs-checkout\name_of_your_source_code_folder" 的 DIR 应该显示所有源代码文件,这些文件现在已从 CVS 中签出。

如果您还没有这样做,请从https://www.mercurial-scm.org/下载 Mercurial并安装它。打开记事本的副本并将文件“C:\Program Files\Mercurial\hgrc.d\Mercurial.rc”拖入其中。在“[extensions]”下,删除“”行开头的分号;convert =。将文件保存到“C:\Documents and Settings\user_name\Mercurial.ini”

回到 VM 命令行:

path %PATH%;C:\Program Files\Mercurial
mkdir \my-repo.hg  [or clean that folder out if it already exists]
hg convert --datesort \cvs-checkout\source_code_folder_name \my-repo.hg
cd \my-repo.hg
[A DIR of \my-repo.hg should show a new ".hg" folder.]
hg update
[A DIR should now show the ".hg" folder and all the checked-out files.]

将“.hg”文件夹从 \my-repo 复制到主计算机硬盘驱动器上的源代码文件夹。目标文件夹现在将显示在 TortoiseHg 中,其中包含所有适当的更改历史记录,但所有文件都标记为已更改(红色圆圈中的感叹号图标覆盖)。这是因为新的 Mercurial 存储库认为文件是以 Unix 行结尾 (0x0A) 而不是 Windows (0x0D,0x0A) 签入的。这似乎发生在“hg convert”过程中,我还没有找到任何解决方法。

短版

在 VM 中设置好所有内容后,执行以下操作:

  • 删除 \cvs-repo、\cvs-checkout 和 \my-repo.hg 中的所有内容。
  • 在命令行中,cvs -d \cvs-repo init.
  • 回到您的主机上,将源代码文件夹复制到您的虚拟机的共享文件夹中(这就是您在 VirtualBox 中的操作方式;其他虚拟机软件可能会让您只需将文件夹拖放到虚拟机中)。
  • 将相应的 ",v" 文件复制到虚拟机共享文件夹中的源代码文件夹中。
  • 返回 VM,将源代码文件夹移动到 \cvs-repo。
  • cd \cvs-checkout
  • cvs -d \cvs-repo co name_of_your_source_code_folder
  • hg convert --datesort \cvs-checkout\name_of_your_source_code_folder \my-repo.hg
  • cd \my-repo.hg
  • hg update
  • 将 .hg 文件夹从 \my-repo 复制到 VM 上的 L: 驱动器(L 是我的 VM 共享文件夹的映射驱动器号)。
  • 将该文件夹从虚拟机传输文件夹移动到主机上的最终源代码文件夹。

方便的批处理文件

完成这项工作后,我在 VM 上设置了这个批处理文件,以尽可能地自动化该过程:

@echo off
rem Converts source code under RCS control to a Mercurial repository.
rem This batch takes one argument: the name of the source-code folder (in quotes if necessary).
rem
rem This is for a VirtualBox VM that already has CVSNT and Mercurial installed, and has a Shared Folder mapped to drive L.
@echo On the host, copy the source-code folder into the Virtual Machine Transfer folder.  Copy the appropriate ",v" files into the source-code folder in the Virtual Machine Transfer folder.
pause
@echo on
cd \
rmdir /S/Q \cvs-repo
mkdir \cvs-repo 
rmdir /S/Q \cvs-checkout
mkdir \cvs-checkout
rmdir /S/Q \my-repo.hg
mkdir \my-repo.hg
cvs -d \cvs-repo init
xcopy L:\%1 \cvs-repo\%1 /E/I
cd \cvs-checkout
cvs -d \cvs-repo co %1
hg convert --datesort %1 \my-repo.hg
cd \my-repo.hg
hg update
xcopy \my-repo.hg\.hg L:\.hg /E/I

结论

所以,这一切都奏效了,但给我留下了行尾错误的文件。看着这个问题,我发现我不是唯一一个有这个问题的人。我可以忍受这个,但如果有人知道解决方案,我仍然想修复它。

于 2010-08-20T23:43:12.523 回答
0

如果 Mercurial 支持快速导入/快速导出,并且如果您的多文件存储库不使用分支,您可以尝试使用我的 rcs-fast-export 工具(可在 @http: //git.oblomov.eu/rcs -快速出口)。虽然到目前为止我只使用它从 RCS 导出到 git,但我不知道正在使用任何特定于 git 的快速导出命令,因此它可能会起作用。

于 2010-10-16T09:20:38.793 回答