(抱歉,如果之前已经回答过这个问题 - 我找不到这个具体问题,其他人都因为不相关的原因而遇到了这个问题。请随意指出我错过的那个问题。)
由于提交了大量大文件,我正在使用一个非常大的存储库。我最近浅克隆了它(深度=1),然后在 master 上进行了很大的更改。然后我分支,做了一个小的提交,然后推送到那个新分支。尽管它只是在远程(Bitbucket)已经知道的提交之上添加了一个小提交(15 kb,一个受影响的文件),但将其推送起来需要很长时间。我看到的消息如下所示:
silasbarta$ git push origin HEAD
Counting objects: 21034, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (11817/11817), done.
Writing objects: 4% (967/21034), 406.50 MiB | 1.36 MiB/s
运行git gc
并没有改变这一点。
为什么它需要处理所有这些对象?它应该只需要知道我的提交差异和对先前提交哈希的引用,该哈希已经在源上,对吗?
最佳答案
在某些情况下,使用浅克隆时,发送的 Git 不会意识到接收的 Git 已经拥有大部分文件。这是因为一个 Git 理解另一个 Git 拥有的内容的方式是通过哈希 ID。浅克隆与哈希 ID 混淆:提交 a123456
表示它以 b789abc
作为父级,然后有一个特殊记录表示 ...但我们不这样做有b789abc
。然后,Git 会假装 a123456
根本不是 a123456
。
有些情况可以得到更好的处理,但事实并非如此。使用稍微更深的克隆(--深度 2
)可能可以避免这种情况,但这里并不能真正保证。 Git 的代码在确定可以省略的内容方面存在一些缺陷,以便使通常的情况更快。
关于尽管提交量很小,但 git Push 在大型代码库上却花费了很长时间——为什么,这可以修复吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63122432/