我尝试在 Ubuntu 服务器 18.04 上安装 Jenkins,它将使用子模块的完整构建时间从 4.5 分钟缩短到 20 秒左右。
在邮件列表中确实报告了 Windows 上超过 2.20 的任何 Git的性能回归。
同样在git-for-windows/git
问题 2199中。
使用 Git 2.29(2020 年第四季度),围绕子模块处理的优化将使 Windows 上的速度更快。
请参阅Orgad Shaneh ( ) 的提交 7ea0c2f(2020 年 9 月 4 日)。(由Junio C Hamano 合并 -- --在提交 bcb68bf中,2020 年 9 月 22 日)orgads
gitster
fetch
:不要在未更改的 refs 中查找子模块更改
签字人:Orgad Shaneh
当使用子模块递归获取时,对于超级项目中的每个 ref,我们调用check_for_new_submodule_commits()
which 收集所有必须检查子模块更改的对象calculate_changed_submodule_paths()
。
在第一次调用时,它还会收集所有现有的 refs 以将它们从扫描中排除。
calculate_changed_submodule_paths()
创建一个包含所有收集到的新对象的参数数组,然后是 --not 和所有旧对象。这argv
被传递给setup_revisions,
which 解析每个参数,将其转换回 oid 并解析对象。
解析本身也做了多余的工作,因为它被视为用户输入,而实际上它是一个完整的 oid。因此它不必要地尝试将其查找为 ref (检查它是否有^
等~
),检查它是否是文件名等。
对于具有许多 ref 的存储库,所有这些都是昂贵的。但是如果超项目中的 fetch 没有更新 ref(即子模块中需要存在的对象没有改变),则不需要将其包含在列表中。
在提交 be76c212之前(“ fetch
:确保获取子模块对象”,2018-12-06,Git v2.21.0-rc0 --批次 #4中列出的合并),仅检测到已更改的 refs 的子模块引用更改,但未检测到新的参考文献。该提交也涵盖了这种情况,但它所做的只是包含每个 ref。
此更改应将扫描的 refs 数量减少大约一半(除了 no-op fetch 的情况,它不会扫描任何 refs),因为所有现有 refs 仍将列在--not
.