预测在git push时会推送多少数据

39

我偶尔会使用一条昂贵的互联网连接,我想知道(至少大致)在 git push 中将有多少数据被推送到远程。


1
这似乎有些棘手... 推送已被压缩,因此要真正了解情况,您需要在创建包但在发送之前中断它。您可以尝试检查相应捆绑包的大小,但这意味着实际上要打包两次。 - Cascabel
2个回答

34

实际上,我认为我很满意我的评论,可以将它发布为答案!

当你 push 时,git 会创建一个包含所有必要对象的 pack 并上传到远程。这意味着我们正在寻找一种预测该 pack 大小的方法。由于 pack 被压缩了,这就使得基于 diffs 或对象大小做任何事情变得非常困难;实际上我们想要做的是只看一下那个 pack 的大小。如果你可以在构建完 pack 后中断 push,并根据 pack 大小决定是否继续,那将非常不错,但我认为这是不可能的。我的最佳猜测是尝试重新创建即将被推送的 pack 并进行检查。

bundle 文件基本上是一个包含头信息的 pack(如果您感兴趣,请查看源代码)。这意味着它是一个方便的 porcelain 命令,可创建您关注的文件大小。这比手动使用pack-objects要简单得多。像这样使用:

git bundle create foo.bundle ^origin/master master

这将给你一个捆绑包,其中包含了到达主分支所需的所有内容,前提是远程仓库有 origin/master - 这正是由 git push origin master 推送的完全相同的内容。如果你有其他需要推送的分支,也可以将它们拼接在一起,只需添加 rev-list 参数即可。

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

只需检查已创建的打包大小,它应该几乎相当于您最终要推送的内容。这意味着您最终需要创建两个打包(一个包括打包文件和另一个用于推送),但除非这是一个需要很长时间来打包的大型推送,否则这不应该是一个巨大的问题。


git不知道您的分支的远程跟踪分支已被删除时,捆绑文件大小和git push origin master大小之间存在一个奇怪的差异。推送将起作用,但似乎提交了该分支中每个提交的副本。要解决此情况,请通过git fetch -p使git知道已删除的远程分支,然后重复git push origin master - tanius

10

你可以通过运行与Git在创建推送的包文件时内部运行的类似Bash的代码片段来准确找出:

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

这应该输出Git发送的pack文件的字节计数。具体来说:

# 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将无法找到共同的祖先并发送整个存储库的内容。更多信息请见此答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接