专家精辟讲解SVN与CVS的区别

本节主要介绍SVN与CVS的区别,上节已经介绍了一部分,不够完整,本节继续介绍SVN与CVS的区别,希望本文能教会你更多东西。

双向的差异化-压缩网络传输

通过双向的差异化-压缩网络传输看SVN与CVS的区别CVS对二进制文件不能进行有效的差异化处理。对于文本文件,CVS仅仅支持单向的差异化传输:从CVS服务器到客户端的传输是差异化的,即执行cvsupdate时,只有差异的部分从服务器传输到客户端;而当执行cvscommit时,无论代码变化多少,CVS都需要从客户端向服务器完整传输被修改文件的全部内容,不能只传输差异。相反,无论是文本文件还是二进制文件,Subversion都进行双向的差异化传输,并且差异化内容还要进行压缩/解压缩的过程:在服务器端获取差异显而易见,与CVS类似;Subversion在客户端获取差异的秘密在于―Subversion在客户端的工作拷贝中隐含了每个文件的一个“只读的、干净的”副本(该副本隐藏在隐含目录.svn里,通常不可见,该副本还有更多的妙用,参见“十二、更多的本地/离线操作”),通过比较用户在客户端的修改和该隐含的副本,Subversion获取需要真正传送到服务器的差异,并对差异进行压缩后才进行网络传输。

对CVS而言,操作的成本(网络带宽消耗是最大的操作成本)与被修改的文件的大小成比例,而与修改本身的大小无关;对Subversion而言,操作成本只与修改本身的大小成比例,而与被修改的文件的大小无关。因此,与CVS相比,Subversion消耗更少的网络带宽(以客户端的存储空间换取更少的带宽消耗在目前的计算环境下应该是个相当不错的选择!)。Subversion更加适合基于互联网(或广域网)进行协作开发的地理上分布的团队―版本服务器集中、单一;客户端广泛分布。

高效、快捷创建分支和基线

通过高效、快捷创建分支和基线看SVN与CVS的区别:CVS和Subversion都支持分支(branch)和基线(tag),通过分支与合并,可以有效支持大项目的并行开发模式;通过基线管理,可以准确标识一组文件的版本,有效进行软件发布管理和必要时的历史回溯。但CVS和Subversion在实现分支和基线的方式上存在很大的不同。CVS在创建分支的时候,需要对所有进行分支的文件进行依次的操作,因此分支的建立成本(主要是建立分支所需的时间,或消耗的计算资源)与参与分支的文件数量成比例,项目越大,版本库越大,文件越多,分支的建立成本越高;基线(tag)的建立与此类似。

Subversion的分支和基线是通过执行“拷贝”来建立的:回想一下在没有引入版本管理工具的时候我们是如何进行所谓的“分支”和“基线”管理的?答案显然是“拷贝”―我们通过“拷贝”或“备份”来建立基线;同样,为支持多个开发人员可以同时进行开发,我们为每个开发人员创建一份“拷贝”。由于Subversion的全局版本号特性,Subversion中分支或基线的创建过程,或Subversion中的“拷贝”过程,真正的操作是在版本库中创建一个到某一全局版本号的指针(pointer),不再需要针对众多的单个文件依次执行操作。因此,该操作的成本为一个很小的常数,与项目大小,版本库大小,文件数目的多少无关;并且,分支或基线的建立不需要进行版本的冗余存储,新建立的分支或基线基本不占用版本库空间,分支的后续存储空间的开销也只与修改的大小有关。

集成ApacheWebServer,提供更多的特性

通过集成ApacheWebServer,提供更多的特性看SVN与CVS的区别: Subversion通过与ApacheWebServer的集成,可以提供基于http/https协议的版本库访问机制,从而支持Subversion跨越防火墙的安全访问。除此以外,Subversion还可以利用更多的Apache特性,包括但不限于:Apache丰富的用户认证机制(包括通过LDAP服务器如WindowsActiveDirectory服务器的用户认证),基于目录路径的精细粒度的访问控制,对传输的网络流量进行压缩/解压缩,浏览版本库目录结构等等。

相关推荐