我们有一个SVN信息库,其中包含近190k次提交。我在本地创建了一个GIT存储库,以使工作更舒适。
当我必须更新本地GIT存储库并提取对SVN存储库的新提交时,可以使用以下命令组合:
!git svn fetch && git svn rebase -l && git push . remotes/trunk:master && git push -f origin master
(在这里找到:https://lostechies.com/keithdahlby/2010/11/29/git-svn-aliases-git-up-and-git-dci/)
一切正常,除非有人在SVN信息库中创建了标签:在这种情况下git-svn将下载该标签的完整历史记录(从修订版1到最后一个),这意味着同步而不是获取几分钟,将需要10到15个小时。
是否可以避免所有这些?也许我使用的命令不正确?
谢谢!
答案 0 :(得分:0)
如果您从SVN中获取多个分支/标记,则默认情况下,git svn
会尝试将它们连接到最后一个共同祖先。寻找祖先可能会非常昂贵-有时git svn
将重新读取存储库的完整历史记录。
另一方面,您的别名似乎只关心trunk
,而忽略了任何标签和分支。在这种情况下,您有几种选择会产生不同的后果:
为完全 一个分支设置您的git存储库。 不不要使用选项-s
或--stdlayout
。显然,您将只同步SVN存储库的特定部分。
使用选项--no-follow-parent
(并查看Handling of SVN branches部分以获取更多说明)。在这种情况下,您可以跟踪多个分支/标签,但是新标签/分支的历史记录不会与其祖先关联。
在某些情况下,git svn
尝试重新读取从r0到HEAD的历史记录。这样做是为了对每个块进行100个修订,这对于大型/旧存储库而言可能非常慢。在这种情况下,您可以尝试使用--log-window-size=3000
的选项git svn fetch
加快速度(请参见doc here)。