为什么文件夹重命名,git 推送到新的远程分支很慢

Why is folder rename, git push to new remote branch slow

我只是

我明白了

Writing objects:  26% (3337/12428), 270.49 MiB | 779.00 KiB/s 

这需要很长时间。

出于兴趣,为什么要写这些对象?我原以为 git 只会向上游发送 "rename" 命令。

它根本不应该(慢),至少不会,除非你用浅存储库做一些棘手的事情,或者使用愚蠢的协议。但是,上游没有发送 "rename" 操作。

在内部,Git 将所有内容存储为四种 Git 对象类型之一:提交、树、blob(文件)和(带注释的)标签。

提交对象通常很小。这是一个真实的实际提交对象的示例,来自 Git 本身的源代码:

$ git cat-file -p HEAD | sed 's/@/ /'
tree 6fe777d97b5a6fb3176d47c5ccda454deb69a8f6
parent cc00d9cfffbbeb34ee23731668656b2ebc165c85
author Junio C Hamano <gitster pobox.com> 1461960207 -0700
committer Junio C Hamano <gitster pobox.com> 1461964869 -0700

Eighth batch for 2.9

Signed-off-by: Junio C Hamano <gitster pobox.com>

重命名目录或文件时,最终得到的是一个新的 "tree" 对象。这是同一提交的一些顶级树:

$ git cat-file -p 'HEAD^{tree}'
100644 blob 5e98806c6cc246acef5f539ae191710a0c06ad3f    .gitattributes
100644 blob 05cb58a3d4ef47295fa8ef02add44a0f0dd90d1f    .gitignore
100644 blob e5b4126bec557db55924b7b60ed70349626ea2c4    .mailmap
100644 blob 78e433ba718df00d112a5f57d523afb8db189c79    .travis.yml
100644 blob 536e55524db72bd2acf175208aef4f3dfc148d42    COPYING
040000 tree 1771d89504a0003add17bffd2170f39490bad1ff    Documentation

如果我要重命名 COPYINGDocumentation,我会得到一个新的树对象(具有不同的 ID),但 .gitattributes、[=15 的现有 blob 对象=],等等都不会改变。 Documentation/ 中的子树和 blob 也是如此。根据您重命名的特定目录,可以预期 Git 需要一个或多个新的 "tree" 对象来与您的(一个)新的 "commit" 对象一起使用。 None 这些对象应该非常大。

后续 git push,通过任何合理的智能协议,应该:

  • 发现它只需要发送一个新的提交对象和许多树对象
  • 将这些对象压缩到您的 Git 知道(由于共享哈希值)存在于远程 Git 上的对象(在 "writing objects" 之前有一个交换阶段,其中它们的 Git 告诉你他们有什么)
  • 写一个 "thin pack" 只发送两个或五个或许多对象,这应该需要几千字节和几毫秒

然后完成传输阶段。 (然后远程必须 "fix" 精简包,这可能需要一些时间,并验证是否允许推送,如果允许,则在发送确认或失败响应之前更新远程存储库。)