`
aben328
  • 浏览: 1460585 次
  • 性别: Icon_minigender_1
  • 来自: 广东
社区版块
存档分类

cvs和svn的区(转帖)

    博客分类:
  • SVN
阅读更多

cvs和svn的区(转帖)


全局性的版本编号
一个新的版本,并得到一个自增量的版本号N+1,该版本号并不针对某个特定的文件,而是全局性的、针对整个版本库的。因此,我们可以将Subversion 的版本库看作是一个文件系统或文件目录树的数组。Subversion 的全局性版本编号为Subversion 带来了诸多的优势:如对目录或文件执行拷贝,无论涉及多少文件,Subversion 不需要对单个文件依次执行拷贝命令,仅仅需要建立一个指向相应的全局版本号的一个指针即可。

目录的版本控制
CVS 只能对文件进行版本控制,不能对目录进行版本控制,因此CVS 没有任何关于文件“移动”(move) 操作的概念。当人为进行文件移动操作时,CVS 只能注意到,一个文件在一个位置被删除了,而在一个新位置创建了另外一个文件。由于它不会连接两个操作,因此也很容易使文件历史轨迹丢失。设置 CVS 存储库时,必须非常谨慎地为每个文件选择准确的位置,因为在设置之后,几乎就要一直使用这个位置了。
Subversion 将目录作为一类特殊的文件来处理(事实上,从文件系统的角度来看,目录确实是一类特殊的文件,当目录中的子目录/文件被删除、重命名、或新的子目录/文件被创建时,目录的内容将发生改变)。因此,Subversion 象记录普通文件的修改历史一样记录对目录的修改历史,当发生文件/目录的移动、重命名或拷贝操作时,Subversion 能够准确记录操作前后的历史联系。同样,象对文件的不同历史版本进行比较一样,Subversion支持对目录的不同历史版本的比较,清晰展现目录的变化历史。

原子性提交
从使用者的角度来看,CVS 和Subversion 都支持对多个文件修改的批量提交,但二者在实现方式上存在本质的区别。
CVS 采用线性、串行的批量提交,即依次地,一个接一个地执行提交,每成功提交一个文件,该文件的一个新的版本即被记录到版本库中,提交时用户提供的日志信息被重复地存储到每一个被修改的文件的版本历史中。
CVS 串行批量提交模式的弊端在于 - 当任何原因造成批量操作的中断时(典型原因包括:网络中断、客户端死机等),版本库往往处于一个不一致的状态:原本应该全部入库的文件只有一部分入库,很有可能版本库中的最新版本不能顺利编译,更为严重的是,随着其他的用户执行cvs update 操作,该不一致性将迅速在开发团队中扩散,从而严重影响团队的开发效率,并存在质量隐患。另外,假如该批量提交的中断没有被及时发现,开发团队往往要花更多的时间进行软件调试和排错。

差异化的二进制文件处理
由于历史原因,CVS 主要是为早期的程序员设计的,CVS 能够有效处理文本文件(或ASCII文件,源代码文件),可以对文本文件进行差异化的存储、新旧版本的比较,文件合并等;但对于二进制文件,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中的“拷贝”过程,真正的操作是在版本库中创建一个到某一全局版本号的指针(pointer),不再需要针对众多的单个文件依次执行操作。因此,该操作的成本为一个很小的常数,与项目大小,版本库大小,文件数目的多少无关;并且,分支或基线的建立不需要进行版本的冗余存储,新建立的分支或基线基本不占用版本库空间,分支的后续存储空间的开销也只与修改的大小有关。

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

支持WebDAV
WebDAV(Web-based Distributed Authoring and Versioning)是一种基于 HTTP 1.1 协议的通信协议.它扩展了HTTP 1.1,在GET、POST、HEAD 等几个HTTP 标准方法以外添加了一些新的方法,使应用程序可直接对Web Server 直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。
Subversion 通过与Apache Web Server 的集成,支持WebDAV 协议,使得业务用户(business users)或非技术用户在不安装任何版本管理客户端的情况下轻松访问Subversion 版本库,不改变业务用户已有使用习惯,支持分布的业务用户对文档的评审、修改并实现版本控制,真正将软件开发的生命周期从开发/技术团队扩展到项目的全部干系人(stakeholder),避免通过电子邮件传递文档的混乱与无序、通过Windows 操作系统共享造成的安全漏洞、病毒攻击、历史版本被覆盖或丢失、审计困难等诸多典型问题。

更好的冲突标识与处理
CVS 和Subversion 都支持通过分支与合并进行并行开发,并可以自动检测到合并时的冲突(conflicts),并在合并结果中以<<<<<< … >>>>>>标识合并的冲突部分。在CVS 中,经常会出现由于用户的疏忽(如,没有注意到冲突,或没有完全处理好冲突)而将仍然带有<<<<<< … >>>>>>冲突标识符号的文件直接进行提交(commit),从而在版本库中产生垃圾版本。Subversion 有效解决了CVS 的以上问题:Subversion 记录并保持文件的冲突状态,只有当用户明确执行svn resolved 命令后,该冲突状态标识才被复位,该文件才能被提交,从而大大减少了将仍然带有<<<<<< … >>>>>>冲突标识符号的文件直接进行提交的可能性。

更多的本地/离线操作
众所周知,CVS 客户端的工作拷贝中包含了一个隐含目录CVS,该目录中记录了客户端需要的一些管理信息;与此类似,Subversion 的客户端工作拷贝中也包含了一个隐含目录.svn,该目录中同样记录了客户端需要的一些管理信息,如版本库URL,当前访问版本号等。
与CVS 不同的是,Subversion 的.svn 目录中还包含了工作拷贝中每一个文件的一个“只读的、干净的”副本。正是由于该副本的存在,使得Subversion 与CVS 相比,可以执行更多的本地/离线操作,即某些操作不需要访问版本库服务器,因此不需要存在从客户端到服务器的网络链接,当然也不消耗任何网络带宽,这进一步增强了Subversion 对广域网的友好支持。
Subversion 的以下命令可以进行离线操作:
svn status - 显示工作拷贝上的本地修改概况;
svn diff -显示工作拷贝上的本地修改细节,比较修改前后的内容;
svn revert - 撤销工作拷贝上的本地修改;

元数据管理
与CVS 相比,Subversion 增加了元数据(metadata)管理机制。即可以对版本库中的文件或目录附加任意的“属性”(property),并记录属性的变化历史,也就是对元数据进行版本管理。一个Subversion 属性是一个“属性名称/属性值”的二元组,如“BugNumber= 100”就是一个属性,可以将该属性附加到版本N 上,以说明版本N 改正了编号为100的BUG。
Subversion 元数据的目的是提供附件的信息以满足流程或过程自动化的需要,以增强Subversion 的管理能力和自动化程度。Subversion 自身就通过“属性”来存储一些特殊的信息。一个使用Subversion 元数据的例子:可以在一些批处理的脚本程序或Subversion的钩子程序(hooks)中创建、访问、修改“属性”元数据来满足流程自动化的要求。
分享到:
评论

相关推荐

    将cvs转换为svn库的工具cvs2svn

    cvs2svn通过解析CVS的存储库,提取出所有文件和目录的变更历史,然后将这些信息重新构造为SVN仓库。它能够处理复杂的CVS分支和合并,同时支持多种数据格式的输出,包括直接导入SVN的格式。 **二、cvs2svn的安装与...

    CVS 2 SVN 指导

    随着技术的发展,Subversion(SVN)因其强大的功能和性能逐渐取代了早期的Concurrent Versions System(CVS)。本文旨在深入解析如何使用cvs2svn工具将CVS仓库迁移到SVN,为开发人员提供一个全面的迁移指导。 #### ...

    我的cvs2svn笔记

    CVS是一种广泛使用的源代码控制系统,而SVN则因其先进的特性,如分支和合并管理,逐渐成为其替代者。本笔记主要涉及以下关键知识点: 1. **CVS与SVN对比**:CVS是一个早期的版本控制系统,而SVN在它基础上进行了...

    cvs2svn-2.4.0.tar.gz

    cvs2svn is a program that can be used to migrate a CVS repository to Subversion (otherwise known as "SVN") or git. Documentation: The list of cvs2svn features explains briefly why converting a ...

    CVS和SVN配置学习

    CVS(Concurrent Versions System)和SVN(Subversion)都是广泛使用的版本控制系统,尤其在过去的几十年里,它们在开源社区和企业项目中扮演了重要角色。下面将详细介绍CVS和SVN的配置学习要点。 1. CVS简介: ...

    从CVS迁移至SVN的两种方法

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

    CVS与SVN区别

    CVS(Concurrent Versions System)和SVN(Subversion)都是源代码版本控制系统,用于管理和跟踪文件及目录的变更。它们都属于SCM(Software Configuration Management)工具,但两者之间存在显著的区别。 1. **...

    CVS迁移SVN工具亲测可用

    在软件版本控制领域,CVS(Concurrent Versions System)和SVN(Subversion)都是广泛使用的系统。CVS曾是许多项目的主要选择,但随着时间推移,SVN因其更先进的特性和更好的管理功能而逐渐受到青睐。对于那些已经...

    将CVS库转换为SVN库

    ### 将CVS库转换为SVN库 随着版本控制系统的发展与...通过上述步骤,可以在Windows环境下顺利完成从CVS到SVN的转换过程,并进行必要的配置和结构调整。这不仅有助于提升项目的开发效率,还能更好地利用SVN的强大功能。

    cvs2svn-2.3.0.tar.gz

    作用:将CVS库转为SVN库,是SVN比较好的一个插件 (1)能简单的将将CVS库转为SVN库 (2)保留历史和标签 绝对超值:适用从cvs导出数据到svn,消除了中文乱码问题 使用简单:解压后即可使用 注:当时使用的时候费了好大的...

    CVS SVN VSS 对比 说明

    CVS(Concurrent Version System)、SVN(Subversion)和VSS(Visual SourceSafe)是三种著名的版本控制系统,各有特点和优劣。下面我们将深入探讨这三者之间的差异。 CVS是一种早期的开源版本控制系统,它允许...

    svn与cvs对比

    尽管SVN在多个方面展现出了超越CVS的性能和功能,但CVS仍有一些独特优势,如符号文件标志的直观性和快速的文件访问速度,这些特点在某些特定场景下可能更受青睐。然而,随着SVN的持续发展和完善,其日益增长的市场...

    利用cvs2svn和svn-importer 将vcs项目转成svn

    NULL 博文链接:https://taotao6086.iteye.com/blog/282262

    清除当前文件夹下的cvs、svn标识

    标题中的“清除当前文件夹下的cvs、svn标识”指的是在版本控制系统中移除与CVS(Concurrent Versions System)和SVN(Subversion)相关的元数据或隐藏文件。这两个系统都是广泛使用的源代码管理系统,用于跟踪和控制...

    SCM&CVS&SVN 学习资料

    CVS和SVN都提供了强大的分支和合并功能。 3. 标签(Tag):用于标记项目的重要里程碑,例如发布版本。它们是对特定版本的引用,不会随后续的代码修改而变化。 4. 差异(Diff)与合并(Merge)工具:SCM系统通常与...

    使用CVS2SVN转换CVS档案库到SVN档案库

    NULL 博文链接:https://zzxanadu.iteye.com/blog/690400

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

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

    版本控制软件(cvs和svn的使用)

    CVS/SVN等版本控制软件,是以后团队合作开发的必须工具,因此在学习和工作中有广泛的使用。 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

Global site tag (gtag.js) - Google Analytics