【问题标题】:WHAT operations become slow when git repos become large, and WHY?当 git repos 变大时,哪些操作会变慢,为什么?
【发布时间】:2019-11-29 18:22:25
【问题描述】:

在 SO 和其他地方以各种形式提出了这个问题,但我找不到让我满意的答案,因为没有人列出有问题/无问题的操作/命令,也没有人给出技术原因的完整解释速度命中。

例如:

所以,我不得不再问一遍:

  1. 在基本 git 操作(提交、推送、拉取、添加、获取、分支、合并、签出)中,当存储库变大时,哪些操作会变慢(注意:此问题的存储库,而不是文件)

还有,

  1. 为什么每个操作都取决于(或不)repo 大小?

我现在不关心如何解决这个问题。 我只关心哪些动作的性能受到影响,以及根据当前 git 架构的推理。


编辑澄清:

很明显,例如git clone,将是 o(n) 的 repo 大小。

但我不清楚git pull 是否相同,因为理论上可以只查看差异。

Git 在幕后做了一些不平凡的事情,我不确定何时何地。


编辑2:

我找到this的文章,说明

如果您的存储库中有大型、不可比较的文件(例如二进制文件),您可以 每次提交时都会在您的仓库中保留该文件的完整副本 对文件的更改。如果这些文件的多个版本存在于您的 repo,他们将大大增加结帐、分支的时间, 获取并克隆您的代码。

我不明白为什么分支应该花费超过 O(1) 的时间,而且我也不确定列表是否已满。 (例如,拉动呢?)

【问题讨论】:

  • 就像获取数据点的轶事证据一样:我每天都在一个拥有 87000 个文件且大小为 8 GB 的大型 monorepo 中工作。我使用的是高端笔记本电脑,没有一个 git 命令看起来很慢或有明显的延迟。让我重复一遍:我记不起它们(当然,git clone 除外,但这是给定的)。当通过 2500 英里外的 VPN 服务器远程工作时,即使 git pull 在 40 Mbps 的网络连接上也相当快(需要大约 20 秒来提取 20,000 个文件)。话虽如此,但要注意确保我们不会提交大型二进制文件。

标签: git


【解决方案1】:

但我不清楚git pull 是否相同,因为理论上可以只查看差异。

从 Git 2.23(2019 年第三季度)开始,它不再是 O(N),而是 O(n log(N)):参见“Git fetch a branch once with a normal name, and once with capital letter”。

主要问题是日志图遍历,检查我们有什么和没有什么(或computing forced update status)。
这就是为什么对于大型存储库,最近的 Git 版本引入了:

它们将大大增加结帐、分支、获取和克隆的时间

这不会是因为操作不是O(1)
这与执行这些操作时要传输/复制的大量二进制文件的大小有关。
创建新分支仍然非常快,但是当您必须更新那些二进制文件时切换到它可能会很慢,仅从 i/o 角度来看(复制/更新/删除大文件)。

【讨论】:

    【解决方案2】:

    我看到您提出了两个主要问题供讨论。首先,您要问随着 repos 变大,哪些 Git 操作会变慢。答案是,随着 repo 变大,大多数 Git 操作会变慢。但是让 Git 看起来明显变慢的操作是那些涉及与远程存储库交互的操作。您应该很直观地知道,如果 repo 膨胀,那么克隆、拉取和推送等操作会花费更长的时间。

    您提到的另一个问题是是否应该首先提交大型二进制文件。当您进行提交时,提交中每个文件的副本都会被压缩并添加到树中。二进制文件往往不能很好地压缩。因此,随着时间的推移,添加大型二进制文件可能会导致您的存储库膨胀。事实上,许多团队会配置他们的远程(例如 GitHub)来阻止任何此类包含大型二进制文件的提交。

    【讨论】:

    • 感谢您的回答。请参阅我的澄清编辑。另外,请注意,我更关心整个 repo,而不是大型二进制文件。例如,为什么 git pull 会采用 o(repo_size) 而不是 o(diff_size)?
    猜你喜欢
    • 2013-07-06
    • 2011-05-19
    • 2019-03-29
    • 2012-01-07
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多