首页 文章

SVN to Git使用快速导入/导出流

提问于
浏览
2

我一直在努力将大约32,000次提交的SVN回购转换为任何DVCS(Git,Bazaar,Mercurial,Plastic SCM) . 一两个星期后,我意识到最好的选择是将SVN仓库转换为Git,获得快速导出流,并将.fe流导入任何DVCS,因为它们都支持git快速导出/导入方法 .

我使用reposurgeon和git-svn取得了最大的成功 . 但同样,由于尺寸的原因,这两种工具都无法一次性转换完整的回购 . 我也试过SubGit,虽然它有效,但速度非常慢(处理1060次提交约24小时) .

所以我想我可以分别转换repo(主干,分支,标签,自定义文件夹)中的每个文件夹,然后在Git中进行组合 . 然后我意识到这是不可能的,因为git的repo结构与SVN明显不同 .

我的问题是,是否可以使用上面的方法并使用一些魔法,将单独的转换组合成一个Git仓库?

基本上我需要为我的SVN仓库获得一个快速的导出/导入流,将其转换为另一个DVCS,并认为Git中间步骤最简单 . 成功转换有哪些其他选项?

提前致谢 .

2 回答

  • 0

    单独转换文件夹并组合git存储库原则上应该工作,但要做到正确会非常棘手,所以我建议反对它 .

    无论如何,32,000次提交并不是那么多,并且 git-svn 应该能够处理它,尽管可能需要一天左右的时间 . 但是,如果它太慢,你将不得不尝试一下 .

    可能减慢git-svn克隆操作的事情

    SVN存储库速度

    首先,当然是SVN存储库的速度 . 尝试创建SVN存储库的本地镜像(使用 svnadmin dump/loadsvnsync ),然后克隆它 .

    “子目录”分支/标签

    分支或标签(git处理相同)可能会成为一个问题 . 每当 git-svn clone 遇到一个SVN分支,它不是trunk的副本,而是一个子目录的副本时,它将重新读取分支子目录的整个SVN历史记录(你可以在 git svn clonehere is an explanation by the author的输出中看到它) . 这意味着克隆的速度不仅与SVN修订的数量成正比,而且与"subdirectory branches" b 的数量成正比,即如果 b = 10 ,则克隆可能需要长达10倍 .

    这个问题没有简单的解决方案 . 首先,你可以尝试克隆没有标签 - 通常标签只是反转到SVN修订版ID,所以有一个标签列表就足够了(除非你的标签包含变化......呃) . 如果这还不够,也可以跳过一些分支......虽然你必须决定是否有你可以做到的 .

    极端的解决方案是使用选项 --no-follow-parent . 这将阻止 git svn 从一开始就重新读取分支 . 分支仍将被读取,但是,它们将不会连接到历史的其余部分 . 这仍然告诉你在那里做了什么,但是让他们很难合并回来 .


    最后,请注意您可以中断并恢复克隆过程 . 要恢复,请运行 git svn fetch . 您可能需要多次重启,但有一点耐心克隆应该通过 .

  • 3

    复活一个非常古老的问题,但我认为答案可能对某人有用 .

    您可能想尝试svn-all-fast-export / svn2git . 几年前,我将一个旧的SVN repo转换为Git约35k,同时还将它分成几个单独的Git存储库 . 我在我的笔记本电脑上有一份SVN repo的本地副本,它只花了大约15分钟(这很棒,因为我必须多次运行转换才能对结果感到满意;) . 我还使用BFG Repo-Cleaner来后处理转换后的Git存储库 .

    svn-all-fast-export / svn2git不是最直接的软件,我不得不求助于阅读源代码几次以真正了解正在发生的事情 . 您可能想查看关于此主题的其他答案以获取一些提示:svn-all-fast-export: Match file names

相关问题