【问题标题】:How to migrate/convert from SVN to Mercurial (hg) on windows如何在 Windows 上从 SVN 迁移/转换为 Mercurial (hg)
【发布时间】:2010-10-25 09:54:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: svn version-control mercurial migration hgsvn


    【解决方案1】:

    【讨论】:

    • 我知道,这是我偶然发现的第一件事,但引用:“请注意,您不能使用 Win32 Mercurial 二进制文件执行此操作 - 无法将 Subversion 绑定安装到其内置-在 Python 库中”我正在使用 TortoiseHg ...
    • 使用 Linux live CD 还是虚拟机?
    • 这是绝对正确的答案。我只使用 hg convert 扩展名 (selenic.com/mercurial/wiki/…) 并使用没有 pysvn 扩展名的 SVN 存储库的文件协议:hg convert file:///X:/HOME/REPOS/mysvnrep newhgrep
    【解决方案2】:
    1. 在 localhost 上启动 svn 服务器
    2. hg 转换 svn://localhost/your_repo
    3. 完成,因为只有 file:// 协议需要 svn 绑定

    【讨论】:

    • 不,win32 或 TortoiseHg 的 mercurial 二进制文件都没有附带转换扩展,因此“hg convert”在 win32 上甚至不是一个有效的命令。
    • 我尝试使用 svn:// 而不是 file:// 但它一直要求 Python 绑定
    • 使用 svn:// 而不是 file:// 在没有 Python 绑定的情况下为我工作。要启动 svn 服务器,命令是:svnserve -r -d
    【解决方案3】:

    这是在TortoiseHg FAQ:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      <Enable Convert Extension w/ Tortoise Hg 2>

      非常感谢bgever 在 cmets 中指出使用 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

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

      【讨论】:

      • 选择这个问题的答案很困难。 evilbloodydemon 在他的回答中评论编辑配置以启用转换扩展时是对的,但这个答案更加清晰和准确
      • 我只是想提一下,我在没有 SVN 命令行客户端的情况下测试了它,它也能正常工作。您甚至不需要 SVN 服务器来执行此操作,只需访问存储库文件路径即可。
      • 这对 Mercurial V1.4.3 非常有效。一个使用了 1 年的 svn 存储库转换得非常快,完整的历史记录完好无损。非常感谢!
      • 只是添加 - 在默认 TortoiseHG 安装中不会创建 ini 文件。如果您知道自己在做什么,则需要先应用/保存一些设置或从空白文件开始。
      • 在 TortoiseHG 2.0 中,这变得更加简单:从开始菜单启动 TortoiseHG 工作台。选择文件 --> 设置。从列表中选择扩展。选中“转换”复选框,然后单击确定。而已!无需再尝试生成配置文件并在文件系统中搜索。
      【解决方案5】:

      我刚刚将带有 HTTP 身份验证的远程 SVN 存储库转换为 Mercurial 存储库,让我告诉你,关于如何执行此操作的文档并不多。我必须下载 Mercurial 源并使用源包独立安装,这样 SVN 绑定才能以正确的方式工作。

      我是这样安装的:

      python setup.py install
      

      这在我的 Server 2003 机器上运行良好。我现在可以通过执行以下操作以正确的方式转换 SVN 存储库:

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

      Mercurial 网站上的 ConvertExtension 文档不是很清楚,但确实这样说:

      没有办法安装 颠覆绑定到 [Mercurial's] 内置 Python 库。所以你需要使用 安装在顶部的 Mercurial 独立的 Python

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

      【讨论】:

        【解决方案6】:

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

        1. 已安装 TortoiseHG。 (查看当前使用的版本)
        2. Python 已安装。 (查看当前使用的版本)
        3. Python 模块(您可以找到它们http://pysvn.tigris.org/project_downloads.html
        4. 您需要将 convert 扩展名添加到 Tortoise。从开始菜单启动 TortoiseHG 工作台。选择File -&gt; 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 工作台。转至File -&gt; Clone Repository
        2. 来源:输入转换后的 repo 的完整路径。
        3. 目标:输入要克隆存储库的完整路径。无需在新目的地创建文件夹,因为克隆过程会创建并初始化它。
        4. 将权限添加到新的克隆文件夹。
        5. 大功告成!!!

        【讨论】:

        • 嗨,可以解释一下为什么你不应该init第一个存储库吗?
        【解决方案7】:

        仍然没有人不提及hgsubversion (Extension Wiki),它可以做到这一点几乎不会让人头疼(不包括罕见的情况和特定的树)。

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

        【讨论】:

          【解决方案8】:

          迟到总比没有好......

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

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

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

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

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

          robocopy shamap 的内容是在克隆 Hg 存储库时维护 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
          

          【讨论】:

            【解决方案9】:

            使用 Mercurial 的 convert extension

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

              [扩展]
              转换=

            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]

            【讨论】:

              猜你喜欢
              • 2012-03-07
              • 2011-02-19
              • 2011-03-17
              • 1970-01-01
              • 1970-01-01
              • 2011-07-06
              • 1970-01-01
              • 2017-05-17
              • 1970-01-01
              相关资源
              最近更新 更多