【问题标题】:Why is git svn show-ignore / show-externals so slow?为什么 git svn show-ignore / show-externals 这么慢?
【发布时间】:2012-05-21 14:40:09
【问题描述】:

我正在编写一个通用的 svn -> git 迁移脚本,它比标准的 git svn clone 允许更多,并且在我脚本的一个阶段我正在检查输出git svn show-externalsgit svn show-ignore 用于迁移存储库中的每个分支,并根据这些命令的输出采取各种步骤。

我现在的问题是,虽然我的脚本的其余部分执行得非常快,但这两个命令似乎占据了我大部分的运行时间。在某些情况下,git svn show-externals 的运行时间超过 10 分钟(在包含大约 5000 个文件的 repo 上)。当在具有 10 个或更多分支的这种大小的存储库上运行时,您可以想象这会大大增加。

为什么这个操作需要这么长时间才能执行?我可以做些什么来加快它的执行速度?

【问题讨论】:

    标签: git svn git-svn svn-externals svnignore


    【解决方案1】:

    “git svn show-ignore”对每个目录执行一个额外的 SVN 请求。

    出于迁移目的,您可能想看看SubGit 工具。它为每个修订版翻译 svn:ignore -> .gitignore(并且它还翻译 svn:eol-style、标签等)。唯一的限制:它需要本地访问 SVN 到存储库。因此它可以与svnrdump 工具结合使用。如果您在本地拥有 SVN 存储库,则只需一步即可完成迁移:

    $ subgit install path/to/svn/repo
    

    【讨论】:

    • "对每个目录执行额外的 SVN 请求。" - 真的每个目录??为什么不对整棵树执行一次递归 svn propget -R svn:ignore
    • 这可能很有用。我注意到它不支持将外部转换为子模块。对此有何建议?
    • Rup:看看 git-svn 脚本中的“cmd_show_ignore”函数。它调用“prop_walk”。然后看看“prop_walk”的定义。它调用 $self->ra->get_dir($path, $rev); -- 获取目录的属性和子项的方法。然后“prop_walk”为每个作为目录的孩子调用自己。非常奇怪但真实。
    • majajackson:不,SubGit 现在不将外部转换为子模块,但在 RFE 列表中有此功能。并非每个 svn:externals 都可以转换为 Git 子模块。首先,存储库 svn:externals 指向的应该有 Git 接口。第二个 svn:externals 不应该指向 HEAD 版本,而是指向某个版本。还有另一个工具试图处理 svn:externals --- SmartGit(它将它们转换为 .gitsvnextmodules 文件并显示带有此文件的任何 Git 存储库的子模块)。但它是纯 UI 解决方案,不能从脚本中调用。
    猜你喜欢
    • 2021-08-28
    • 2011-06-17
    • 2017-12-14
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多