`
shlei
  • 浏览: 288741 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Subversion与CVS的对比

阅读更多
Subversion是什么?

Subversion 是一个自由/开源版本控制系统,它管理文件和目录可以超越时间。一组文件存放在中心版本库,这个版本库很像一个普通的文件服务器,只是它可以记录每一次文件和目录的修改,这便使你可以取得数据以前的版本,从而可以检查所作的更改。从这个方面看,许多人把版本控制系统当作一种“时间机器”。

Subversion 可以通过网络访问它的版本库,从而使用户可以在不同的电脑上使用。一定程度上可以说,允许用户在各自的地方修改同一份数据是促进协作。由于所有的工作都有历史版本,你不必担心由于失去某个通道而影响质量,如果存在不正确的改变,只要取消改变。

Subversion的历史

早在2000 年,CollabNet, Inc. (http://www.collab.net) 开始寻找CVS 替代产品的开发人员,CollabNet 提供了一个协作软件套件CEE (CollabNet Enterprise Edition),它的一个组件是版本控制系统。尽管CEE 在初始时使用CVS 作为其版本控制系统,但是CVS 的局限性在一开始就很明显,CollabNet 知道迟早要找到一个更好的替代品。遗憾的是,CVS成为了开源世界事实上的标准,因为没有更好的产品,至少是没有可以自由使用的。所以CollabNet 决定写一个新的版本控制系统,建立在CVS 思想之上的,但是修正其错误和不合理的特性。

2000 年2 月,他们联系Open Source Development with CVS(Coriolis, 1999)的作者Karl Fogel,并且询问他是否希望为这个新项目工作,巧合的是,当时Karl 正在与朋友Jim Blandy 讨论设计一个新的版本控制系统。在1995 年,他们两个曾经开办一个提供CVS支持的公司Cyclic Software,尽管他们最终卖掉了公司,但还是天天使用CVS 进行日常工作,在使用CVS 时的挫折最终促使他们认真地去考虑如何管理标记版本的数据,而且他们当时不仅仅提出了“Subversion”这个名字,并且做出了Subversion 版本库的基础设计。所以当CollabNet 提出邀请的时候,Karl 马上同意为这个项目工作,同时Jim 也得到了他的雇主,RedHat 软件赞助他到这个项目并提供了一个宽松的时间。CollabNet 雇佣了Karl 和Ben Collins Sussman,详细的设计从三月开始,在Behlendorf 、CollabNet、Jason Robbins 和 Greg Stein(当时是一个独立开发者,活跃在WebDAV/DeltaV 系统规范阶段)的恰当激励的帮助下,Subversion 很快吸引了许多活跃的开发者,结果是许多有CVS 经验的人们很乐于有机会为这个项目做些事情。

最初的设计小组固定在简单的目标上,他们不想在版本控制方法学中开垦处女地,他们只是希望修正CVS,他们决定Subversion 匹配CVS 的特性,保留相同的开发模型,但不复制CVS 明显的缺陷。尽管它不需要成为CVS 的继任者,它也应该与CVS 保持足够的相似性,使得CVS 用户可以轻松的做出转换。经过14 个月的编码,2001 年8 月31 日,Subversion 自己能够“成为服务”了,开发者停止使用CVS 保存Subversion 的代码,而使用Subversion 本身。

当CollabNet 开始这个项目的时候,曾经资助了大量的工作(它为全职的Subversion 开发者提供薪水),Subversion 像许多开源项目一样,被一些激励知识界精英的宽松透明的规则支配着。CollabNet 的版权许可证完全符合Debian 的自由软件方针,也就是说,任何人可以自由的下载,修改和重新发布,不需要经过CollabNet 或其他人的允许。

功能性对比

一、Subversion包含绝大部分CVS功能

Subversion 作为CVS 的重写版和改进版,其目标就是作为一个更好的版本控制软件,取代目前流行的CVS。Subversion 的主要开发人员都是业界知名的CVS 专家。Subversion支持绝大部分的CVS 功能/命令;Subversion 的命令风格和界面也与CVS 非常接近。当然,不同的地方正是对CVS 的改进。

二、全局性的版本编号

一个新的版本,并得到一个自增量的版本号N+1,该版本号并不针对某个特定的文件,而是全局性的、针对整个版本库的。因此,我们可以将Subversion 的版本库看作是一个文件系统或文件目录树的数组。

从技术的角度来说,在Subversion 中,“文件foo.c 的第5 版本”这个说法是错误的;正确的说法应该是:”文件foo.c 在版本库被修改了5 次,即执行5 次commit 后是什么样子?”。显然,在Subversion 中,版本库被修改5 次后foo.c 的内容,和被修改了6 次后foo.c 的内容很可能完全一样,因为版本库的第6 次修改很可能只修改了版本库的其他部分,而并没有对foo.c 的进行修改。相反,在CVS 中,文件foo.c 的第1.1 版本和第1.2 版本总是不同的。

Subversion 的全局性版本编号为Subversion 带来了诸多的优势:如对目录或文件执行拷贝,无论涉及多少文件,Subversion 不需要对单个文件依次执行拷贝命令,仅仅需要建立一个指向相应的全局版本号的一个指针即可。

三、目录的版本控制

CVS 只能对文件进行版本控制,不能对目录进行版本控制,因此CVS 没有任何关于文件“移动”(move) 操作的概念。当人为进行文件移动操作时,CVS 只能注意到,一个文件在一个位置被删除了,而在一个新位置创建了另外一个文件。由于它不会连接两个操作,因此也很容易使文件历史轨迹丢失。设置 CVS 存储库时,必须非常谨慎地为每个文件选择准确的位置,因为在设置之后,几乎就要一直使用这个位置了。

同样由于CVS 不记录目录的版本历史,CVS 不支持对文件的“重命名”(rename),人为的对文件进行重命名会使得命名前后的文件失去历史联系,而记录历史本来是版本管理的主要目的。

还有,CVS 不支持对文件的“拷贝”(copy),人为的拷贝对CVS 而言,只能看到新的文件的增加,而不能记录拷贝源文件和目标文件之间的联系。

综上所述,缺乏对文件“移动”、“重命名”、“拷贝”的支持的根源在于CVS 不能记录目录的版本历史,而这些操作在当前的软件开发过程中经常发生,这正是Subversion被开发并取代CVS 的主要原因之一。

Subversion 将目录作为一类特殊的文件来处理(事实上,从文件系统的角度来看,目录确实是一类特殊的文件,当目录中的子目录/文件被删除、重命名、或新的子目录/文件被创建时,目录的内容将发生改变)。因此,Subversion 象记录普通文件的修改历史一样记录对目录的修改历史,当发生文件/目录的移动、重命名或拷贝操作时,Subversion 能够准确记录操作前后的历史联系。同样,象对文件的不同历史版本进行比较一样,Subversion支持对目录的不同历史版本的比较,清晰展现目录的变化历史。

四、原子性提交

从使用者的角度来看,CVS 和Subversion 都支持对多个文件修改的批量提交,但二者在实现方式上存在本质的区别。

CVS 采用线性、串行的批量提交,即依次地,一个接一个地执行提交,每成功提交一个文件,该文件的一个新的版本即被记录到版本库中,提交时用户提供的日志信息被重复地存储到每一个被修改的文件的版本历史中。

CVS 串行批量提交模式的弊端在于 - 当任何原因造成批量操作的中断时(典型原因包括:网络中断、客户端死机等),版本库往往处于一个不一致的状态:原本应该全部入库的文件只有一部分入库,很有可能版本库中的最新版本不能顺利编译,更为严重的是,随着其他的用户执行cvs update 操作,该不一致性将迅速在开发团队中扩散,从而严重影响团队的开发效率,并存在质量隐患。另外,假如该批量提交的中断没有被及时发现,开发团队往往要花更多的时间进行软件调试和排错。

CVS 即使在批量提交不发生中断时也会造成不一致:假设用户A 启动一个需要较长时间才能完成的批量提交;与此同时,用户B 执行cvs update 操作。此时,用户B 很有可能得到一个不一致的更新,即用户B 通过“更新”操作,得到用户A 的部分修改文件。

Subversion 彻底消除了CVS 的以上弊端。无论批量提交包含多少文件修改,只有当全部文件修改都成功入库,该提交才变得有效,才对其他用户可见;否则,无论任何原因造成中断,Subversion 都会自动执行“回滚”(rollback)操作。换一个说法,Subversion 保证所有的修改要么全部入库生效,要么一个也不入库,即对版本库不作任何的修改。这就是Subversion 的原子性提交(atomic commit)。

由于Subversion 的原子性提交特性和全局版本编号方式,当提交成功完成时,一个唯一的、新的全局版本编号产生,而提交时用户提供的日志信息与该新的版本编号关联,只进行一次存储(区别于CVS 的按文件重复存储)。

五、支持变更集概念

由于Subversion 的所有提交是原子性的,每次成功提交形成的唯一的全局版本号对应此次批量提交的所有文件修改,也就是说,一个Subversion 版本号其实对应了一个逻辑上的变更集(change set),该变更集可能对应于对一个BUG 的修复,或者对应于对一个已有功能的改进,或者对应于一个新功能的实现。可以说,变更集是一个软件开发活动的逻辑结果,该变更集可以通过其对应的版本号在软件开发的其他过程中(如软件合并/集成过程,软件发布管理,变更管理系统,缺陷追踪系统)被引用。因此,Subversion 将版本管理从单纯的、单个的文件修改的层次通过逻辑上的抽象,上升到更便于理解和交流的开发活动的层次。

六、差异化的二进制文件处理

由于历史原因,CVS 主要是为早期的程序员设计的,CVS 能够有效处理文本文件(或ASCII文件,源代码文件),可以对文本文件进行差异化的存储、新旧版本的比较,文件合并等;但对于二进制文件,CVS 则明显力不从心。在CVS 的版本库中,对于二进制文件的历史版本,CVS 唯一能做的就是对不同的版本进行独立的、冗余的存储,哪怕版本之间其实只存在微小的差异。举例而言,一个10M 的二进制文件(照片、图形文件、机械设计文件、电子设计文件)假如每周修改一次,无论每次修改的大小,一年下来,仅该文件就要消耗500M 以上的存储空间。而且,客户端每次获取该文件的新版本都要消耗10M 的网络流量。

对于目前的开发团队,无论是软件开发,Web 站点的开发,手机等电子产品的研发,需要进行版本管理的不仅是源代码等文本文件,还需要管理需求文档、设计文档、测试文档、用户手册,图形图像文件,机械/电子设计文件等诸多的二进制文件,CVS 显然不是一个好的选择。

与CVS 不同,Subversion 采用统一的二进制差异算法(binary differencing algorithm),即对文本文件和二进制文件采用相同的差异比较算法,并以相同的方式在版本库中进行存储:每次提交后版本库中只存储相对于先前版本的差异,从而可以节省大量的存储空间。

该二进制差异算法不仅应用在版本的存储上,更为重要的是,Subversion 对二进制文件与文本文件一视同仁,当客户端需要获取新的版本时(如执行svn update),在网络上只有版本的差异被传输,从而大大减少对网络带宽的消耗。更多细节参见“七、双向的差异化-压缩网络传输”。

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

如上所述,CVS 对二进制文件不能进行有效的差异化处理。对于文本文件,CVS 仅仅支持单向的差异化传输:从CVS 服务器到客户端的传输是差异化的,即执行cvs update 时,只有差异的部分从服务器传输到客户端;而当执行cvs commit 时,无论代码变化多少,CVS 都需要从客户端向服务器完整传输被修改文件的全部内容,不能只传输差异。

相反,无论是文本文件还是二进制文件,Subversion 都进行双向的差异化传输,并且差异化内容还要进行压缩/解压缩的过程:在服务器端获取差异显而易见,与CVS 类似;Subversion 在客户端获取差异的秘密在于 — Subversion 在客户端的工作拷贝中隐含了每个文件的一个“只读的、干净的”副本(该副本隐藏在隐含目录.svn 里,通常不可见,该副本还有更多的妙用,参见“十二、更多的本地/离线操作”),通过比较用户在客户端的修改和该隐含的副本,Subversion 获取需要真正传送到服务器的差异,并对差异进行压缩后才进行网络传输。

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

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

CVS 和Subversion 都支持分支(branch)和基线(tag),通过分支与合并,可以有效支持大项目的并行开发模式;通过基线管理,可以准确标识一组文件的版本,有效进行软件发布管理和必要时的历史回溯。

但CVS 和Subversion 在实现分支和基线的方式上存在很大的不同。CVS 在创建分支的时候,需要对所有进行分支的文件进行依次的操作,因此分支的建立成本(主要是建立分支所需的时间,或消耗的计算资源)与参与分支的文件数量成比例,项目越大,版本库越大,文件越多,分支的建立成本越高;基线(tag)的建立与此类似。

Subversion 的分支和基线是通过执行“拷贝”来建立的:回想一下在没有引入版本管理工具的时候我们是如何进行所谓的“分支”和“基线”管理的?答案显然是“拷贝” — 我们通过“拷贝”或“备份”来建立基线;同样,为支持多个开发人员可以同时进行开发,我们为每个开发人员创建一份“拷贝”。由此看来,Subversion 通过“拷贝”来建立分支和基线显得非常自然,有点“返朴归真”的意思。

由于Subversion 的全局版本号特性,Subversion 中分支或基线的创建过程,或Subversion中的“拷贝”过程,真正的操作是在版本库中创建一个到某一全局版本号的指针(pointer),不再需要针对众多的单个文件依次执行操作。因此,该操作的成本为一个很小的常数,与项目大小,版本库大小,文件数目的多少无关;并且,分支或基线的建立不需要进行版本的冗余存储,新建立的分支或基线基本不占用版本库空间,分支的后续存储空间的开销也只与修改的大小有关。

九、集成Apache Web Server,提供更多的特性

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

转自http://www.uml.org.cn/pzgl/200705251.asp
分享到:
评论

相关推荐

    Subversion与CVS的比较

    #### 三、Subversion与CVS的功能性对比 1. **Subversion继承并扩展CVS功能**:Subversion并非从零开始构建,而是基于CVS的成功之处进行了改进,保留了大部分CVS的基本功能,同时添加了许多增强特性。 2. **全局...

    svn与cvs对比

    ### SVN与CVS对比分析 在软件开发领域,版本控制系统(Version Control System,VCS)是不可或缺的工具,它帮助开发者们追踪代码的变更历史,协同工作,以及管理项目的复杂性。Subversion(简称SVN)和Concurrent ...

    CVS SVN VSS 对比 说明

    对比CVS,SVN在很多方面进行了优化和增强。首先,SVN支持目录版本控制,可以完整追踪文件和目录的历史变化,这使得文件的移动、重命名和拷贝操作得以保留其历史信息,提高了代码管理的灵活性。其次,SVN的全局版本号...

    CVS使用手册(cvs使用详解)

    6. **CVS与其他版本控制系统对比** - **SVN(Subversion)**:与CVS类似,但提供了更好的性能和安全性,目前更受欢迎。 - **Git**:现代分布式版本控制系统,拥有强大的分支管理和离线工作能力。 通过深入理解并...

    Apache-Subversion-1.9.5

    **五、与其他版本控制系统对比** 相比CVS,Subversion改进了锁机制,避免了CVS中的“文件锁定”问题。它还引入了树冲突的概念,更精确地反映了多用户修改同一文件夹的情况。与Git相比,虽然Subversion的分布式功能...

    VSS、CVS、SVN和ClearCase等配置工具对比

    本文将深入探讨四种常见的版本控制系统:Visual SourceSafe(VSS)、Concurrent Versions System(CVS)、Subversion(SVN)和Rational ClearCase。我们将分析它们的主要特性、优缺点,以及适用场景。 **Visual ...

    我的cvs2svn笔记

    1. **CVS与SVN对比**:CVS是一个早期的版本控制系统,而SVN在它基础上进行了改进,提供了更好的版本管理和团队协作功能。SVN支持分支和合并,拥有强大的日志查询能力,并且可以更好地处理大型项目。 2. **cvs2svn...

    TortoiseCVS和TortoiseSVN使用手册

    三、两者对比与选择 1. **适用场景**:TortoiseCVS适合已习惯CVS工作流程的团队,而TortoiseSVN由于其更先进的特性,如更好的分支管理,更广泛地被采用。 2. **性能与稳定性**:Subversion(SVN)相比CVS,在性能...

    从CVS迁移至SVN的两种方法

    随着版本控制系统的发展,越来越多的团队选择从CVS(Concurrent Versions System)转向SVN(Subversion),因为SVN提供了更强大的功能和更好的用户体验。本教程将详细解释如何使用两种工具,即SVN-Importer和CVS2SVN...

    subversion-1.6.12-1.i386.rpm(linux下)

    SVN与CVS对比的优点如下: * 统一的版本号。CVS是对每个文件顺序编排版本号,在某一时间各文件的版本号各不相同。而Subversion下,任何一次提交都会对所有文件增加到同一个新版本号,即使是提交并不涉及的文件。所以...

    Subversion 使用

    Subversion 的资源消耗与数据改变的大小成正比,而不是与数据本身大小成正比。这使得 Subversion 的性能更加高效。 二进制文件处理 Subversion 对于二进制文件和文本文件的处理同样有效,因为 Subversion 使用一种...

    版本控制软件SubVersion使用说明

    相比之下,Subversion由一群熟悉CVS的开发者团队发起,旨在解决CVS的诸多问题,打造一个更现代、更高效的版本控制系统。Subversion的目标并非重新发明轮子,而是通过全新的设计,对CVS的不足之处进行全面改进,提供...

    精通版本管理系统之SubVersion

    #### 与CVS的对比 CVS作为曾经的版本控制标准,虽然在分布式开发方面表现出色,但随着时间的发展,其局限性逐渐显现。CVS的主要缺点包括: 1. **字符集限制**:CVS主要针对ASCII文本进行了优化,对于非ASCII文本的...

    Apress.Practical.Subversion.2nd.Edition.2006.pdf

    - **功能对比**:通过表格形式列出了Subversion与其他版本控制系统的主要功能对比。 - **适用场景分析**:根据不同的使用场景,分析了选择Subversion或其他系统的理由。 - **迁移成本评估**:考虑到了从其他系统迁移...

    在Eclipse中使用SVN与CVS代码管理工具管理项目

    二、 SVN(Subversion) - CVS(Concurrent Version System)的替代和升级版本先说说CVS,CVS是开源代码的配置管理工具,其源代码和安装文件都可以免费下载。记得在学校读研的时候,学校实验室的代码全部都用CVS管理,为...

    cvs技术文档

    6. **CVS与版本控制系统对比** - 与Git等现代版本控制系统相比,CVS相对较旧,缺乏图形用户界面和分布式特性。 7. **CVS的局限性** - 不支持大文件处理,因为它是基于文本的。 - 对二进制文件的支持不足,不擅长...

    CVS团队升级SVN团队的解决方案

    - **cvsimport**:由Apache Subversion项目提供,集成度高,但可能不如cvs2svn那样全面。 根据团队的具体情况选择合适的工具进行迁移。 ##### 2.3 升级后的优势 - **更高的效率**:SVN 提供了更快速的文件版本...

    版本控制 svn cvs vss

    对比这三种工具,SVN因其强大的分支管理和合并功能、良好的跨平台支持以及丰富的第三方工具生态系统,在现代开发环境中更受欢迎。CVS虽然较老,但在某些场景下仍有其价值,特别是对于维护旧项目。VSS则更适合那些...

Global site tag (gtag.js) - Google Analytics