2010-11-14 44 views
23

我偶尔在昂贵的互联网连接,我想知道(至少大约)多少数据将被推送到远程在git push预测多少数据将被推入一个git推

+1

这似乎很棘手......压缩是压缩的,所以要真正知道,在创建包之后但在它发送之前,您想要中断它。你可以尝试检查相应包的大小,虽然这意味着有效地打包两次。 – Cascabel 2010-11-15 05:00:50

回答

25

其实我觉得我喜欢我的评论足以发布它作为答案!

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

捆绑文件基本上是一个包含头文件信息的包(如果你愿意,可以看看the source)。这意味着这是一个方便的瓷器命令,将创建一个您关心的大小的文件。 (远远高于容易尝试手动使用pack-objects)。使用这样的事情:

git bundle create foo.bundle ^origin/master master 

这会给你含去掌握所需的一切一捆,鉴于遥控器具有产地/主 - 完全一样应该推动的东西git push origin master。如果你有更多的分支你会推动,你也可以加以解决;它只是采取rev-list参数:

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

只需检查创建的包的大小;它应该几乎等于你最终推动的东西。这确实意味着你最终必须两次创建包(一次使用捆绑包并且一次使用一次),但除非这是一个需要很长时间收拾的非常大的推动,否则它不应该是一个大问题。

2
git diff HEAD origin/master --stat 
+0

这不显示带宽,我得到:git push --dry-run -v 推送到[email protected]:项目 到[email protected]:项目 fbe6184..7b7a3bc master - > master – 2010-11-15 00:56:01

+0

@ Gerald,请尝试使用git diff命令。我上面发布的例子会告诉你哪些文件已经改变,每个文件中有多少行插入和删除。这些信息足够了吗? – 2010-11-15 01:05:03

+0

当涉及压缩和二进制差异时,这是一个相当粗略的估计。如果有很多修改也很乏味。 – 2010-11-15 01:51:40

9

您可以通过运行猛砸一下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