Version control 从CS-RCS迁移到Mercurial

Version control 从CS-RCS迁移到Mercurial,version-control,mercurial,migration,rcs,version-control-migration,Version Control,Mercurial,Migration,Rcs,Version Control Migration,多年来,我一直在使用ComponentSoftware来管理我的各种单一开发人员项目。它对我来说非常有效,但现在我想迁移到现代版本控制系统,在研究了我的选项后,我决定使用Mercurial 问题是,我一直使用一个用于CS-RCS的中央存储库,现在我想为单个项目使用单个Mercurial存储库,从我的RCS存储库中保留历史记录 在进行了一些深入的谷歌搜索之后,我得出结论,唯一的方法是将我的RCS存储库转换为单个CVS存储库,然后将它们转换为Mercurial。这两个网站可能是最有用的: 为

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

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

在进行了一些深入的谷歌搜索之后,我得出结论,唯一的方法是将我的RCS存储库转换为单个CVS存储库,然后将它们转换为Mercurial。这两个网站可能是最有用的:


为了符合杰夫·阿特伍德(Jeff Atwood)提出并回答我自己问题的想法,我将为陷入这种情况的任何其他人回答这个问题,以防我以后不得不再次找到它。正如你所看到的,虽然我找到了一个解决方案,但它很笨重,至少有一个重大问题。如果其他人有更好的方法,我当然想听听。

这是我想出的方法,包括疣子和所有的东西。这有点“货物崇拜”,因为我基本上对CVS一无所知,对Mercurial也不太了解:

我有一个Windows XP虚拟机,我可以拍摄快照,所以我这样做了,然后安装了CVSNT和Windows命令行版本的Mercurial(我在我的主机上使用TortoiseHg)。我在虚拟机中这样做,这样我就可以轻松地摆脱CVSNT、Mercurial,以及在进行一次性迁移时必须创建的任何其他东西。是的,我可能不需要这样做,但虚拟机已经可用,我已经有足够多的零碎应用程序,这些年来安装/卸载周期已经结束。:-)

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

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

长版本 将所需的源代码文件夹从主计算机的驱动器复制到VM的驱动器。将各种“、v”文件从C:\RCS文件夹结构复制到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\u of\u your\u source\u code\u folder”应显示所有源代码文件,这些文件现在已从cvs签出

如果您还没有这样做,请从下载Mercurial并安装它。打开记事本的副本并将文件“C:\Program Files\Mercurial\hgrc.d\Mercurial.rc”拖到其中。在“[extensions]”下,删除行“
;convert=
”开头的分号。将文件保存到“C:\Documents and Settings\user\u 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复制到主计算机硬盘上的源代码文件夹。目标文件夹现在将显示在OrtoiseHG中,包含所有适当的更改历史记录,但所有文件都标记为已更改(红色圆圈中感叹号的图标覆盖)。这是因为新的Mercurial存储库认为文件是用Unix行结尾(0x0A)而不是Windows(0x0D,0x0A)签入的。这似乎发生在“hg转换”过程中,我还没有找到任何解决方法

简本 在VM中设置好所有内容后,下面是要执行的操作:

  • 删除\cvs repo、\cvs checkout和\my-repo.hg中的所有内容
  • 在命令行中,
    cvs-d\cvs repo init
  • 回到主机上,将源代码文件夹复制到虚拟机的共享文件夹中(在VirtualBox中就是这样做的;其他VM软件可能允许您将文件夹拖放到VM中)
  • 将适当的“、v”文件复制到虚拟机共享文件夹中的源代码文件夹中
  • 回到VM中,将源代码文件夹移动到\cvs repo
  • cd\cvs签出
  • cvs-d\cvs回购共同命名您的源代码文件夹
  • hg convert--datesort\cvs checkout\name\u您的\u源代码\u文件夹\my repo.hg
  • cd\my repo.hg
  • hg更新
  • 将.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
结论
所以,这一切都奏效了,但留下的文件有错误的行尾。看看,我知道我不是唯一一个有这个问题的人。我可以接受这一点,但如果有人知道解决方案,我仍然希望修复它。

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

+1+Fav同一艘船。非常感谢。