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


120

我正在寻找一种工具,可将具有历史记录,标签等的几个SVN存储库迁移到Mercurial。

我使用的是TortoiseHg(Windows x32),因此ConvertExtensions被丢弃。有一些有关如何在Linux机器(hgsvn)上执行此过程的信息,但是我没有Linux机器。

我可以在Windows上使用这些Python脚本吗?如果是这样,我该怎么办?或者,我可以使用哪些其他工具来执行此过程?

基本上,如何将SVN项目转换为Mercurial?

Answers:


93

我只需要自己解决这个问题。我有一台装有独立Windows Server的Windows XP计算机,该服务器托管了VisualSVN Server

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

<Enable Convert Extension w/ Tortoise Hg 2>

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

使用TortoiseHG 2.0,它变得更加简单:从“开始”菜单启动TortoiseHG Workbench。选择文件->设置。从列表中选择扩展。选中“转换”复选框,然后单击“确定”。而已!无需尝试再生成配置文件并在文件系统中搜索它。– bgever 3月11日7:56

</Enable Convert Extension w/ Tortoise Hg 2>

<Enable Convert Extension Manually>

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

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

编辑

仅供参考-Tortoise Hg已将此文件迁移到

  • XP或更旧版本-C:\ Documents and Settings \ USERNAME \ Mercurial.ini
  • Vista或更高版本-C:\ Users \ USERNAME \ Mercurial.ini

该文件将大部分为空,您只列出您要覆盖的文件即可。如果是这样,只需将这两行添加到文件的末尾即可:

[extensions]
convert =

2)搜索以开头的行

[扩展名]

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

4)找到提示

; convert =

并删除分号,使其读取

转换=

</Enable Convert Extension Manually>

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

6)使用此命令

hg转换文件:/// y:/ yoursvnreponame

我发现转换工具可能会在网络存储库中出现问题,因此我不得不将驱动器映射到它,但这对我来说很好。


选择这个问题的答案很困难。evilbloodydemon在他的答案中进行了评论以编辑配置以启用转换扩展,这是正确的,但此答案更加清晰和准确
David Lay

1
我只想提一下,我在没有SVN命令行客户端的情况下对此进行了测试,并且效果很好。您甚至不需要运行SVN服务器即可,只需访问存储库文件路径即可。
Michael La Voie

使用Mercurial V1.4.3对我来说效果很好。一个只有1年历史的svn存储库很快就转换了完整的历史记录。非常感谢!
乔纳森·韦伯

1
只是要添加-在默认的TortoiseHG安装中不会创建ini文件。您需要先应用/保存一些设置,或者如果知道自己在做什么,则以空白文件开头。
艾哈迈德(Ahmad)2010年

9
使用TortoiseHG 2.0,它变得更加简单:从“开始”菜单启动TortoiseHG Workbench。选择文件->设置。从列表中选择扩展。选中“转换”复选框,然后单击“确定”。而已!无需尝试再生成配置文件并在文件系统中搜索它。
Bart Verkoeijen 2011年

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

不会,win32或TortoiseHg的Mercurial二进制文件都没有带有convert扩展名,因此“ hg convert”甚至在win32上也不是有效的命令。
戴维·莱

1
我尝试使用svn://而不是file://,但是它一直在请求Python绑定
fglez,2009年

在没有Python绑定的情况下,使用svn://而不是file://可以为我工作。要启动svn服务器,命令是:svnserve -r <回购根目录路径-d
Petter Wigle 2010年

7

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


2
我知道,这是我偶然发现的第一件事,但是引用:“请注意,您无法使用Win32 Mercurial二进制文件执行此操作-无法将Subversion绑定安装到其内置的Python库中” TortoiseHg ...
David Lay

使用Linux Live CD还是虚拟机?
richq

这是绝对正确的答案。我只使用了hg convert扩展名(selenic.com/mercurial/wiki/…),并且使用了不带pysvn扩展名的SVN存储库的文件协议:hg convert file:/// X:/ HOME / REPOS / mysvnrep newhgrep
van

5

要将SVN Repo转换为HG Repo并将其复制到其他服务器,您需要做一些事情。

  1. 已安装TortoiseHG。(检查以查看当前使用的版本)
  2. 已安装Python。(检查以查看当前使用的版本)
  3. Python模块(您可以找到它们http://pysvn.tigris.org/project_downloads.html
  4. 您需要将convert扩展名添加到Tortoise。从开始菜单启动TortoiseHG Workbench。选择File -> SettingsExtensions从列表中选择。选中convert复选框,然后单击确定。

首先转换...

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

其次是克隆……

  1. 打开TortoiseHG工作台。去File -> Clone Repository
  2. 来源:输入转换后的仓库的完整路径。
  3. 目的地:输入要将存储库克隆到的完整路径。无需在新目标位置创建文件夹,因为克隆过程将创建该文件夹并对其进行初始化。
  4. 将权限添加到新的克隆文件夹。
  5. 你完成了!!!

嗨,是否可以解释为什么不应该init使用第一个存储库?
本·佩奇

3

仍然没有人没有提及hgsubversion扩展维基),它几乎可以做到(几乎没有头疼)(不包括罕见的情况和特定的树)。

只需添加扩展名,启用它并添加hg clone SVN_REPO到本地商品库


1

这在TortoiseHg常见问题解答中

如何将Subversion存储库转换为Mercurial?

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

因此,这似乎有可能-我正在使用Linux,所以我没有尝试过。


0

我只是将具有HTTP auth的远程SVN存储库转换为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工作。


0

迟到总比不到好 ...

两个答案一个的价格...

  1. 如果它是公开的开放源代码存储库,则可以使用http://svn2github.com/add/将其复制到GitHib大约半小时,然后将其导入到Hg中。

  2. 使用的好处hg convert是可以恢复。将SVN转换为Hg可能需要几天时间。如果停止此操作,它将从中断处恢复。

下面是我写的一个批处理文件,因为Codeplex SVNbridge垃圾。此示例中的回购确实花了几天的时间来获取全部历史记录(我在澳大利亚,所以延迟可能是一个因素)。我想认为它给某处的TFS服务器带来了良好的反响。

如果批处理文件恰好是实际仍在使用SVN的唯一文件,则可以随时运行该批处理文件以从SVN源中提取更新。我尚未对其进行测试,因此请查看如果执行此操作会发生什么情况,所以如果您是我,那么如果您要编辑存储库,则将放弃原始分支。

robocopy shamap东西是,如果你克隆回购汞保持SVN历史,shamap是短暂的-检查(我做的是一个新的分支)的批处理文件和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

0

使用Mercurial 的convert扩展名

  1. 启用转换扩展;像这样添加convert=[extensions].hgrc部分:

    [扩展名]
    convert =

  2. Linux需要其他python绑定: sudo apt-get install python-subversion
  3. 执行hg convert命令
    • hg convert -h求救
    • 示例:(hg convert http://[svnserver]/[Project] --source-type svn [DestinationDir] 请参见注释2)
  4. 推送到新创建的Mercurial存储库: hg push https://[mercurialserver]/[Project]

注意:您甚至可以重复执行hg convert命令,以包含在上一次转换后在svn存储库中所做的新更改。

注2:如果hg convert无法使用,http://或者svn://您可以先签出Subversion存储库(或更新现有的存储库),然后使用本地签出进行转换;例:hg convert [DirectoryOfLocalCheckout] --source-type svn [DestinationDir]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.