版本控制- Git vs SVN与非文本文件/大型项目



过去几周我一直在学习Git,与SVN相比,我真的很喜欢它的工作方式。我希望完全切换到它的主要原因是合并更容易,冲突更少,而且我可以在本地提交。这促进了多个分支的使用(比如每个ticket/issue/task/等等),也促进了多次提交。我只使用分支,如果我需要在SVN中(因为合并经常产生冲突),我只在我100%确定问题已修复时提交(而不是增量提交,这将更好)。

现在,当我一直在阅读git时,我对它的一个关注是关于非文本文件/大型项目。例如,我正在工作的游戏项目目前在SVN控制。现在在一个游戏项目中,将会有许多非文本文件,如美术,声音和其他二进制文件,有些文件可能会非常大。git如何处理非文本文件/大二进制文件?如果我想将这样的项目移植到git,我必须牢记哪些考虑因素?

与其他版本控制系统相比,Git存储数据的最大区别之一是Git将文件内容完全存储为单个对象。这意味着每个文件的每个版本都作为一个完整的文件存在于存储库中(尽管它非常压缩)。因此,当其他VCS存储两个版本之间的差异/增量时,并且处理二进制文件和文本文件的方式不同(因为二进制文件没有那么大的差异),Git只是完全相同地处理它们。

因此,在Git中使用二进制文件与使用任何其他文件类型没有什么不同。您只需要记住,对非常大的文件进行版本控制将大大增加存储库的大小(因为该大文件的每个版本都是按原样存储的,即使实际的二进制更改很小)。然而,Git的压缩功能很神奇,通常不会让你注意到这一点。特别是如果你只是在谈论一个程序的资产,你可能不会有任何困难。

添加@poke的答案

我现在是一个狂热的Git用户,但是在一个有很多二进制文件(主要是压缩文件)需要处理的大型项目中工作过,我发现SVN比Git更高效。Git仓库的大小很快就膨胀了,而类似的SVN仓库的大小变化不大。克隆如此庞大的Git仓库,尤其是跨地理分布的地方,简直是一场噩梦。Git也没有部分克隆功能,这是我们在SVN中一直做的——只签出一个特定的文件夹。git中有部分签出功能,但是你仍然需要克隆整个仓库。

注意文件是否为二进制不影响的量用于存储更改的存储库空间也不影响客户端和之间的流量服务器。用于存储和传输出于目的,Subversion使用差分同样有效的方法二进制和文本文件;这是与差异完全无关"svn diff"命令使用的方法。

http://subversion.apache.org/faq.html二进制文件

考虑到SVN成熟的系统管理工具(Git这些年也有所改进,但我觉得SVN在这方面仍然有优势),我认为有一个可能带有Git - SVN repo的SVN服务器用于本地开发是明智的。

有一个git-bigfiles,它是git的一个分支。不知道它有多成熟。你可以计算它。但是它的存在表明Git并不一定擅长处理大文件。

git可以完美地处理二进制文件。您只需要记住,二进制文件的所有版本都保存在本地。如果一个二进制文件(比方说一个图像)经常更改,那么您最终会用该图像的所有版本填充您的本地空间。

其他答案已经解决了这里的选择,但是也有可能对二进制文件使用SVN(如果它们会有很大的变化),而对其他所有内容使用git。在构建阶段,您可以使用脚本从svn获取二进制资源。

最新更新