34

我偶尔会使用昂贵的 Internet 连接,我想知道(至少大概)有多少数据会以git push.

4

2 回答 2

31

实际上,我认为我很喜欢我的评论,可以将其发布为答案!

当你推送时,git 会创建一个包含所有必要对象的包并将其上传到远程。这意味着我们正在寻找一种预测包装大小的方法。由于包是压缩的,因此很难根据差异或对象大小做任何事情;我们真正想做的就是看看那个包有多大。如果您可以在构建包之后中断推送,并根据包大小决定继续推进,那就太好了,但我认为这是不可能的。我最好的猜测是尝试重新创建将被推送的包并检查它。

捆绑文件基本上是一个带有标头信息的包(如果您愿意,请查看源代码)。这意味着它是一个方便的瓷器命令,可以创建一个您关心的大小的文件。(比尝试手动使用pack-objects容易得多。)使用这样的东西:

git bundle create foo.bundle ^origin/master master

这将为您提供一个包含获取 master 所需的所有内容的包,因为遥控器具有 origin/master - 与应该推送的完全相同的东西git push origin master。如果您有其他要推动的分支,您也可以添加它们;它只是采用 rev-list 参数:

git bundle create foo.bundle ^origin/master master ^origin/topic topic ...

只需检查创建的捆绑包的大小;它应该几乎等同于你最终会推动的东西。这确实意味着您最终将不得不创建包两次(一次使用捆绑包,一次使用推送),但除非这是一个非常大的推送,需要很长时间才能打包,否则这不应该是大问题。

于 2010-11-15T05:18:20.390 回答
10

您可以通过运行与 Git 在创建要推送的包文件时将在内部运行的内容类似的 Bash 来准确地找到答案:

$ echo $(git merge-base HEAD origin/master)..HEAD | git pack-objects --revs --thin --stdout -q | wc -c

这应该输出 Git 将发送的包文件的字节数。分解:

# Find the common ancestor of HEAD and origin/master, and output a
# revision range (<a>..<b>) string to git pack-objects.
echo $(git merge-base HEAD origin/master)..HEAD

# Generate the pack file containing the revision range specified above, writing
# it to stdout.
git pack-objects --revs --thin --stdout -q

# Print the byte count of the file contents passed via stdin.
wc -c

git fetch这是在你推动之前做一个正确的条件; 如果不这样做,Git 将无法找到共同祖先,并将发送整个存储库的内容。有关更多信息,请参阅此答案

于 2010-11-15T06:21:11.430 回答