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

问题描述 投票:120回答:9

我正在寻找一种工具来将一些SVN存储库迁移到Mercurial,包括历史记录,标签等。

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

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

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

svn version-control mercurial migration hgsvn
9个回答
92
投票

我不得不自己解决这个问题。我有一个Windows XP机器与一个单独的Windows服务器托管VisualSVN Server

我也安装了TortoiseHG以及CollabNet Subversion Command-Line Client

<Enable Convert Extension w/ Tortoise Hg 2>

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

使用TortoiseHG 2.0,这变得更加简单:从“开始”菜单启动TortoiseHG Workbench。选择文件 - >设置。从列表中选择Extensions。选中“转换”复选框,然后单击“确定”。而已!无需再尝试生成配置文件并在文件系统中搜索它。 - 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 convert file:/// y:/ yoursvnreponame

我发现转换工具可能会遇到网络存储库的问题,所以我不得不将驱动器映射到它,但这对我来说效果很好。


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

7
投票

5
投票

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

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

首先是转换......

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

第二个是克隆......

  1. 打开TortoiseHG Workbench。去File -> Clone Repository
  2. 来源:输入转换后的仓库的完整路径。
  3. 目标:输入克隆repo的位置的完整路径。没有必要在新目的地创建文件夹,因为克隆过程将创建它并初始化它。
  4. 将权限添加到新克隆的文件夹。
  5. 你完成了!!!

3
投票

没有人仍然没有提到hgsubversionExtension Wiki),它可以做到这几乎没有任何头痛(不包括罕见的情况和特定的树)。

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


1
投票

这是在TortoiseHg FAQ

How can I convert a subversion repository to Mercurial?

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

所以它显然是可能的 - 我正在使用Linux,所以我没有尝试过自己。


0
投票

我刚刚将带有HTTP auth的远程SVN repo转换为Mercurial仓库,让我告诉你,关于如何执行此操作的文档并不多。我不得不下载Mercurial源并使用源包独立安装,这样SVN绑定将以正确的方式工作。

我安装它像:

python setup.py install

哪个在我的Server 2003机箱上运行得很好。我现在可以通过这样的方式转换SVN repo的正确方法:

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历史记录,如果克隆Hg repo,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 extension

  1. 启用转换扩展;将qazxsw poi添加到.hgrc的qazxsw poi部分,如下所示: [扩展] 转换=
  2. Linux需要额外的python绑定:convert=
  3. 执行[extensions]命令 请参阅sudo apt-get install python-subversion获取帮助 示例:hg convert(见注2)
  4. 推送到新创建的Mercurial存储库:hg convert -h

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

注意2:当hg convert使用hg convert http://[svnserver]/[Project] --source-type svn [DestinationDir]hg push https://[mercurialserver]/[Project]不起作用时,您可以首先签出Subversion存储库(或更新现有存储库)并使用本地签出进行转换;例如:http://

© www.soinside.com 2019 - 2024. All rights reserved.