Git与SVN在非文本文件/大型项目方面的区别

11

最近几周我一直在学习Git,相比SVN,我真的很喜欢它的工作方式。我想完全转换到Git的主要原因是合并操作据说更容易产生少量冲突,并且我可以在本地提交。这促进了许多分支的使用(例如每个票/问题/任务等一个分支),也促进了许多提交。在SVN中,仅在需要时才使用分支(由于合并经常会产生冲突),并且只有在我确信问题已解决时才提交(而不是增量提交,这会更好)。

现在,我对Git有一个担忧,因为我一直在阅读关于非文本文件/大型项目的问题。例如,我目前正在使用SVN控制的游戏项目上工作。现在,在游戏项目中,将会有许多像艺术、声音和其他二进制文件这样的非文本文件,有些文件可能相当大。Git处理非文本文件/大型二进制文件的能力如何?如果我想将这样的项目移植到Git上,我需要考虑哪些因素?


你是否考虑过使用Artifactory或类似工具来存储(版本化的)大文件?http://www.jfrog.com/artifactory - Nic
4个回答

6
Git与其他版本控制系统在存储数据方面的一个重大区别是Git将文件内容完全作为单个对象存储。这意味着您存储库中的每个文件的每个版本都存在于一个完整的文件中(尽管非常压缩)。因此,虽然其他VCS存储两个版本之间的差异/增量,并因此以不同方式处理二进制和文本文件(因为二进制文件无法进行差异比较),但Git只是处理它们相同。
因此,在Git中使用二进制文件与使用任何其他文件类型没有区别。您只需要记住,对非常大的文件进行版本控制会大大增加存储库的大小(即使实际的二进制更改很小,那么该大型文件的每个单个版本都存储为它自己)。但是,Git的压缩效果非常好,通常你不会注意到这一点。特别是如果您只谈论程序的素材,则可能不会遇到任何困难。

9
每个对象最初都是一个单独的文件。经过足够多的提交,或当存储库进行了“ gc ”处理,或者在克隆存储库时,它们将被压缩和打包,从而使存储库的大小与子版本存储库相当。 - Josh Lee
@jleedev:我所说的“存在完整文件”是指文件(内容)被完整地存储,而不一定是单个文件存储了 blob。正如我所说,Git 执行的压缩非常有效,因此通常您不会注意到每个文件版本都独立存储在存储库中。 - poke
这取决于你的抽象层次。但通常你不会注意到它。 - Josh Lee
2
压缩已经压缩过的数据通常不会产生良好的结果。Git并没有什么神奇的东西可以进一步压缩JPG。制作增量是减小文件大小的唯一方法 - 一旦进行了增量处理,它将被存储为增量(显然),使其与任何其他源代码管理工具没有区别。 - gbjbaanb

1

添加@poke的答案

我现在是一个狂热的Git用户,但曾经在一个有大量二进制文件(主要是zip文件)需要处理的巨型项目中工作时,我发现SVN比Git更有效。Git仓库的大小很快就会膨胀,而类似的SVN仓库的大小变化不大。克隆这样一个巨大的Git仓库,特别是跨地理分布的地方,是一场噩梦。Git也没有部分克隆功能,这是我们在SVN中经常做的事情——只检出一个特定的文件夹。Git中有部分检出,但你仍然必须克隆整个仓库。

请注意,文件是否为二进制文件并不影响存储该文件的更改所使用的存储库空间的数量,也不影响客户端和服务器之间的流量。为了存储和传输目的,Subversion使用一种差异方法,对于二进制和文本文件都同样适用;这与'svn diff'命令使用的差异方法完全无关。

http://subversion.apache.org/faq.html#binary-files

考虑到 SVN 成熟的系统管理工具(Git 在这方面也有所改进,但我认为 SVN 在这方面仍然占优势),我认为最好建立一个 SVN 服务器,并可能使用 git-svn 存储库进行本地开发。

有一种叫做 git-bigfiles 的东西 - 它是 git 的一个分支。不确定它有多成熟。您可以评估它。但事实上它的存在表明 Git 并不一定擅长处理大文件。


1
首先,zip 文件本身已经被压缩过了,因此 git 应用的 gzip 压缩效果并不会太好。其次,你不一定需要克隆一个仓库。实际上,克隆只是在开始时设置本地仓库的操作。你可以简单地将其他仓库添加为远程仓库,然后进行分支等部分获取。 - poke
无论如何,除非您有不断变化的二进制文件(例如当您的编辑器使用二进制格式时,例如Flash IDE的.fla文件),否则使用Git存储二进制资产(声音、图像)根本不是问题,特别是小缺点不会抵消您首先使用Git获得的好处。 - poke
1
我认为你没有理解我的克隆方面的担忧。当我需要设置一个新的本地仓库时,我必须进行克隆,无论克隆是否是一次性工作。而从SVN的角度来看,获取特定分支仍然不是部分的。在任何大型项目中,二进制文件都会非常频繁地发生变化。包括资产。至少其中的一个子集就足以开始出现问题了。 - manojlds
1
首先,zip本身已经是压缩的,所以git应用的gzip压缩自然不会起到太大的作用。 - 没错,这在SVN中并不是这样,这就是我的观点。 - manojlds

0

Git完美地处理二进制文件。你只需要记住,所有版本的二进制文件都会被保存在本地。如果一个二进制文件(比如一张图片)经常发生变化,你最终会用所有版本的图片填满你的本地空间。


我个人的经验是,git 在压缩二进制文件方面做得很好。只需记得定期运行 git packgit gc 即可。 - sehe
SVN对二进制文件的处理方式与此处提到的方式相同还是不同(即为每个版本存储完整副本)? - ryanzec
由于使用Git,您必须在本地存储库中保存完整的历史记录,因此它将占用比SVN项目更多的空间。如果要在SVN中回到过去,您需要从远程存储库下载它(服务器拥有所有历史记录)。而使用Git,则已经在本地拥有所有版本。 - ALoR
@ryanzec - 请查看我的答案,了解SVN如何处理二进制文件及其差异。 - manojlds

0
其他答案已经解决了这里的选择,但是还有一种可能性,就是对于二进制文件(如果它们会经常更改),可以使用SVN,而对于其他所有内容,则可以使用Git。在构建阶段,您可以使用脚本从svn获取二进制资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接