2009-12-15 163 views
12

我目前正在开始为我的版本控制系统使用git,但是我做了一些公平的网络/游戏开发,当然这需要存储图像(二进制数据)。所以,如果我的理解是正确的,如果我提交一个图像,它会改变100次,如果我获取该回购的新副本,我基本上会检查出该二进制文件的所有100个版本?Git和二进制数据

这是不是一个大回购的问题,图像经常变化不会最初回购的回购变得相当大?有没有人在现实世界中遇到过这个问题?我已经看到了一些替代方案,例如使用子模块并将图像保存在独立的回购库中,但这只会使代码库更小,图像回购将仍然很大。基本上我只是想知道是否有一个很好的解决方案。

+1

这是git的设计局限性。它被写入做好一件事:管理Linux源代码树,这几乎都是纯文本。 Git是关于差异和合并的东西,它们并不适用于图像。如果您的媒体文件非常大或经常编辑,最好使用不同的机制来存储这些文件的历史记录,如果您没有真正在代码上合作或制作很多分支机构,那么您可能会更好关闭不使用git。 – user57368 2009-12-15 23:08:50

+2

git将会处理二进制文件,它用于存储* deltas的系统是基于二进制内容的(你在补丁中看到的文本差异是动态计算的,而不是表示存储的内容)。话虽如此,压缩图像的xdelta不太可能减少空间需求。您可以将所有图像保存为XPM或BMP:p – araqnid 2009-12-15 23:52:15

回答

7

我不会称之为“结账”,但是,如果二进制数据非常庞大而且不可压缩,它将会是什么 - 巨大。是的,因为保护法仍然有效,将它分解成模块并不会节省您在初始提取知识库时的空间和时间。

一个可能的解决方案仍然在使用单独的存储库和--depth选项。浅存储库有一些限制,但我不记得具体是什么,因为我从来没有使用它。检查文档。关键字是“浅”。

编辑:从git-clone(1)

浅库拥有多条 限制(不能克隆或从中获取 ,也不是来自也不把它推), 但已经足够,如果你只有 有兴趣在 近期历史悠久的大型项目, 想发送修补程序为 补丁。

+1

有趣的是,如果考虑到上述文档引用,似乎非分布式vcs可能对二进制数据更好,因为您错过了使用git的大量优势无论如何处理二进制数据。 – Jamie 2009-12-15 23:17:16

+1

是的,但是您仍然可能需要一次抓取大型存储库的痛苦。另外,您可以使用单独的非Git存储库来存储二进制数据。但是因为我真的很喜欢git(虽然起初对此持怀疑态度 - Linus写的所有内容都会被赞扬),但我建议将二进制数据分开......并且单独处理它;-) – 2009-12-15 23:21:57

2

不幸的是git并不是真正用于存储二进制数据。因为它是分布式的,所以只要你克隆所有文件,就可以得到所有文件的版本。从代码仓库中删除那些大的二进制文件也变得非常困难。更多关于这里:(http://www.somethingorothersoft.com/2009/09/08/the-definitive-step-by-step-guide-on-how-to-delete-a-directory-permanently-from-git-on-widnows-for-dumbasses-like-myself/)。

我会推荐试用它,但保留与代码分开的二进制文件(即使用子模块)。在这种情况下,如果它不适合你,你可以使用另一种解决方案,而不必重写主存储库的整个历史记录。

2

我所做的是使图像被忽略/未被跟踪的目录,然后使用其他非git系统同步图像目录/目录(或者只是手动复制图像目录更改一次,当你谈论很多图像,你不需要保持完全同步)。