120

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

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

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

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

4

9 回答 9

93

我只需要自己解决这个问题。我有一台 Windows XP 机器,它有一个单独的 Windows 服务器托管VisualSVN Server

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

<Enable Convert Extension w/ Tortoise Hg 2>

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

TortoiseHG 2.0 使这变得更加简单:从开始菜单启动 TortoiseHG 工作台。选择文件 --> 设置。从列表中选择扩展。选中“转换”复选框,然后单击确定。就是这样!无需再尝试生成配置文件并在文件系统中搜索。– 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)找到说的行

;转换=

并删除分号,使其显示为

转换 =

</Enable Convert Extension Manually>

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

6) 使用此命令

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

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

于 2009-07-23T22:48:00.067 回答
8
  1. 在 localhost 上启动 svn 服务器
  2. hg 转换 svn://localhost/your_repo
  3. 完成,因为 svn 绑定只需要 file:// 协议
于 2009-05-22T11:29:49.550 回答
7

Mercurial 对此有一个内置的转换扩展

于 2009-05-11T21:39:44.097 回答
5

要将 SVN 存储库转换为 HG 存储库并将其复制到不同的服务器,您需要做一些事情。

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

首先是转换……</p>

  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. 转换完成。

其次是克隆……</p>

  1. 打开 TortoiseHG 工作台。去File -> Clone Repository
  2. 来源:输入转换后的 repo 的完整路径。
  3. 目的地:输入您想要克隆 repo 的完整路径。无需在新目的地创建文件夹,因为克隆过程将创建并初始化它。
  4. 将权限添加到新的克隆文件夹。
  5. 你完成了!!!
于 2012-11-06T23:18:03.967 回答
3

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

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

于 2012-11-07T01:09:12.980 回答
1

这是在TortoiseHg 常见问题解答中:

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

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

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

于 2009-05-26T21:10:23.030 回答
0

我刚刚将带有 HTTP 身份验证的远程 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 工作。

于 2010-05-12T18:40:46.303 回答
0

迟到总比不到好 ...

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

  1. 如果它是一个公共的开源仓库,您可以使用http://svn2github.com/add/大约半小时将该仓库克隆到 GitHib,然后将其拉入 Hg。

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

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

这个批处理文件可以随时运行以从 SVN 源中提取更新,如果它们恰好是地球上仅存的仍然使用 SVN 的更新。我还没有测试过,所以看看如果你这样做会发生什么,所以如果我是你,如果你要编辑 repo,我会放弃原来的分支。

如果您克隆 Hg 存储库,这些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
于 2015-01-24T11:15:24.550 回答
0

使用 Mercurial 的convert扩展

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

    [扩展]
    转换=

  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]

于 2018-06-08T12:07:07.240 回答