我有一个包含大约2.5GB文件的庞大svn存储库。它有许多分支和标签。它有72000个修订版。我想制作一个本地git克隆 通过常规git克隆执行此操作大约需要24天。
这会起作用吗?
我将使用多台机器并行地克隆部分存储库。第一台机器将克隆1到12000的修订版,下一台将从12000到24000克隆,依此类推......
然后我必须将所有这些本地gits合并为一个。
我该怎么做?还有其他办法吗?
编辑:我的主要要求是能够在本地查询更改历史记录。所以,我希望有一份完整历史的本地副本。事实上,这是我想转向git的主要原因。 另外,我没有管理员访问svn repo
答案 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。
首先将git2作为遥控器添加到git1
git remote add git2 <path to git2>
结帐git2作为跟踪的本地分支。
git checkout -b git2 remotes/git2/master
现在你有两个独立的分支。
... 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
解决冲突。这很容易。您只需要删除冲突指标。
git checkout master
git merge git2
这是一个快进。
现在看git log --oneline。您将看到所有6000次提交。
答案 4 :(得分:0)
如果您只想获取本地历史记录,请停止svn服务器;复制远程仓库;在你当地的盒子上启动它。然后,您可以使用本地svn服务器(或直接使用文件:protocol)来对其进行历史查询。您可以使用svnsync从那时开始更新本地副本,只需实时更改delta。
没有对svn repo的管理员访问权限 - 你可以使用svnsync导出repo的备份而不需要任何特殊的东西,它必须是一个拉式svnsync而不是push(从repo到backup) )。
Svnsync通过重播提交来工作,因此您只需将每个提交重放从repo重播到本地“备份”。这样做可能需要一段时间 - 您通常通过复制文件结构或转储来为原始仓库提供备份。