尽管提交量很小,但 git Push 在大型代码库上却花费了很长时间——为什么,这可以修复吗?

标签 git bitbucket large-files git-push git-clone

(抱歉,如果之前已经回答过这个问题 - 我找不到这个具体问题,其他人都因为不相关的原因而遇到了这个问题。请随意指出我错过的那个问题。)

由于提交了大量大文件,我正在使用一个非常大的存储库。我最近浅克隆了它(深度=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/

相关文章:

git - 如何 - 将 git 移动到另一台计算机

git - git 子模块的权威配置路径是什么

android - 切换到特定版本的 Android 源代码

repository - Stash 和 Bitbucket 是什么关系?

Git、Bitbucket、Eclipse 和一个新项目

docker - Docker Hub-链接到Bitbucket的自动构建

git - Bitbucket 的访问 key 不起作用

scala - 在连续 block 中读取非常大的文件 (~ 1 TB)

grep - 计算非常大文件中的单词出现次数(运行时内存耗尽) grep -o foo | wc -l

python - 优化Python中大文件中的重复项删除