git:为什么推送进度消息常常违反直觉,没有帮助?

git:为什么推送进度消息常常违反直觉,没有帮助?,git,Git,好吧,我承认我不是git专家,这个标题有点挑衅性。 我在cvs和subversion工作了多年,但我不想去那里——我完全了解git的巨大优势。 我只是想知道为什么它不能打印出更有用、更容易理解的日志消息。 或者,如果配置为这样做,它可能会这样做? 这里有个例子,我在一个大的克隆储存库的中间。 我只是添加了一个新文件并将其提交到本地存储库。 现在我做了一个远程推送,我个人会发现看到真正推送的是什么文件和/或更改,或者至少是文件的数量是有用的和令人放心的。 我能得到什么?这: $ git push

好吧,我承认我不是git专家,这个标题有点挑衅性。 我在cvs和subversion工作了多年,但我不想去那里——我完全了解git的巨大优势。 我只是想知道为什么它不能打印出更有用、更容易理解的日志消息。 或者,如果配置为这样做,它可能会这样做? 这里有个例子,我在一个大的克隆储存库的中间。 我只是添加了一个新文件并将其提交到本地存储库。 现在我做了一个远程推送,我个人会发现看到真正推送的是什么文件和/或更改,或者至少是文件的数量是有用的和令人放心的。 我能得到什么?这:

$ git push
Enumerating objects: 24, done.
Counting objects: 100% (24/24), done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (13/13), 2.37 KiB | 186.00 KiB/s, done.
Total 13 (delta 2), reused 0 (delta 0)
remote:
remote: Create pull request for develop:
remote:   https://stash.xyz.abc.com:8081/projects/MYPROJ/repos/myrepo-test/pull-requests?create&sourceBranch=refs/heads/develop
remote:
To ssh://stash.xyz.abc.com:7999/MYPROJ/myrepo-test.git
   0478a6e..ea06dc4  develop -> develop
诚然,我并不完全理解这一点,但在我看来,这更多的是关于git的内部工作,也许还有性能数据。除了拉的要求,这是明确的。是否有任何东西我可以解释为,实际上只推送了一个文件?好吧,也许我觉得自己很愚蠢,或者不够古怪,但作为一名开发人员,这是我最感兴趣的,我不得不说cvs和svn在这方面更清楚!
我意识到我可以事先做一次git diff,或者做一次试运行之类的事情,但是git在这种情况下只展示它执行的逻辑操作真的会有伤害吗?

git在这里告诉你一些事情。前四行,直到“写入对象”,都是旨在告诉您正在发生某些事情的进度消息。如果Git不打印这些消息,用户可能会想,是什么花了这么长时间

后面的一行告诉你推了多少东西。在本例中,推送了13个对象,其中两个是三角形的(也就是说,它们可以被压缩)

这些对象通常包括提交和树以及表示文件的blob。由于Git不会复制以前已看到其值的文件,但它会在每次提交时获取整个存储库的完整快照,因此通常说某些文件已更改并没有多大帮助。例如,如果您进行更改、推送、还原,然后推送还原,您将对文件进行逻辑更改,但Git不会第二次推送任何blob,因为远程端已经有了它们

当您为CVS或SVN执行签入时,您添加的是一个修订,因此说有多少文件被更改是合乎逻辑的,因为这是一个关于单个修订的语句。然而,在Git的情况下,您可能会推动很多很多的修订,其中大多数将包含许多相同的文件,因此谈论更改的文件数量是没有意义的。在这里回答这个问题也不是一个特别有效的问题,因为在许多情况下,您可以完全忽略计算这些信息


最后一行告诉您哪些分支正在从what更新到what。这是您可以提供给
git diff
git log
的信息,以查看更改的内容。当你做一个git pull时,git会做一个更改的摘要,但是通过push,你可以一次推多个分支,所以显示摘要从本质上讲是没有意义的。

大多数预先准备的东西只是为了让用户感觉良好(进步正在发生)。当您推送像这样非常小的东西时,它实际上没有任何帮助,但是对于大型推送或获取操作,如果Git不打印进度指示器,人们似乎会不耐烦

如果愿意,您可以使用
--no progress
-q
(安静)关闭进度指示器

让我们一行一行地看一下:

(这当然是你自己的命令)

正如你所猜测的,这显示了一些内在因素。Git统计了24个对象,其中一个对象是Git内部对象:提交对象、树对象(树对象包含文件名和其他类似信息)或blob对象(文件内容)。还有第四种对象,带注释的标记,但是由于您没有在这里推送任何标记,Git统计的24个对象将不包括任何这些

计数对象:100%(24/24),完成

这是相当多余的,但是在一个大的推送或获取中,它作为一个进度表来感觉事物在移动是很有用的

这说明Git认为并行使用四个CPU可以加快速度。您可能有4个CPU,或者2个CPU,每个CPU有2个线程

这是减少发送的网络数据量的一种方法。有些对象可以压缩,有些则不能:在您的例子中,24个对象中有7个似乎可以压缩。Git扫描了那7个

24减去9=13,因此在另一端已经存在9个对象,13个对象中的7个(大约一半)被认为是压缩对象

这意味着您的Git总共发送了13个对象,其中2个实际使用了压缩。如果另一端有一些可用于压缩的对象,则最后两个数字可能不是零,但在本例中不是零

这四行中没有一行来自Git。这四行都是由另一端的某个脚本生成的。Git只是简单地复制了它们。这就是
remote:
前缀的意思。这可能是最重要的事情要知道,从这个答案

这只是显示事情的进展,而且

。。。这是Git中最有用的一行:它告诉您您发送了提交,这些提交将通过以下方式列出:

git log 0478a6e..ea06dc4
您发送了commit
ea06dc4
,因为您在本地使用了名称
develope
,这是
develope->
部分,您的Git要求他们的Git设置他们的名称
develope
。他们接受了更新自己姓名的请求:这是
->develop
部分他们的名称
develop
用于表示提交
0478a6e
(t
Enumerating objects: 24, done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (13/13), 2.37 KiB | 186.00 KiB/s, done.
Total 13 (delta 2), reused 0 (delta 0)
remote:
remote: Create pull request for develop:
remote:   https://stash.xyz.abc.com:8081/projects/MYPROJ/repos/myrepo-test/pull-requests?create&sourceBranch=refs/heads/develop
remote:
To ssh://stash.xyz.abc.com:7999/MYPROJ/myrepo-test.git
   0478a6e..ea06dc4  develop -> develop
git log 0478a6e..ea06dc4
git ls-tree -r master
$ git push --dry-run ../git2/  make:master
To ../git2/
   274b9cc253..ecff013539  make -> master
$