当我执行"git push"命令时,统计信息中的总数、增量等是什么意思?

80

这里有一个例子:

$ git push -u myserver master
Counting objects: 22, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 1.89 KiB | 0 bytes/s, done.
Total 14 (delta 10), reused 0 (delta 0)
To myserver.com:git/myrepo.git
   ed46414..0cae272  master -> master
Branch master set up to track remote branch master from myserver.

对我来说,这段话中唯一有意义的数字是“使用最多8个线程”的8,因为我的处理器是四核超线程的,因此我可以运行8个线程。

"22"代表什么?它为什么会显示22和14,还有那另外的8呢?既然进行了操作并花费了有限的时间,为什么会显示“0字节/秒”?“总数”、“增量”和“重用”是什么意思?

示例的详细信息:上面的示例是从Mac OS X终端中复制粘贴的。我手动执行了查找替换,以将“myrepo”和“myserver.com”替换进去,其他内容都是原样的。该存储库有910次提交,我在上次推送后进行了大约3次提交。这3个新提交影响了至少3个文件。该存储库包含一千多个文件。


这个答案可能会有所帮助:https://dev59.com/pW445IYBdhLWcg3w0NSu - brunocrt
2个回答

85

简短回答

这仅仅是执行 git count-objects -v 命令的输出结果,在推送时使用该命令(gcpullclone也会调用同样的命令)。更多信息请查看手册:git-count-objects(1)

$ git count-objects -v
...
size: 14 # The "Compressing objects: 100% (14/14)" part (the size in KiB)
in-pack: 22 # The "Counting objects: 22" part (the number of objects)
...

长篇回答

Counting objects: 22, done.

这是计算特定提交的22个内部对象。Git中几乎所有东西都是对象,基本上是在您的.git/objects文件夹下以它们各自的哈希保存的块。更多信息请参阅手册:9.2 Git Internals - Git Objects

Compressing objects: 100% (14/14), done.

这是git在发送之前对对象进行压缩。 14/14 表示压缩的进度(从14 KiB到压缩)。

Writing objects: 100% (14/14), 1.89 KiB | 0 bytes/s, done.

这是git发送(如果是远程)和写入对象。 1.89 KiB | 0 bytes/s 是以KiB为单位的进度和速度(完成时为0字节/秒)。

Total 14 (delta 10), reused 0 (delta 0)

这是git中packfile算法的输出(详见9.4 Git 内部原理 - Packfiles),相当晦涩难懂。它基本上将未使用的对象,通常是旧历史记录,打包在.git/objects/pack中。打包后,git会检查是否可以重用打包文件(因此 reused 0 部分)。delta 0 部分是从打包或重用中获得的KiB增益。


21

Git是一个内容可寻址的文件系统,即它将对象(文件、树、提交)存储在可通过哈希地址访问的文件中。

假设您对文件进行了很小的更改,git是否应该将完整文件作为不同的对象存储?实际上它会这样做。但是偶尔(在push,pull期间),git会将文件更改计算为增量并将其存储而不是完整文件。

这意味着,文件的最新版本被完整存储(因为它应该最容易获得),相同文件的旧版本只包含两者之间的差异等等。

这样,Git可以节省空间,同时仍然能够重构您提供的任何修订版的文件。

现在回到您的问题:

Counting objects: 22, done.:Git正在计算与您要推送的提交相关的对象。

Total 14 (delta 10):Git能够通过找到10个增量来减少对象数量。

reused 0 (delta 0):如果已经存在相同的增量,则Git可以重复使用增量对象。例如,如果可能在某个其他文件中引入类似的更改,则增量可能是相似且可重复使用的。在这里,没有东西可以重复使用。

Writing objects: 100% (14/14), 1.89 KiB | 0 bytes/s, done.:在此处,Git正在通过网络发送(或编写)对象,并且您可以看到它在执行操作时的进度和速度统计信息。

希望这有所帮助。


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