在大型存储库中创建git branch非常慢

时间:2018-05-19 13:44:30

标签: git performance git-branch git-checkout

我有一个本地存储库,在加密文件系统上有大约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,encs over ext4,最近的硬件,12个cpu,主要是二进制文件(如pdf,jpeg,mp4;没有深层树;它们需要进行版本控制)。

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

1 个答案:

答案 0 :(得分:1)

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

LFS does support versioning

  

大文件版本控制

     

版本大文件 - 甚至是那些大文件   结合GB的大小 - 用Git。