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

我正在寻找一个工具,以迁移一对夫妇的 SVN 存储库到 Mercurial,与历史,标签等。

我正在使用 TortoiseHg (Windowsx32) ,因此会丢弃 ConvertExtended。有一些关于如何在 Linux 机器(你好)上执行这个过程的信息,但是我没有可用的 Linux 机器。

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

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

28715 次浏览

Mercurial 有 内置的转换扩展

  1. 在本地主机上启动 svn 服务器
  2. 转换 svn://localhost/your _ repo
  3. 完成,因为 svn 绑定只需要文件://protocol

这是在 TortoiseHg 常见问题解答:

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

您必须安装 svn-win32-1.4.6命令行工具,然后将它们添加到路径中。然后必须启用转换扩展。此时,您应该能够使用‘ hg convert’命令进行转换。请将有关转换扩展的问题转到 Mercurial 邮件列表或 irc.freenode.net上的 #mercurial

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

我必须自己解决这个问题。我有一台 WindowsXP 机器,它有一个单独的承载 VisualSVN Server的 Windows 服务器。

我也有 乌龟安装以及 CollabNet Subversion Command-Line Client

<Enable Convert Extension w/ Tortoise Hg 2>

非常感谢 永远在评论中指出,使用 TortoiseHg 2.0,启用转换扩展比以往任何时候都更容易。就像他说的

With TortoiseHG 2.0 this has been made 简单得多: 启动 TortoiseHG 从“开始”菜单中选择“工作台” 文件-> 设置。选择扩展名 从列表中。检查’转换’ 复选框,然后单击“确定”。就是这样! 不 需要尝试生成配置 文件,并在文件中搜索它 system. – bgever Mar 11 at 7:56

</Enable Convert Extension w/ Tortoise Hg 2>

<Enable Convert Extension Manually>

To convert a repository from SVN to HG, I followed these steps:

1) Open C: Program Files TortoiseHg Mercurial.ini 打开 C: 程序文件 TortoiseHg Mercurial.ini

剪辑

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

  • XP 或旧版本-C: 文档和设置 USERNAME Mercurial.ini
  • Vista or later - C:\Users\USERNAME\Mercurial.ini

这个文件大部分是空的,您只需列出要覆盖的内容。如果这就是你所拥有的,简单地将这两行添加到文件的最后:

[extensions]
convert =

2)搜索以

[分机]

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

4)找到那行写着

转换

然后删除分号

转换 =

</Enable Convert Extension Manually>

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

6)使用这个命令

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

我发现转换工具可能与网络存储库有问题,所以我必须映射一个驱动器到它,但这对我来说工作得很好。

I just converted a remote SVN repo with HTTP auth to a Mercurial repo, and let me tell you, there's not a lot of documentation on how to do this. I had to download the Mercurial source and install it stand-alone, using the source package, that way the SVN bindings will work the right way.

我是这样安装的:

python setup.py install

它在我的服务器2003盒子上运行得很好。我现在可以通过这样的方式正确地转换 SVN 回购:

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

Mercurial 站点上 ConvertExtension 的文档并不十分清楚,但它确实说明了这一点:

无法安装 颠覆绑定到[ Mercurial 的]内置 因此,您需要使用 安装在 独立的巨蟒

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

要将一个 SVNRepo 转换为 HGRepo 并将其复制到另一个服务器,您将需要一些东西。

  1. 安装 TortoiseHG (检查当前使用的版本)
  2. Python 已安装(检查当前使用的是什么版本)
  3. Python 模块(您可以找到它们 http://pysvn.tigris.org/project_downloads.html)
  4. 您需要将 convert扩展添加到 Tortoise。从 Start 菜单启动 TortoiseHG Workbench。选择 File -> Settings。从列表中选择 Extensions。选中 convert复选框并单击 OK。

First the conversion…

  1. 最好将当前 SVNRepo 所在的文件夹映射到您正在使用的计算机。(即 \\server\folder不映射 SVN Repo 文件夹本身。映射它上面的文件夹)给映射的驱动器一个字母,如 Y:\
  2. 打开命令 Prompt 并键入: CD /D Y:\
  3. Y:\提示符处键入: hg convert y:/RepoName(使用当前回购的名称)小心前斜杠和后斜杠。命令中的斜杠是正斜杠。另外,如果名称中有空格,则将名称放在引号中。(即 Y:/"My Repo folder")
  4. Now it should be running and will create another folder alongside the old one. And an hg folder should be inside. IT WILL NOT BE INITIATED, AND DO NOT INITIATE!
  5. 转换完成。

其次,克隆..。

  1. 打开 TortoiseHG 工作台。转到 File -> Clone Repository
  2. Source: Enter the full path of the converted repo.
  3. 目的地: 输入您想要克隆回购的完整路径。不需要在新目的地创建文件夹,因为克隆过程将创建并初始化该文件夹。
  4. 将权限添加到新的克隆文件夹。
  5. You’re done!!!

没有人仍然不提到 Hgsubversion(扩展维基) ,它可以做到几乎没有任何头痛(不包括罕见病例和特定树)。

只需添加扩展,启用它和 hg clone SVN_REPO到本地汞回购

迟到总比不到好。

一个答案换来两个答案。

  1. 如果它是一个公开的、开源的回购,你可以使用 http://svn2github.com/add/,它花了大约半个小时克隆这个回购到 GitHib,然后把它拉到汞中。

  2. 使用 hg convert的优点是可以继续使用。把 SVN 转换成 Hg 需要 days。如果你停止这个,它将从它停止的地方恢复。

下面是我写的一个批处理文件,因为它是一个垃圾。这个例子中的回购确实花了几天的时间来获取整个历史记录(我在澳大利亚,所以延迟可能是一个因素)。我认为它给了 TFS 服务器一个很好的打击。

This batch file can be run at any time to pull updates from the SVN source if they happen to be the only ones left on earth actually still using SVN. I haven't tested it so see what happens if you do this so if I were you I'd abandon the original branch if you're going to edit the repo.

The robocopy shamap stuff is to maintain the SVN history if you clone the Hg repo, shamap is ephemeral - check the batch file & shamap in (I'd do that on a new branch).

那批货..。

@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

使用 Mercurial 的 convert分机:

  1. 启用转换扩展; 向. hgrc 的 [extensions]节添加 convert=,如下所示:

    [分机]
    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]

note: you can even repeat the hg convert command to include new changes made in the svn repository after the previous convert.

note 2: When hg convert doesn't work using http:// or svn:// you could first checkout the Subversion repository (or update an existing one) and convert using the local checkout; example: hg convert [DirectoryOfLocalCheckout] --source-type svn [DestinationDir]