git - 当 git repos 变大时,哪些操作会变慢,为什么?
问题描述
这个问题是在 SO 和其他地方以各种形式提出的,但我找不到让我满意的答案,因为没有人列出有问题/无问题的操作/命令,也没有人通过解释速度命中的技术原因.
例如:
所以,我不得不再次问:
- 在基本的 git 操作(提交、推送、拉取、添加、获取、分支、合并、签出)中,当 repos 变大时,哪些操作会变慢(注意:repos,不是这个问题的文件)
和,
- 为什么每个操作都取决于回购大小(或不取决于)?
我现在不在乎如何解决这个问题。我只关心哪些动作的性能受到影响,以及根据当前 git 架构的推理。
编辑澄清:
很明显,git clone
例如,repo 的大小将是 o(n)。
但是,我不清楚这git pull
是否相同,因为理论上可以只看差异。
Git 在幕后做了一些不平凡的事情,我不确定何时何地。
编辑2:
我找到了这篇文章,说明
如果您的存储库中有较大的、不可比较的文件(例如二进制文件),则每次提交对文件的更改时,您都将在存储库中保留该文件的完整副本。如果您的存储库中存在这些文件的多个版本,它们将大大增加签出、分支、 获取和克隆代码的时间。
我不明白为什么分支应该花费超过 O(1) 的时间,而且我也不确定列表是否已满。(例如,拉动呢?)
解决方案
但是,我不清楚这
git pull
是否相同,因为理论上可以只看差异。
从 Git 2.23(2019 年第三季度)开始,它不是O(N)
,而是O(n log(N))
:请参阅“ Git 获取一个具有正常名称的分支,一次获取大写字母”。
主要问题是日志图遍历,检查我们有什么和没有什么(或计算强制更新状态)。
这就是为什么对于大型存储库,最近的 Git 版本引入了:
它们将显着增加结帐、分支、获取和克隆的时间
那不会是因为没有操作O(1)
。
它与执行这些操作时要传输/复制的大量二进制文件的大小有关。
创建一个新分支仍然非常快,但是当您必须更新这些二进制文件时切换到它可能会很慢,仅从 i/o 角度来看(复制/更新/删除大文件)。
推荐阅读
- r - 基于逗号聚合列
- javascript - 为断言设置自定义错误消息 (Node.js)
- jquery - 基于windowSize的Linkify(纯url链接)
- php - 将 laravel 项目上传到服务器子文件夹
- python - Enctype=Multipart/Form-Data & 无法访问请求之外的配置
- mysql - #1314 - 存储过程中不允许 LOCK
- python-3.x - 无法在 jupyter notebook 中绘制直方图
- windows - 显示文件权限的API
- php - 从 php 中的多维数组中获取值?
- laravel - Laravel 请求对象主机设置为 ELB 主机名而不是当前主机名