如何在SVN上迁移/转换为Mercurial(hg)

我正在寻找一个工具,将几个SVN存储库迁移到Mercurial,包括历史logging,标签等等。

我正在使用TortoiseHg(Windows x32),所以ConvertExtensions被放弃。 有一些关于如何在Linux机器上执行这个过程的信息( hgsvn ),但是我没有Linux机器可用。

我可以在Windows上使用这些Python脚本吗? 如果是这样,我需要做什么? 或者,我可以使用其他什么工具来完成这个过程?

基本上,我怎样才能将SVN项目转换为Mercurial?

我只是自己解决这个问题。 我有一个Windows XP机器与一个单独的Windows服务器托pipeVisualSVN服务器 。

我还安装了TortoiseHG以及CollabNet Subversion命令行客户端 。

<Enable Convert Extension w/ Tortoise Hg 2>

非常感谢bgever在TortoiseHg 2.0的评论中指出,使转换扩展比以往更容易。 正如他所说

使用TortoiseHG 2.0,这已经变得非常简单:从开始菜单启动TortoiseHG Workbench。 select文件 – >设置。 从列表中select扩展。 选中“转换”checkbox并单击确定。 而已! 无需再尝试生成configuration文件,并在文件系统中进行search。 – 3月11日7点56分

</Enable Convert Extension w/ Tortoise Hg 2>

<Enable Convert Extension Manually>

要将SVN库转换为HG,我遵循以下步骤:

1)打开C:\ Program Files \ TortoiseHg \ Mercurial.ini

编辑

仅供参考 – 乌龟Hg已将此文件迁移到

  • XP或更早的版本 – C:\ Documents and Settings \ USERNAME \ Mercurial.ini
  • Vista或更高版本 – C:\ Users \ USERNAME \ Mercurial.ini

该文件将大部分是空的,你只要列出你想在那里重写。 如果这就是你所拥有的,简单的把这两行添加到文件的最后:

 [extensions] convert = 

2)search以行开头的行

[扩展]

3)在下面你会看到一个关键字列表,在每一行用分号(;)注释掉

4)find说的那一行

; convert =

并删除分号以便读取

convert =

</Enable Convert Extension Manually>

5)打开命令提示符并导航到您想要在其中创build的新hg文件夹的目录(该过程将在命令提示符打开的目录中创build一个名为yoursvnreponame-hg的新文件夹)。

6)使用这个命令

hg convert file:/// y:/ yoursvnreponame

我发现转换工具可能有networking存储库的问题,所以我不得不映射一个驱动器,但这对我来说工作得很好。

  1. 在本地主机上启动svn服务器
  2. hg convert svn:// localhost / your_repo
  3. 完成,因为svn绑定只需要file://协议

Mercurial 为此提供了一个内置的转换扩展 。

