gpt4 book ai didi

Git 推送解析增量 "completed with local objects"

转载 作者:太空狗 更新时间:2023-10-29 13:00:59 25 4
gpt4 key购买 nike

虽然我已经使用 git 几年了,但我的本地 git 最近产生了一条新消息(我推测是由于存储库)。

当我对 GitHub 上的远程执行 git push 时,我得到以下输出(很自然,大部分):

Counting objects: 99, done
Delta compression using up to 4 threads.
Compressing objects: 100% (97/97), done.
Writing objects: 100% (99/99), 10.16 KiB | 0 bytes/s, done.
Total 99 (delta 66), reused 0 (delta 0)
remote: Resolving deltas: 100% (66/66), completed with 12 local objects

我感兴趣的特定部分是 completed with n local objects,最近才开始出现。因为,在大多数情况下,存储库正在以相当好的速度增长(在 LoC 和提交计数方面),我假设这条消息与此有关,但我不确定是否是这种情况。

我知道这不是错误(我的 git pushes 一直在正常工作),但我只是想知道这条消息的来源和含义,以及为什么该数量与正在计数/计算的实际对象数量相差很大。

最佳答案

Bryan Pendleton's comment里面有正确的答案:你的 git push 做了一个“瘦包”。通过智能协议(protocol)进行的所有提取和推送操作始终使用精简包,以最大限度地减少网络流量。

任何打包文件都使用delta compression .普通 Git 包文件仅对同一包中的其他对象进行增量压缩(这些其他对象也可能是增量压缩,但仅针对同一包中的更多对象)。 “精简包”是一种故意违反此规则的打包文件:它将对象与存储在别处的其他(松散或压缩)对象进行增量压缩。收到精简包后,Git 必须通过用丢失的对象“加肥”来“修复”精简包,或者干脆销毁它(将精简包分解成单独的、非增量压缩的对象)。

假设您的 Git 和其他一些 Git 正在协商发送 1 GB 的数据(在许多文件中——为简单起见,我们只说 1 个),但是两个 Git 发现你们都已经有 1 GB 的文件数据,并且数据可以表示为:“复制旧数据,从中间删除字母a,插入the”,或者类似的东西同样简短。无论哪个 Git 正在发送,都会生成一个增量压缩对象,表示“从具有哈希 h 的对象开始,在偏移量 x 处删除 1 个字节,添加 3 个字节 the 在偏移 x”。这个增量压缩对象需要大量的 CPU 时间——甚至可能是一整秒——来计算,但只有几十个字节的空间。生成的打包文件很小,在几微秒内通过网络。接收 Git 通过添加丢失的 1GB 对象将其加肥,传输完成。

在这种特殊情况下,completed with 12 local objects 意味着精简包依赖于您的 Git 告诉他们的 Git 您已经拥有的 12 个对象。由于 Git 的 DAG,您的 Git 可以通过仅发送 一个 哈希 ID 来告诉他们的 Git 您拥有这些对象:如果您有提交 C,则您拥有每棵树和提交 C 的 blob,并且——只要你没有一个“浅”存储库——你有每个祖先来提交 C,以及与这些祖先提交相关的每一棵树和 Blob 。

因此,这种压缩是图论的直接结果。这也是为什么,即使对于非常大的项目,初始克隆可能很慢,但大多数 git fetch 更新往往相当快。此规则的主要异常(exception)是当您提供的 Git 数据对象与以前的数据对象相比不能很好地进行增量压缩时。这包括已经压缩的二进制文件,例如 JPG 图像或压缩的 tarball。 (具有讽刺意味的是,压缩的 tarball 至少在理论上可以压缩得更好,尽管在我过去测试的一些情况下,Git 修改后的 xdelta 对它们的处理效果不是很好。)

关于Git 推送解析增量 "completed with local objects",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39006387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com