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

gak*_*gak 28 git bandwidth git-push

我偶尔会在一个昂贵的互联网连接上,我想知道(至少大约)将多少数据推送到遥控器git push.

Cas*_*bel 29

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

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

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

git bundle create foo.bundle ^origin/master master
Run Code Online (Sandbox Code Playgroud)

鉴于遥控器具有原点/主控功能,这将为您提供包含所需主要内容的捆绑包 - 完全相同的东西应该被推送git push origin master.如果你有额外的分支机构,你也可以推动它们; 它只是采取rev-list args:

git bundle create foo.bundle ^origin/master master ^origin/topic topic ...
Run Code Online (Sandbox Code Playgroud)

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


Bla*_*way 9

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

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

这应该输出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
Run Code Online (Sandbox Code Playgroud)

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