我的项目已有六个月了,git非常慢.我们跟踪大约30个大小为5 MB到50 MB的文件.这些是二进制文件,我们将它们保存在git中.我相信那些文件让git变慢了.
有没有办法从存储库中杀死所有大小> 5MB的文件.我知道我会失去所有这些文件,这对我来说没问题.
理想情况下,我想要一个列出所有大文件(> 5MB)的命令.我可以看到列表,然后我说好了继续删除这些文件并使git更快.
我应该提一下,git不仅在我的机器上很慢,而且在暂存环境中部署应用程序现在需要大约3个小时.
因此,修复应该会影响服务器,而不仅仅是存储库的用户.
kub*_*ubi 124
你有垃圾收集吗?
git gc
Run Code Online (Sandbox Code Playgroud)
即使对于小型回购,这也会使速度产生显着差异.
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)
一句警告:这将使您的存储库与其他克隆不兼容,因为树和索引已签入不同的文件; 你将无法再推或拉他们了.
小智 17
这是一个审查修订,旨在减少负面和煽动性:
当涉及不是逐行文本文件的文件时,Git有一个众所周知的弱点.目前还没有解决方案,核心git团队也没有宣布解决这个问题的计划.如果您的项目很小,比如100 MB左右,有一些解决方法.存在git项目的分支来解决这个可伸缩性问题,但是这些分支目前还不成熟.其他一些版本控制系统没有这个特定的问题.在决定是否选择git作为修订控制系统时,您应该将此问题视为众多因素中的一个.
小智 15
没有具体的二进制文件和git处理它们的方式.将文件添加到git存储库时,会添加一个标头,并使用zlib压缩文件,并在SHA1哈希后重命名.无论文件类型如何,这都完全相同.zlib压缩中没有任何内容可以使二进制文件出现问题.
但在某些方面(推,gc),Git开始考虑增量压缩内容的可能性.如果git找到相似的文件(文件名等),它会将它们放在RAM中并开始将它们压缩在一起.如果你有100个文件,并且每个文件都说50Mb,它会尝试同时在内存中放入5GB.为此,你必须添加更多东西才能使事情发挥作用.您的计算机可能没有这么多的RAM,它开始交换.这个过程需要时间.
您可以限制增量压缩的深度,以便进程不会使用那么多内存,但结果是压缩效率较低.(core.bigFileThreshold,delta属性,pack.window,pack.depth,pack.windowMemory等)
所以有很多人认为你可以做的就是让git与大文件一起工作得很好.
小智 6
加快速度的一种方法是使用--depth 1旗帜.有关详细信息,请参见手册页.我不是一个伟大的git guru,但我相信这说相当于一个p4 get或一个svn get,它只给你只有最新的文件而不是"给我所有的所有文件的所有修改",这是是什么git clone呢.
jos*_*ers -2
只需将文件设置为忽略即可。请参阅下面的链接:
http://help.github.com/git-ignore/