《使用SVN进行版本控制课件讲解学习》由会员分享,可在线阅读,更多相关《使用SVN进行版本控制课件讲解学习(75页珍藏版)》请在金锄头文库上搜索。
1、使用SVN进行版本控制,李 洋,摘 要,一、Subversion简介 二、版本控制的基本知识 三、Subversion常用功能 四、客户端工具TortoiseSVN 五、SVN使用中常见问题,一、Subversion简介,版本控制是管理信息变更的一门艺术 版本控制工具早已经成为许多程序员的主要工具之一 版本控制软件的用途并不仅限于软件开发的领域 ,只要人们使用计算机来管理经常变更的信息,就需要使用版本控制工具 协同工作,大大提高团队工作效率 及时了解团队中其他成员的进度 资料共享 记录每个文件从诞生到最终完成全过程的每步细节,什么是Subversion?,Subversion 是一个自由的、开
2、放源码的版本控制系统 它可以管理各个时刻的文件和目录 Subversion 将文件存放在repository库中。这个仓库非常类似于一个普通的文件服务器 ,只是它还可以记录文件和目录曾经做过的每一次变更 Subversion允许你数据恢复到早期版本,或者是检查数据修改的历史,可把版本控制系统比作一种“时间机器”,Subversion的历史,CVS有明显的局限性和功能上的不足。 2000年开始 ,CollabNet公司 就开始着手开发新的版本控制系统来代替CVS。 Karl Fogel 和Jim Blandy 是CVS开发者,加入到开发subversion当中。 他们让 Subversion 来
3、使用 CVS 的特性,并且保留相同的开发模型 ,但是避开 CVS 的那些明显的缺陷 。 Subversion 于2001年8月进入“自测”阶段 。,Subversion的特色,目录控制 CVS 只能跟踪单个文件的历史,而 Subversion 实现了一个虚拟的受控文件系统,可以跟踪整个目录的变更。 真正的版本历史 由于 CVS 只限于记录文件的版本信息,像文件复制、重命名这样的操作它就不支持 ,在 Subversion 中我们可以添加、删除、复制和重命名文件和目录 。,Subversion的特色,原子化提交 一个变更集要么完整地被提交到仓库中,要么不做任何改变 ,从而避免发生不完整地提交变更的
4、情况 。 受控元数据 每一个文件和目录都有一个与其对应的属性集 。 可选的网络层 Subversion 仓库的存取是一个抽象概念,有利于其他人实现新的网络访问机制 ,Subversion 可以作为一个外部模块插入到 Apache HTTP 服务器中 。,Subversion的特色,一致的数据处理 Subversion 使用一种二进制的比较算法来表示文件之间的区别 。 高效的分支和标记 分支和标记所带来的开销与项目的规模并没有直接的关系 ,Subversion 在创建分支和标记时使用类似“连接”的方式来复制项目 。 扩展能力 它是由一组设计良好的 APIs实现的,包含在 C 的共享库中 ,这使得
5、它很容易维护。也很容易被其他应用程序或语言使用,Subversion的体系结构,Subversion的体系结构,典型的client/server模式结构 在系统的一端是存放着所有受控制数据的 Subversion 仓库。 另一端是 Subversion 的客户端程序,管理着受控数据的一部分在本地的映射(称为“工作副本”)。 在这两端之间,是通过各种仓库存取层(Repository Access,RA)的多条通道。这些通道中,有些要使用计算机网络,再通过用来访问 Subversion 仓库的服务器。而有些则完全绕过了网络,直接对仓库进行操作 。,Subversion的组件,Svn 一个命令行的客
6、户端程序 Svnversion 报告本地工作副本状态(当前档案的修订版本号表示)的程序 Svnadmin 用来创建或者是修复仓库的工具 svndumpfilter 过滤资源库程序,Subversion的组件,mod_dav_svn Apache 服务器的一个插件模块,用来使其他人可以通过网络访问这个仓库 svnserve 一个定制的、独立的 Subversion 服务程序。可作为一个驻留进程运行或者是由 SSH 调用。是使仓库可以被别人通过网络访问的另一种方法 常用的组件是svn和svnadmin,有图形化客户端来实现svn和svnadmin功能。,访问资源库的几种方式,样式 存取方式 fil
7、e:/ 直接从本地磁盘上访问仓库 http:/ 通过 WebDAV 协议访问 Apache 服务器而访问仓库 https:/ 和 http:/ 相同,但使用 SSL 来作加密 svn:/ 通过svnserve服务自定义的协议 svn+ssh:/ 和 svn:/ 相同,但通过SSH封装,资源库的URL解析,所有被Subversion管理的目录、文件有唯一路径 支持的协议有http,https,svn,svns,file http:/59.66.96.188/svn/kexie/proj/account/trunk/,protocol,host,repository,directory,SVN服务
8、器端数据目录,dav目录:提供给Apache与mod_dav_svn使用的目录,存储内部数据 db目录:所有版本控制的数据存放文件 hooks目录:放置hook脚本文件的目录 locks目录:用来放置Subversion文件库锁定数据的目录,用来追踪存取文件库的客户端 format文件:一个文本文件,记录文件库配置的版本号 conf目录:是这个仓库的配置文件(仓库的用户访问帐号、权限等),二、版本控制的基本知识,仓库(The Repository) 版本控制模型 实际工作中的subversion subversion/cvs/vss比较,仓库(The Repository),Subversio
9、n 是一个集中式的系统。它的核心是一个用来存放数据的中心仓库。中心仓库使用典型的文件和目录层次结构树状结构来存储信息。 许许多多的客户端可以连接到中心仓库,然后读取或者写入文件 。 客户端通过写文件来使其他人共享,也可以读取其它客户端所写入的文件。 典型的客户端/服务器系统模型 ,如图所示:,仓库(The Repository),仓库(The Repository),仓库就是一种文件服务器,只是不是通常的那种 。 Subversion 仓库可以记录写入仓库的每一次更改 。 这些更改包括对每一个文件的每一次修改,甚至是对目录本身的修改,例如添加文件、删除文件和对文件和目录的重新编排。这些特性使得
10、 Subversion 仓库与一般的文件服务器相比较为特殊。 客户端同样可以读取文件和目录以前某个时刻的状态 。 版本控制系统的核心:记录和跟踪数据的修改历史,版本控制模型,版本控制系统的核心任务是使得数据可以协作处理和共享。但是不同的系统使用不同的策略来达到这个目标 。 文件共享的问题 :怎样让系统允许用户共享信息,而不会让他们因意外而互相干扰? 锁定修改解锁方案 复制修改合并方案,锁定修改解锁方案,许多版本控制系统都使用“锁定修改解锁”模型来解决这个问题 ,诸如:VSS 在这样一个系统中,仓库在一个特定的时刻只允许一个人对某个文件进行修改 。 这种方案的问题是它有一点过于严格了,经常会阻塞
11、用户的使用 。 锁定可能会带来管理问题 。 锁定可能导致不必要的串行工作 。 锁定可能导致错误的安全状态,文件可能相互依赖,复制修改合并方案,Subversion、CVS以及其他一些版本控制系统使用“复制修改合并”模型来代替锁定 。 每一个用户的客户端软件从中央仓库创建出一份个人的工作副本仓库中文件和目录的本地映射 。 用户就可以并行工作,修改手中的私有副本 。 这些私有副本合并成为一个全新的版本 。 版本控制系统常常需要合并,但是最终,操作者本身必须负责让合并工作正确进行 。,冲突(conflict),复制修改合并模型会带来冲突的问题 用于解决冲突的时间远远少于锁定系统所带来的时间浪费。 没
12、有系统可以强制用户完美的交流,没有系统可以检测语义上的冲突 解决冲突的关键是用户交流,模型选择,锁定-修改-解锁模型被认为不利于协作,但有时候锁定会更好。 拷贝-修改-合并模型假定文件是可以根据上下文合并的:就是版本库的文件主要是以行为基础的文本文件(例如程序源代码)。但对于二进制格式,例如图片或声音,在这种情况下,十分有必要让用户轮流修改文件,如果没有线性的访问,有些人的许多工作就最终要被放弃。 SVN也支持锁定-修改-解锁模型。,实际中的 Subversion,工作副本Working Copies 修订版 Revision 混合型修订版,工作副本,一个 Subversion 的工作副本其实
13、就是本地系统中的一个普通的文件目录树 。 可以使用任何方式来编辑这些文件。如果是源代码文件的话,你也可以像通常情况那样去编译它们。 工作副本是你的私人工作区 。 如果你不明确的要求,Subversion 绝不会合并其他人的修改,也不会让其他人看到你做的修改 。,工作副本,在你已经修改完工作副本中的文件,并且确信修改正确后,就可以将这些修改公开给同一个项目中的其他工作人员。Subversion 提供了将文件写入仓库的命令 。 工作副本中也包含一些额外的文件。它们是由 Subversion 创建和维护的,用来辅助完成这些命令。 最典型的情况是,每一个目录都包含一个叫做 .svn 的子目录 。该目录
14、也被称为“工作副本管理目录”。 一个 Subversion 的仓库会包含几个项目,而每一个项目都是仓库的目录的一个子目录。这样,用户的工作副本也就对应于仓库中一个特定的子目录。,SVN的修订版,一个 svn commit 操作可以将任意数量的文件和目录的修改发布作为一个单独的原子事务来处理 。 在仓库中,每一次提交都被作为一个原子事务来对待 。 每当仓库接受一次提交,仓库中的文件系统目录都会创建一种新的状态,叫做一个修订版。 每一个修订本都被赋予一个唯一的自然数,并且每一个修订版的数字都比前一个要大。刚刚建立的仓库的初始的版本是 0 ,只包含一个空的根目录。 Subversion 的修订版编号
15、是针对整个目录树的,而不是某一个独立的文件 。 如图所示:,修订版,设想一个修订版编号的数列,从 0 开始,从左延伸到右。每一个修订版编号都对应一个画下面的目录树,而每一个目录树就是在每一次提交之后的仓库的快照。,混合型修订版,一般的原则上,Subversion 努力使自己尽可能的灵活。一个典型的灵活性的体现就是允许工作副本中包含有混合的修订版编号的能力。 在完成向仓库的提交之后,刚刚提交的文件和目录就拥有了最新的修订版编号,而其他文件没有。,subversion/cvs/vss比较,三、 Subversion常用功能讲解,基本术语 主要讲解SVN 客户端工具的常用命令 通过本部分的学习,可以
16、操作所有任务在日常使用subversion版本控制系统,术语,基本修订版(revision) 存储库接受的每一次修改产生新的修订版 HEAD:存储库中最新版本 BASE:工作拷贝中一个条目的修订版本号,如果这个版本在本地修改了,则“BASE版本”就是这个条目在本地未修改的版本。 分支(branches) 标记(tags) 合并(merging),Subversion客户端工具,命令行工具 通过命令行方式,主要命令包括: svn:基本svn命令 svnadmin:存储库管理 svnlook:存储库查看 TortoiseSVN 与windows资源管理器集成 subclipse 与eclipse集成,Subversion常用操作,import 将本地目录导入存储库 checkout 从存储库创建目录树的本地工作拷贝 update 将存储库中文件同步到本地工作拷贝中 commit 本地工作拷贝中文件修改提交到存储库中 add 将本地文件加入到存储库中 remove 从存储库中删除一个文件