如何确定git pull将下载多少数据?

时间:2018-06-03 17:06:12

标签: git github

假设我通过热点使用手机的昂贵数据计划,而且我是按MB支付。

如果我发出git pull,有没有办法检查git需要下载多少数据? (显然没有下载)

1 个答案:

答案 0 :(得分:2)

简短的回答是" no"。答案很长,可能是#34;但是你需要某种辅助系统。

请注意,git pull只是git fetch,后面是第二个Git命令。第二个命令在本地运行并且不会导致数据传输 - 所有传输都在git fetch期间发生。所以问题是:git fetch会传输多少数据?答案取决于Git存储库中的内容,Git存储库中的内容,Git要求的内容以及压缩的好坏。

提取可以使用a dumb protocol or a smart protocol。主要区别在于,使用哑协议,您通常无法从已下载的内容中获得任何好处:例如,如果其他Git包含巨型包文件中的所有内容,则必须重新下载整个巨型包文件。对于您的用例,这通常会非常糟糕。幸运的是,几乎每个人都使用智能协议。

我上面链接的Pro Git书籍页面给出了智能协议的概述,但没有详细说明(出于好的理由 - 我也省略了许多血腥细节)。然而,简短的版本是你的Git和他们的Git会谈论提交哈希,但不会深入了解树和blob哈希:你的Git会告诉他们你的Git想要哪些哈希以及你的Git有哪些哈希。告诉他们的Git,你的Git 已经提交了哈希ID X,告诉他们的Git,你的Git不仅拥有X本身,还拥有它的所有祖先。 1 他们的Git可以推断您需要提交X的后代,但不是X或其任何祖先。

由此,他们的Git可以推断出你不仅提交了X及其祖先,还提出了X及其祖先中出现的任何树和blob。 (请参阅--objects-edge的{​​{1}}参数。)这允许他们的Git构建一个瘦包,不仅可以针对包中的其他对象对每个对象进行增量压缩,而且还可以提交X及其祖先所隐含的任何对象。

忽略智能协议通信传输的所有数据,然后,您收到的大部分数据都将成为最终的瘦身包。但找到瘦包大小的唯一方法是让其他Git 构建瘦包。

很容易想象你可以插入到这个过程的第三方垫片软件:你会运行git rev-list,指示你的Git联系你的第三方软件,你在中间机器上运行,位于您按字节付款的某个地方。这个第三方软件将在两个Gits之间传递有/想要的对话,以便他们的Git构建一个瘦包。然而,然而,您的第三方垫片不会向您发送薄包,而是保留中间机器上的薄包。然后,通过某个侧面通道,您可以让中间机器报告您的尺寸。您决定是否接受转移薄包的费用;这决定了fetch是否成功完成,或者是否因为远程(真的是你的垫片软件)意外关闭连接而失败。

1 这会忽略存储库,这会使一切变得复杂。