【问题标题】:When importing tag, GIT downloads again full commit history导入标签时,GIT 再次下载完整的提​​交历史
【发布时间】:2018-11-15 08:08:26
【问题描述】:

我们有一个包含近 190k 提交的 SVN 存储库。为了更舒适地工作,我在本地创建了一个 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 小时。

这一切都可以避免吗?也许我使用的命令不正确?

谢谢!

【问题讨论】:

  • git 和 subversion 标签有很大不同。据我所知 - 你无法避免这一点。

标签: git git-svn


【解决方案1】:

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

另一方面,您的别名似乎只关心 trunk 忽略任何标签和分支。鉴于这种情况,您有多种选择,但后果各不相同:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2015-07-03
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多