【问题标题】:creating git branch is extremely slow in large repository在大型存储库中创建 git 分支非常慢
【发布时间】:2018-10-29 18:11:57
【问题描述】:

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

所以这个“签出”实际上并不是修改工作树中任何内容的签出,而只是创建一个分支,切换到它,并保持工作目录不变。 它与大文件无关:平均文件大小远小于 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、encfs over ext4、最近的硬件、12 个 cpu、主要是二进制文件(如 pdf、jpeg、mp4;没有深度树;它们需要版本化)。

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

【问题讨论】:

  • 什么操作系统,你使用什么文件系统?您的存储驱动器硬件特性是什么?文件的特点是什么?是源代码(如深树中的小文本文件)还是其他?除了 git 之外,您还有其他在后台运行的软件可以处理这些文件吗?
  • 如果您使用的是 Windows,Microsoft 发布的许多内容(使用 500GB 的 windows 工作目录)可以帮助您。这包括确保您使用的是最新的 git 版本。 blogs.msdn.microsoft.com/devops/2018/01/11/…
  • 如果您在 repo 中有许多二进制文件,则转换为 LFS 也可能会提高性能。
  • 根据您的更新,启用 Git-LFS 应该会有很大帮助。您可能已经注意到,Git 并不适合处理大型二进制文件。

标签: git performance git-branch git-checkout


【解决方案1】:

git 不适合与大型存储库一起使用(尽管 Microsoft 最近致力于扩展它以支持它们 - 请参阅对上述问题的评论)。我建议您将存储库拆分为多个存储库,和/或使用 LFS。如果您使用 LFS,您可能希望使用 BFG Repo Cleaner 来有效地重新创建存储库,而不需要历史记录中的所有大文件 - 除非存储库仅包含大文件。

LFSdoes support versioning:

大文件版本控制

版本大文件——即使是像 几 GB 大小——使用 Git。

【讨论】:

  • 分手很可能没有任何帮助。它仍然会重新读取所有文件,只是分布在多个存储库中。 100x 1 分钟仍然是 1.5 小时。我的观点是,仅仅为了复制一个分支而读取所有文件内容是完全没用的;挑战在于,哪些 git 命令或设置使 git 不会做这种耗时的废话。
猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多