我偶尔使用昂贵的互联网连接,我想知道(至少大约)将git push
中的数据推送到遥控器。
答案 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