要将SVN Repo转换为HG Repo并将其复制到不同的服务器,您将需要一些东西。

  1. 安装了TortoiseHG。 (查看当前正在使用的版本)
  2. Python安装。 (查看当前正在使用的版本)
  3. Python模块(你可以find它们http://pysvn.tigris.org/project_downloads.html
  4. 您需要将convert扩展名添加到Tortoise。 从开始菜单启动TortoiseHG Workbench。 selectFile -> Settings 。 从列表中selectExtensions 。 检查convertcheckbox,然后单击确定。

首先转换…

  1. 最好将当前SVN Repo所在的文件夹映射到正在使用的计算机上。 (即\\server\folder不映射SVN Repo文件夹本身,映射它上面的文件夹)给映射的驱动器一个字母,如Y:\
  2. 打开命令提示符并键入: CD /DY:\
  3. Y:\提示符下键入: hg convert y:/RepoName (使用当前回购的名称)注意前后斜线。 命令中的一个是正斜杠。 另外,如果名称有空格,请将名称放在引号中。 (即Y:/"My Repo folder"
  4. 现在它应该正在运行,并将创build另一个文件夹旁边的旧的。 而且一个hg文件夹应该在里面。 它不会被启动,也不会启动!
  5. 转换完成。

第二个克隆…

  1. 打开TortoiseHG Workbench。 转到File -> Clone Repository
  2. 来源:input转换回购的完整path。
  3. 目的地:input克隆回购点的完整path。 不需要在新的目的地创build一个文件夹,因为克隆过程将创build并初始化它。
  4. 将权限添加到新克隆的文件夹。
  5. 你完成了!!!

该死的! 没有人还没有提到hgsubversion ( 扩展Wiki ),它可以做到几乎没有任何头痛(不包括罕见的情况和特定的树)。

只需添加扩展名,启用它,并将hg clone SVN_REPO到本地mercurial回购

这是在TortoiseHg FAQ :

我如何将Subversion版本库转换为Mercurial?

您必须安装svn-win32-1.4.6命令行工具,然后将它们添加到您的path。 那么你必须启用转换扩展。 此时,您应该可以使用“ hg convert ”命令进行转换。 请将有关转换扩展名的问题直接发送到Mercurial邮件列表或irc.freenode.net #mercurial

所以这显然是可能的 – 我使用Linux,所以我没有尝试过自己。

我只是把一个远程SVN仓库与HTTPauthentication转换成一个Mercurial仓库,让我告诉你,关于如何做到这一点,没有太多的文档。 我不得不下载Mercurial源代码,并使用源码包单独安装,这样SVN绑定将以正确的方式工作。

我安装它像:

 python setup.py install 

哪些在我的Server 2003框上工作得很好。 我现在可以转换SVN回购正确的方式,通过这样做:

 python c:\python26\scripts\hg convert <remote repo> 

Mercurial网站上的ConvertExtension文档并不十分清楚,但它的确如此说明:

没有办法将Subversion绑定安装到[Mercurial]的内置Python库中。 所以你需要使用安装在独立Python之上的Mercurial

所以现在我只是使用独立版本进行转换,而将TortoiseHg用于实际的VCS工作。

迟到总比不到好 …

两个答案的价格一…

  1. 如果是公开的开放源代码回购,你可以使用http://svn2github.com/add/ ,花费大约半个小时的时间将回购代码克隆到GitHib中,然后将其转化为Hg。

  2. 使用hg convert的好处是可以恢复。 将SVN转换为Hg可能需要几天的时间 。 如果你停下来,它会从停止的地方恢复。

下面是我写的一个batch file,因为Codeplex SVNbridge垃圾。 在这个例子中的回购确实需要花费几天的时间来获取整个历史(我在澳大利亚,所以延迟可能是一个因素)。 我想认为它给了一个TFS服务器一个很好的跳动。

这个batch file可以在任何时候运行,以便从SVN源中获取更新,如果它们恰好是实际上仍在使用SVN的唯一剩下的。 我没有testing过,所以看看会发生什么,如果你这样做,如果我是你,我会放弃原来的分支,如果你要编辑回购。

robocopy shamap东西是维护SVN的历史,如果你克隆Hg repo,shamap是短暂的 – 检查batch file&shamap(我会做一个新的分支)。

批次…

 @echo off mode con:cols=100 lines=800 :: Change the SVN remote name here :: set remote=https://cinch.svn.codeplex.com/svn :: title Fetching SVN from %remote%. This could take...DAYS echo . echo Fetching SVN checkins from %remote% echo . echo Dependencies: Tortoise Hg and hg.exe in the Path would be ideal. echo using hg convert echo . echo First, I will make a backup of shamap in the hg repo folder. echo If shamap in .hg\ is newer then it will be copied to the repo. echo You should commit it so hg clones of this repo work with this. echo Commit this .BeeyATch file as well. echo shamap keeps track of what has been fetched from SVN. echo ok, that ends the educational part of this script... echo Now I will fetch SVN changes from echo %remote% echo ... echo ...(this could take quite some time)... echo ...DAYS...yes...DAYS echo ...especially if it's fecking Codeplex SVN... echo . echo If this craps out just run it again - it will resume from where it left off. echo and fetch the rest...eventually echo . echo Control C to abort or any other key to start: echo . pause echo . :: http://mercurial.selenic.com/wiki/ConvertExtension <== see for details of shamap :: copy the shamap from the original convert into the .hg folder unless it is already there & newer :: don't panic if shamap is much bigger than the original - diff it to see why robocopy .\ .\.hg\ shamap /XO robocopy .\.hg\ .\ shamap /XO echo . hg convert --verbose --debug %remote% "%CD%" echo . echo . echo Finished fetching from %remote% title Finished fetching from %remote% echo Any key to Exit echo . pause exit