优化包含大型二进制文件的git repo


21

我们的项目约为11GB,其中10个是二进制数据(.png图像)。因此,git diffgit status运算要花费一分钟以上的时间。幸运的是,所有数据文件都以一个漂亮的名称分隔到一个文件夹中data。任务是“避免对二进制文件进行压缩,扩散和其他昂贵的操作”。

  • 考虑将项目分为两个回购。然后data将是一个外部回购,由主源代码回购签出。已决定,使存储库保持同步的开销会太大,尤其是对于处理数据文件的艺术家而言。

  • 明确地告诉git这些文件是二进制文件考虑从diffs文件,但是这些文件似乎只是该问题的部分解决方案。

我觉得git属性是解决方案,但是怎么办?还是有比整体仓库更好的体系结构?


1
这里的第一个大问题是那些数据文件有多重要。您的程序是否需要所有可用的映像才能执行任何有用的操作,还是在典型的开发/测试过程中仅用一小部分就可以解决?
Ixrec

@Ixrec,图像实际上比源代码更重要。它们都必须存在,并且始终检查.png校验和是否存在损坏的文件。
沃拉克

1
为什么堆栈上没有这个问题?问:似乎完全适合它。
spirc

@spirc这个问题跨越了在SO上很热门的“软件工具帮助”和此处最热门的“版本控制策略”之间的界限。由于它不要求执行什么git命令来执行某项操作,因此在该行的SO端尚不清楚,因此我投票决定将其保留在此处。

@Snowman感谢您的回复。主题列表中的哪一项适合?programmers.stackexchange.com/help/on-topic
spirc

Answers:


18

您可以使用git-lfs或类似的工具(git-fat,git-annex等)。这些工具基本上用带有哈希的小文本文件替换了您存储库中的二进制文件,并以非git的方式(例如网络共享)存储了实际的二进制数据。

使差异和所有内容都变得超快,因为仅比较哈希,并且(至少对于git-lfs而言)对用户透明(安装一次后)。

github,gitlab,VisualStudio支持Afaik git-lfs,并且是开源的。


2
您是否尝试过git-lfs由开发人员/艺术家组成的混合团队在拥有数十亿资产的项目中使用?我想知道人们是否在游戏和动画等项目中使用git-lfs。由于在撰写本文时还算是新的。根据我自己的经验,对于技术含量较低的用户来说,进入git的障碍已经非常高,因此在其上再加上一层文件管理功能可能很难使人们使用,除非他们已经对git感到满意。
ideaman42 '16

很抱歉,仅适用于大约1GB的数据。但是git-lfs应该不为最终用户增加任何额外的步骤,它应该是完全透明的。
kat0r

这似乎是正确的答案,如果在集成过程中出现一些问题,我将在这里报告。因此,安装过程仅需要在服务器上完成一次,而无需在每台客户端计算机上完成一次?
沃拉克16-3-15

Afaik您还需要安装一个小型客户端插件,请检查github页面。但是,使用组策略/比任何其他方法都更容易实施。
kat0r

1

同时使用GIT和SVN仓库

如果可以从逻辑上将二进制文件与源文件分开,则可以考虑将git用于文本文件,将非DVCS(例如Subversion)用于二进制文件。

我正在研究的项目可以执行此操作,因为每个编译的库(用于OSX / Win32依赖项)都有很多GB,因此需要保持版本。


另一方面,如果您具有非技术用户,则使用两个版本控制系统可能会出现问题。但是,如果美术人员没有使用代码,则可以提供脚本执行更新,并且他们可以使用Subversion提交二进制资产。

使用SVN(带有git svn

尽管对于习惯使用常规git的开发人员来说,这种折衷并不总是那么好,但是您可以将SVN用于主存储库,并且开发人员可以使用git svn工具。

对于使用git的开发人员来说,这确实使它工作起来更多一些,但对于不熟悉DVCS(或一般来说VCS)的每个人来说,这意味着他们可以使用SVN的简单模型,而不必使用多个复杂的版本控制系统。


git-lfs也是一个选项,但是我没有使用它,所以无法说明它的工作情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.