有效地Git克隆巨大的svn存储库

时间:2013-11-29 16:24:31

标签: git svn github git-svn

我有一个包含大约2.5GB文件的庞大svn存储库。它有许多分支和标签。它有72000个修订版。我想制作一个本地git克隆 通过常规git克隆执行此操作大约需要24天。

这会起作用吗?

  1. 我将使用多台机器并行地克隆部分存储库。第一台机器将克隆1到12000的修订版,下一台将从12000到24000克隆,依此类推......

  2. 然后我必须将所有这些本地gits合并为一个。

  3. 我该怎么做?还有其他办法吗?

    编辑:我的主要要求是能够在本地查询更改历史记录。所以,我希望有一份完整历史的本地副本。事实上,这是我想转向git的主要原因。 另外,我没有管理员访问svn repo

5 个答案:

答案 0 :(得分:1)

在parallell中进行克隆是行不通的,因为git中的修订需要指向其父修订版的SHA1哈希值。

鉴于只有机器#1(将来的某个时间)知道修订版12000的SHA1哈希值,因此机器#2不可能在此之前为修订版12001创建git修订版,因为SHA1哈希不是&机器#2可以使用#39。即使在导入过程中可以在多台机器之间传递哈希值,它仍然是一个串行过程而不是并行过程。

答案 1 :(得分:1)

您是要尝试克隆整个存储库还是特定分支?我建议只克隆行李箱。除此之外,这里没有银弹。如果需要很长时间,你只需要等待。无论如何,你只需要这样做一次(希望,好吧,请看下面我的最后一个注释)。

顺便说一下,我在working with large Subversion repos with Git写了一篇博文,你可能会在那里找到其他有用的提示。

就个人而言,在经历了很多努力之后,我又回到了原生的Subversion。这太开销了。有时我的本地Git仓库被腐蚀得无法修复,我不得不再次克隆大型仓库......我对此有很多痛苦。你已被警告过了。

答案 2 :(得分:0)

我不确定你的方法是最好的。

svnadmin dump生成的转储中,contrib svn-fe应该是fast-import。考虑给出一个机会。

git中还有一个git-remote-testsvn,它不是很完美(或保证有效)。你也可以给它一个机会。

另外,您能否澄清一下您是想要一次性迁移还是实际使用svn存储库,但最后还是使用git。

答案 3 :(得分:0)

最后我找到了一种方法:当svn上只有一个trunk而没有分支时,这种方法有效。如果svn有分支,那么我们必须为每个分支重复这个过程

让我们说你的svn有6000个版本。前3000用git1,第二用3000用git2。

  1. 首先将git2作为遥控器添加到git1 git remote add git2 <path to git2>

  2. 结帐git2作为跟踪的本地分支。 git checkout -b git2 remotes/git2/master

  3. 现在你有两个独立的分支。

        ... o --- o --- ... o
                            git1
        o ... o
        r'    git2
    

    我们知道git1的版本是3000,git2的版本是3001,最后是6000。 我们将加入这两个分支 git rebase -p --onto <git1SHA> --root <git2SHA>

    会有冲突,但这只会是第一次提交。

    最终结果如下:

                   git1
        o --- .... o
                    \
                     \
                      o --- .... o
                      r          git2
    
    1. 解决冲突。这很容易。您只需要删除冲突指标。

    2. git checkout master

    3. git merge git2 这是一个快进。

    4. 现在看git log --oneline。您将看到所有6000次提交。

答案 4 :(得分:0)

如果您只想获取本地历史记录,请停止svn服务器;复制远程仓库;在你当地的盒子上启动它。然后,您可以使用本地svn服务器(或直接使用文件:protocol)来对其进行历史查询。您可以使用svnsync从那时开始更新本地副本,只需实时更改delta。

没有对svn repo的管理员访问权限 - 你可以使用svnsync导出repo的备份而不需要任何特殊的东西,它必须是一个拉式svnsync而不是push(从repo到backup) )。

Svnsync通过重播提交来工作,因此您只需将每个提交重放从repo重播到本地“备份”。这样做可能需要一段时间 - 您通常通过复制文件结构或转储来为原始仓库提供备份。