跟踪大型二进制文件时,git非常慢

Nic*_*ilt 81 git

我的项目已有六个月了,git非常慢.我们跟踪大约30个大小为5 MB到50 MB的文件.这些是二进制文件,我们将它们保存在git中.我相信那些文件让git变慢了.

有没有办法从存储库中杀死所有大小> 5MB的文件.我知道我会失去所有这些文件,这对我来说没问题.

理想情况下,我想要一个列出所有大文件(> 5MB)的命令.我可以看到列表,然后我说好了继续删除这些文件并使git更快.

我应该提一下,git不仅在我的机器上很慢,而且在暂存环境中部署应用程序现在需要大约3个小时.

因此,修复应该会影响服务器,而不仅仅是存储库的用户.

kub*_*ubi 124

你有垃圾收集吗?

git gc
Run Code Online (Sandbox Code Playgroud)

即使对于小型回购,这也会使速度产生显着差异.

  • 当杂乱得太多时,这会自动完成.我怀疑这对OP有帮助. (8认同)
  • 找到了.自动`gc`运行之前的松散对象的默认数量是6700,这解释了为什么我从未见过它运行. (4认同)
  • 这值得手动完成.我在1.8.4.3. (2认同)

And*_*ack 77

说明

Git非常擅长于小型文本文件的大量历史记录,因为它可以有效地存储它们及其更改.同时,git在二进制文件上非常糟糕,并且天真地存储文件的单独副本(默认情况下,至少).正如您所观察到的那样,存储库变得巨大,然后变得缓慢.

这是DVCS中的一个常见问题,每次克隆时都会下载每个文件的每个版本("整个存储库"),从而加剧了这一问题.在这些家伙正在开发一个插件来处理这些大文件更喜欢颠覆,只下载点播历史版本.

此命令将列出当前目录中大小> = 5MB的所有文件.

find . -size +5000000c 2>/dev/null -exec ls -l {} \;
Run Code Online (Sandbox Code Playgroud)

如果要从存储库的整个历史记录中删除文件,可以使用此构思git filter-branch来遍历历史记录并删除所有大型文件的痕迹.执行此操作后,存储库的所有新克隆都将更加精简.如果要在不进行克隆的情况下精简存储库,可以在手册页上找到方向(请参阅"缩小存储库的核对表").

git filter-branch --index-filter \
    'find . -size +5000000c 2>/dev/null -exec git rm --cached --ignore-unmatch {} \;'
Run Code Online (Sandbox Code Playgroud)

一句警告:这将使您的存储库与其他克隆不兼容,因为树和索引已签入不同的文件; 你将无法再推或拉他们了.

  • 注意:这是find的Unix/Linux版本,而不是Windows find.exe. (4认同)
  • 我认为您对git“默认情况下会存储单独的副本”的评论是对的。根据您默认链接到(http://thread.gmane.org/gmane.comp.version-control.git/146957/focus=147598)的电子邮件链,git _tries_来比较二进制文件-就是这样引起问题;不是存储。 (2认同)

小智 17

这是一个审查修订,旨在减少负面和煽动性:

当涉及不是逐行文本文件的文件时,Git有一个众所周知的弱点.目前还没有解决方案,核心git团队也没有宣布解决这个问题的计划.如果您的项目很小,比如100 MB左右,有一些解决方法.存在git项目的分支来解决这个可伸缩性问题,但是这些分支目前还不成熟.其他一些版本控制系统没有这个特定的问题.在决定是否选择git作为修订控制系统时,您应该将此问题视为众多因素中的一个.

  • "Git有一个众所周知的弱点......" - 引用需要 (8认同)
  • 我知道.谁的实际常识需要报价.只是不要使用git二进制.使用perforce或专业资产管理. (6认同)
  • 好吧,不要为火灾添加燃料,但如果你谷歌搜索"git和二进制文件慢",有很多链接可以报告用户在git中管理二进制文件时遇到问题.此外,使用一个SCM或其他SCM的开发人员都知道每个系统的优点和缺点......因此,当二进制文件被投入回购时,git已经变得非常慢. (2认同)

小智 15

没有具体的二进制文件和git处理它们的方式.将文件添加到git存储库时,会添加一个标头,并使用zlib压缩文件,并在SHA1哈希后重命名.无论文件类型如何,这都完全相同.zlib压缩中没有任何内容可以使二进制文件出现问题.

但在某些方面(推,gc),Git开始考虑增量压缩内容的可能性.如果git找到相似的文件(文件名等),它会将它们放在RAM中并开始将它们压缩在一起.如果你有100个文件,并且每个文件都说50Mb,它会尝试同时在内存中放入5GB.为此,你必须添加更多东西才能使事情发挥作用.您的计算机可能没有这么多的RAM,它开始交换.这个过程需要时间.

您可以限制增量压缩的深度,以便进程不会使用那么多内存,但结果是压缩效率较低.(core.bigFileThreshold,delta属性,pack.window,pack.depth,pack.windowMemory等)

所以有很多人认为你可以做的就是让git与大文件一起工作得很好.

  • 有关如何禁用这些"增量"尝试的说明,请参见[此处](http://thread.gmane.org/gmane.comp.version-control.git/146957/focus=147598). (4认同)

小智 6

加快速度的一种方法是使用--depth 1旗帜.有关详细信息,请参见手册页.我不是一个伟大的git guru,但我相信这说相当于一个p4 get或一个svn get,它只给你只有最新的文件而不是"给我所有的所有文件的所有修改",这是是什么git clone呢.


jos*_*ers -2

只需将文件设置为忽略即可。请参阅下面的链接:

http://help.github.com/git-ignore/

  • 真的。但您的答案的直接内容是“忽略文件”,而不是“从跟踪中删除文件然后忽略它们”。一般来说,写在这里比链接到另一个网站更好。 (14认同)