1 SVN简介
SVN的全称是Subversion,即版本控制系统。它是最流行的一个开放源代码的版本控制系统。作为一个开源的版本控制系统,Subversion管理着随时间改变的数据。这些数据放置在一个中央资料档案库(Repository)中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样就可以把档案恢复到旧的版本,或是浏览文件的变动历史。Subversion是一个通用的系统,可用来管理任何类型的文件,其中包括程序源码
SVN采用客户端/服务器体系,项目的各种版本都存储在服务器上,程序开发人员首先将从服务器上获得一份项目的最新版本,并将其复制到本机,然后在此基础上,每个开发人员可以在自己的客户端进行独立的开发工作,并且可以随时将新代码提交给服务器。当然也可以通过更新操作获取服务器上的最新代码,从而保持与其他开发者所使用版本的一致性
SVN的客户端有两类,一类是基于Web的WebSVN等,另一类是以Tortoise SVN为代表的客户端软件。前者需要Web服务器的支持,后者需要用户在本地安装客户端,两种都有免费的开源软件供使用。SVN存储版本数据也两种方式:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点
2 SVN基本概念
3 SVN架构
- Repository(源代码库):源代码统⼀存放的地⽅
- Checkout(提取):当你⼿上没有源代码的时候,你需要从repository checkout⼀份
- Commit(提交):当你已经修改了代码,你就需要Commit到repository
- Update (更新):当你已经Checkout了⼀份源代码, Update后就可以和Repository上的源代码同步
4 SVN 的主要功能
- 目录版本控制
CVS 只能跟踪单个文件的历史, 不过 Subversion 实作了一个 “虚拟” 的版本控管文件系统, 能够依时间跟踪整个目录的变动。 目录和文件都能进行版本控制 - 真实的版本历史
自从CVS限制了文件的版本记录,CVS并不支持那些可能发生在文件上,但会影响所在目录内容的操作,如同复制和重命名。除此之外,在CVS里你不能用拥有同样名字但是没有继承老版本历史或者根本没有关系的文件替换一个已经纳入系统的文件。在Subversion中,你可以增加(add)、删除(delete)、复制(copy)和重命名(rename),无论是文件还是目录。所有的新加的文件都从一个新的、干净的版本开始 - 自动提交
一个提交动作,不是全部更新到了档案库中,就是不完全更新。这允许开发人员以逻辑区间建立并提交变动,以防止当部分提交成功时出现的问题 - 纳入版本控制的源数据
每一个文件与目录都附有一組属性关键字并和属性值相关联。你可以创建, 并儲存任何你想要的Key/Value对。 属性是随着时间来作版本控管的,就像文件內容一样 - 选择不同的网络层
Subversion 有抽象的档案库存取概念, 可以让人很容易地实作新的网络机制。 Subversion 可以作为一个扩展模块嵌入到Apache HTTP 服务器中。这个为Subversion提供了非常先进的稳定性和协同工作能力,除此之外还提供了许多重要功能: 举例来说, 有身份认证, 授权, 在线压缩, 以及文件库浏览等等。还有一个轻量级的独立Subversion服务器, 使用的是自定义的通信协议, 可以很容易地通过 ssh 以 tunnel 方式使用 - 一致的数据处理方式
Subversion 使用二进制差异算法来异表示文件的差异, 它对文字(人类可理解的)与二进制文件(人类无法理解的) 两类的文件都一视同仁。 这两类的文件都同样地以压缩形式储存在档案库中, 而且文件差异是以两个方向在网络上传输的 - 有效的分支(branch)与标签(tag)
在分支与标签上的消耗并不必一定要与项目大小成正比。 Subversion 建立分支与标签的方法, 就只是复制该项目, 使用的方法就类似于硬连接(hard-link)。 所以这些操作只会花费很小, 而且是固定的时间 - Hackability
Subversion没有任何的历史包袱; 它主要是一群共用的 C 程序库, 具有定义完善的API。这使得 Subversion 便于维护, 并且可被其它应用程序与程序语言使用
5 SVN优于CVS之处
- 原子提交。一次提交不管是单个还是多个文件,都是作为一个整体提交的。在这当中发生的意外例如传输中断,不会引起数据库的不完整和数据损坏
- 重命名、复制、删除文件等动作都保存在版本历史记录当中
- 对于二进制文件,使用了节省空间的保存方法。(简单的理解,就是只保存和上一版本不同之处)
- 目录也有版本历史。整个目录树可以被移动或者复制,操作很简单,而且能够保留全部版本记录
- 分支的开销非常小
- 优化过的数据库访问,使得一些操作不必访问数据库就可以做到。这样减少了很多不必要的和数据库主机之间的网络流量
6 svn的优缺点
优点
- 管理方便,逻辑明确,符合一般人思维习惯
- 代码一致性和安全性非常高
- 适合开发人数不多的项目开服
- 大部分软件配置管理的大学教材都是使用svn
- 学习简单、使用简单
缺点
- 服务器压力大,SVN 数据库容易暴增
- 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交、还原、对比等等
- 不适合开源开服(开发人数非常非常多)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题
7 svn工作流程
开始新⼀天的⼯作
- 从服务器下载项⽬组最新代码。(Checkout)
- 如果已经Checkout并且有⼈已Commit了代码,你可以更新以获得最新代码。(Update)
- 进⼊⾃⼰的分⽀,进⾏⼯作,每隔⼀个⼩时向服务器⾃⼰的分⽀提交⼀次代码(很多⼈都有这个习惯。因为有时候⾃⼰对代码改来改去,最后⼜想还原到前⼀个⼩时的版本,或者看看前⼀个⼩时⾃⼰修改了哪些代码,就需要这样做了)。(Commit)
- 下班时间快到了,把⾃⼰的分⽀合并到服务器主分⽀上,⼀天的⼯作完成,并反映给服务器。(Commit)
注意: 如果两个程序员同时修改了同⼀个⽂件, SVN可以合并这两个程序员的改动,实际上SVN管理源代码是以⾏为单位的,就是说两个程序员只要不是修改了同⼀⾏程序,SVN都会⾃动合并两种修改。如果是同⼀⾏,SVN会提示⽂件Confict, 冲突,需要⼿动确认