Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn 不同的版本控制系统如何处理二进制文件?_Svn_Git_Version Control_Mercurial - Fatal编程技术网

Svn 不同的版本控制系统如何处理二进制文件?

Svn 不同的版本控制系统如何处理二进制文件?,svn,git,version-control,mercurial,Svn,Git,Version Control,Mercurial,我听说SVN比Git/Mercurial更好地处理二进制文件。这是真的吗?如果是,为什么?就我所能想象的,没有版本控制系统(VCS)能够区分和合并相同二进制资源的两个版本之间的更改 那么,难道不是所有的VCS都不擅长处理二进制文件吗?我不太了解特定VCS实现背后的技术细节,因此它们可能有一些优点和缺点。文本文件具有二进制文件所缺乏的自然的面向行的结构。这就是为什么使用通用文本工具(diff)比较它们比较困难的原因。虽然这应该是可能的,但当对二进制文件应用diff时,可读性的优势(我们首先使用文本

我听说SVN比Git/Mercurial更好地处理二进制文件。这是真的吗?如果是,为什么?就我所能想象的,没有版本控制系统(VCS)能够区分和合并相同二进制资源的两个版本之间的更改


那么,难道不是所有的VCS都不擅长处理二进制文件吗?我不太了解特定VCS实现背后的技术细节,因此它们可能有一些优点和缺点。

文本文件具有二进制文件所缺乏的自然的面向行的结构。这就是为什么使用通用文本工具(diff)比较它们比较困难的原因。虽然这应该是可能的,但当对二进制文件应用diff时,可读性的优势(我们首先使用文本作为首选格式的原因)将丢失


至于你认为所有版本控制系统“在处理二进制文件方面都是垃圾”,我不知道。原则上,没有理由认为二进制文件的处理速度较慢。我更愿意说,在处理文本文件时,使用VCS(跟踪、差异、概述)的优势更加明显。

主要的痛点在于任何DVC的“分布式”方面:您正在克隆所有内容(所有文件的所有历史记录)

由于大多数二进制文件都不是以delta格式存储的,也不是像文本文件那样压缩的,如果您存储的是快速发展的二进制文件,那么您很快就会得到一个庞大的存储库,移动起来非常麻烦(推/拉)

例如,对于Git,请参见

二进制文件不适合VCS所能带来的功能(差异、分支、合并),在工件存储库中可以更好地管理(例如a)。

对于CVCS(集中式VCS)来说,这是不必要的,因为在CVCS中,存储库可以扮演这个角色,并且是二进制文件的存储库(即使它不是其主要角色)

Git和Mercurial都可以从容地处理二进制文件。不要损坏它们,您可以将它们签入和签出。问题在于规模

源文件通常比二进制文件占用更少的空间。您可能有100K的源文件构建了100Mb的二进制文件。因此,在我的存储库中存储单个构建可能会使其大小增加30倍

更糟糕的是:

版本控制系统通常通过某种不同格式存储文件。假设我有一个100行的文件,每行平均大约40个字符。整个文件的大小是4K。如果我更改了该文件中的一行,并保存了该更改,则只会在存储库的大小上添加大约60个字节

现在,假设我编译并添加了100Mb的文件。我对我的源代码进行了更改(可能是10K左右的更改),重新编译并存储新的二进制版本。嗯,二进制文件通常差异不大,所以我很可能会在我的存储库中再添加一个100Mb大小的文件。进行一些构建,我的存储库大小会增长到几GB,而我的存储库的源代码部分只有几十KB

Git和Mercurial的问题是,您通常会将整个存储库签出到系统中。我现在下载的不是几秒钟内就可以传输的几十KB的数据,而是几GB的构建和几十KB的数据

也许人们会说Subversion更好,因为我可以简单地在Subversion中签出我想要的版本,而不是下载整个存储库。然而,Subversion并没有为您提供从存储库中删除过时二进制文件的简单方法,因此您的存储库将不断增长。我还是不推荐。见鬼,即使版本控制系统允许您删除过时二进制文件的旧版本,我也不推荐使用它。(Perforce、ClearCase和CVS都可以)。这最终会成为维护的一大难题

这并不是说你不应该存储任何二进制文件。例如,如果我正在制作一个网页,我可能需要一些GIF和JPEG。将它们存储在Subversion或Git/Mercurial中没有问题。它们相对较小,可能比我的代码本身变化小得多


不应该存储的是构建对象。这些应该存储在发布存储库中,并根据需要获取。Maven和Ant w/Ivy在这方面做得很好。并且,你可以在C、C++和C ^项目中使用Maven存储库结构。在 < P>中,你可以使用二进制文件来确保没有人可以编辑它们。这主要是向您保证,当您锁定二进制文件时,没有其他人会修改它。分布式VCS没有(也不能)锁——没有可供注册的中央存储库。

关于git和二进制文件的一点说明

Git正在压缩二进制文件和文本文件。所以git并不像有人建议的那样处理二进制文件

Git添加的任何文件都将被压缩成松散的对象。不管它们是二进制还是文本。如果您有一个二进制文件或文本文件并将其提交,则存储库将增长。如果您对文件做了一个小的更改并再次提交,您的存储库将根据压缩比以大致相同的数量再次增长

然后制作一个
git gc
。Git将在二进制或文本文件中找到相似之处,并将它们压缩在一起。如果相似性很大,则压缩效果会很好。 另一方面,如果文件之间没有相似之处,那么与单独压缩相比,将它们压缩在一起并没有多大好处

下面是一个使用位图图片(二进制)的测试,我做了一些更改:

martin@martin-laptop:~/testing123$ git init  
Initialized empty Git repository in /home/martin/testing123/.git/  
martin@martin-laptop:~/testing123$ ls -l   
total 1252  
-rw------- 1 martin martin 1279322 Jan  8 22:42 pic.bmp  
martin@martin-laptop:~/testing123$ git add .  
martin@martin-laptop:~/testing123$ git commit -a -m first  
[master (root-commit) 53886cf] first  
 1 files changed, 0 insertions(+), 0 deletions(-)  
 create mode 100644 pic.bmp  

// here is the size:  
martin@martin-laptop:~/testing123$ du -s .git  
1244    .git  

// Changed a few pixels in the picture  

martin@martin-laptop:~/testing123$ git add .  
martin@martin-laptop:~/testing123$ git commit -a -m second  
[master da025e1] second  
 1 files changed, 0 insertions(+), 0 deletions(-)  

// here is the size:  
martin@martin-laptop:~/testing123$ du -s .git  
2364    .git  

// As you can see the repo is twice as large  
// Now we run git gc to compress  

martin@martin-laptop:~/testing123$ git gc  
Counting objects: 6, done.  
Delta compression using up to 2 threads.  
Compressing objects: 100% (4/4), done.  
Writing objects: 100% (6/6), done.  
Total 6 (delta 1), reused 0 (delta 0)  

// here is the size after compression:  
martin@martin-laptop:~/testing123$ du -s .git  
1236    .git  

// we are back to a smaller size than ever...  
我建议不要像一对夫妇所建议的那样,以“不具建设性”的方式结束这项工作。关于二进制文件的不同存储方式,以及DVCS中的签出存储一切的方式,等等,都有确凿的事实。关于什么更好会有一些争论,但我认为q是有价值的