git - 在大型存储库中创建 git 分支非常慢

标签 git performance git-branch git-checkout

我有一个本地存储库,其中包含约 300.000 个文件和大约 40GB 的加密文件系统(我无法更改它...)。 我经常需要创建一个新的分支,并将工作目录的当前内容作为这个分支的内容。

所以这个“ checkout ”实际上并不是修改工作树中任何东西的 checkout ,而只是创建一个分支,切换到它,并保持工作目录不变。 而且与大文件无关:平均文件大小远小于 1mb (40gb/300000=130kb)

目前我这样做:

git checkout -q -b mynewbranch
git add -v -A
git commit -q -m "at mynewbranch"

原则上这是可行的,但创建分支的第一步需要一个多小时(!)。 (“添加”和“提交”需要几分钟,我可以接受。) “git checkout”似乎只是为了创建分支而重新读取整个工作目录。

理想情况下,我希望创建分支几乎不需要任何时间, 并且它的状态应该简单地基于以前存在的分支。 然后“添加”也不应该花费太多时间,因为可能会使用时间戳 并非所有文件内容都应与存储库进行比较, 仅应详细查看具有新时间戳的文件。

有人知道如何有效地完成这项工作吗?

编辑:git 2.17、ubuntu、基于 ext4 的 encfs、最新的硬件、12 个 cpu、主要是二进制文件(如 pdf、jpeg、mp4;没有深树;它们需要进行版本控制)。

主要问题是:是否可以避免只创建一个分支就查看所有文件的内容?

最佳答案

git 不是为大型存储库而设计的(尽管微软最近致力于扩展它以支持它们——参见上面问题的评论)。我建议您将存储库拆分为多个存储库,和/或使用 LFS。如果您使用 LFS,您可能希望使用 BFG Repo Cleaner 来有效地重新创建没有历史记录中所有大文件的存储库 - 除非存储库仅包含大文件。

LFS does support versioning :

Large file versioning

Version large files—even those as large as a couple GB in size—with Git.

关于git - 在大型存储库中创建 git 分支非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50425943/

相关文章:

git - 使用 gitlist 推送到私有(private) gitserver

node.js - 尽可能快地在 MongoDB 中加载一百万条记录

python - 如何减少二维连接域上的集成的集成时间

git - 为什么分支名称不能包含 'space' 字符?

git安装报错缺少安装候选项

python - git-德威奇 :how to merge or rebase?

git - 使用单个 git 存储库而不是子模块来管理不同的代码库

performance - Clojure 在集合更新或大量计算方面的性能

git - 如何确定master、origin、head

git - 更改远程 git 存储库