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

时间:2016-05-30 20:30:37

标签: git rename git-push

我只是

  • 创建了一个新分支
  • 通过重命名顶级文件夹
  • 重命名了我的存储库中的几乎所有文件
  • 将分支推送为上游的新分支

我得到了

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

需要很长时间。

出于兴趣,为什么需要写这些对象?我曾期望git只是向上游发送一个“重命名”命令。

1 个答案:

答案 0 :(得分:3)

它根本不应该(慢),至少不会,除非你使用浅存储库或使用哑协议进行棘手的操作。但是,没有"重命名"上游的行动。

在内部,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>

重命名目录或文件时,最终得到的是一个新的&#34;树&#34;宾语。这是同一次提交的顶级树的一点:

$ 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.gitignore的现有blob对象等等都会保持不变。对于Documentation/内的子树和blob也是如此。根据您重命名的特定目录,可以预期Git需要一个或多个新的&#34;树&#34;与你的(一个)新的&#34;提交&#34;宾语。这些对象都不应该非常大。

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

  • 发现它只需要发送一个新的提交对象和多个树对象
  • 将这些对象压缩到你的Git知道的对象(因为共享哈希值)存在于远程Git上(在&#34之前;写入对象&#34;那里是交换阶段,他们的Git告诉你他们是什么有)
  • 写一个&#34;瘦身包&#34;只发送两个或五个或多个对象,这应该需要几千字节和毫秒

然后完成传输阶段。 (然后远程必须&#34;修复&#34;瘦包,这可能需要一些时间,并且在发送确认或失败响应之前验证是否允许推送 - 如果允许 - 更新远程存储库。)< / p>