导入标签时,GIT会再次下载完整的提​​交历史记录

时间:2018-11-15 08:08:27

标签: git git-svn

我们有一个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个小时。

是否可以避免所有这些?也许我使用的命令不正确?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您从SVN中获取多个分支/标记,则默认情况下,git svn会尝试将它们连接到最后一个共同祖先。寻找祖先可能会非常昂贵-有时git svn将重新读取存储库的完整历史记录。

另一方面,您的别名似乎只关心trunk,而忽略了任何标签和分支。在这种情况下,您有几种选择会产生不同的后果:

  1. 完全 一个分支设置您的git存储库。 不要使用选项-s--stdlayout。显然,您将只同步SVN存储库的特定部分。

  2. 使用选项--no-follow-parent(并查看Handling of SVN branches部分以获取更多说明)。在这种情况下,您可以跟踪多个分支/标签,但是新标签/分支的历史记录不会与其祖先关联。

  3. 在某些情况下,git svn尝试重新读取从r0到HEAD的历史记录。这样做是为了对每个块进行100个修订,这对于大型/旧存储库而言可能非常慢。在这种情况下,您可以尝试使用--log-window-size=3000的选项git svn fetch加快速度(请参见doc here)。