预测git push中将推送多少数据

时间:2010-11-14 21:40:44

标签: git bandwidth git-push

我偶尔使用昂贵的互联网连接,我想知道(至少大约)将git push中的数据推送到遥控器。

3 个答案:

答案 0 :(得分:28)

实际上,我认为我的评论足以将其作为答案发布!

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

捆绑文件基本上是包含标题信息的包(如果您愿意,请查看the source)。这意味着它是一个方便的瓷器命令,它将创建一个你关心的大小的文件。 (比尝试手动使用pack-objects容易得多。)使用以下内容:

git bundle create foo.bundle ^origin/master master

这将为你提供一个包含主要所需内容的包,假设遥控器有起源/主控 - 完全相同的东西应由git push origin master推送。如果你有额外的分支机构,你也可以推动它们;它只是采取rev-list args:

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

只需检查创建的捆绑包的大小;它应该几乎相当于你最终推动的东西。这意味着你最终必须创建包两次(一次使用捆绑包,一次使用推送),但除非这是一个非常大的推动,需要很长时间才能打包,这不应该是巨大的问题。

答案 1 :(得分:9)

你可以通过运行类似的Bash来找到Git将在创建要推送的包文件时在内部运行的内容:

$ 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将无法找到共同的祖先,并将发送整个存储库的内容。有关详细信息,请参阅this answer

答案 2 :(得分:2)

git diff HEAD origin/master --stat