代码之家  ›  专栏  ›  技术社区  ›  gak

预测一次git推送将推送多少数据

  •  27
  • gak  · 技术社区  · 14 年前

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

    3 回复  |  直到 14 年前
        1
  •  30
  •   Cascabel    14 年前

    事实上,我想我很喜欢我的评论,把它作为一个答案贴出来!

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

    包文件基本上是一个包含头信息的包(请看 the source 如果你愿意的话)。这意味着它是一个方便的瓷器命令,可以创建一个您所关心的大小的文件。(比尝试使用 pack-objects 手动。)使用如下方法:

    git bundle create foo.bundle ^origin/master master
    

    这将为您提供一个包,其中包含到master所需的所有内容,前提是远程服务器具有origin/master,这与应该由 git push origin master . 如果你有额外的分支,你将推动,你也可以钉他们;这只是采取rev list args:

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

    只需检查创建的包的大小;它应该几乎相当于您最终要推的包的大小。这确实意味着你将不得不两次创建包(一次使用包,一次使用推),但是除非这是一个真正的大推,需要很长时间来打包,否则这应该不是一个大问题。

        2
  •  9
  •   Community CDub    8 年前

    您可以通过运行与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将无法找到共同的祖先,并将发送整个存储库的内容。见 this answer 更多信息。