890 likes | 1.2k Views
李树仁2007-01-19. Version Control with Subversion. 1. Subversion 简介 2、版本控制的基本知识 3、subversion 常用功能讲解 4、客户端工具 tortoiseSVN 5、 eclipse 插件 subeclipse 的使用介绍 6、使用 svn 中常见问题 7、 csdb 版本管理规则. Subversion. 一、 Subversion 简介. 版本控制是管理信息变更的一门艺术。 版本控制工具早已经成为许多程序员的主要工具之一 。
E N D
李树仁2007-01-19 Version Control with Subversion
1. Subversion简介 2、版本控制的基本知识 3、subversion常用功能讲解 4、客户端工具tortoiseSVN 5、eclipse插件subeclipse的使用介绍 6、使用svn中常见问题 7、csdb 版本管理规则 Subversion
一、Subversion简介 • 版本控制是管理信息变更的一门艺术。 • 版本控制工具早已经成为许多程序员的主要工具之一 。 • 版本控制软件的用途并不仅限于软件开发的领域 ,只要人们使用计算机来管理经常变更的信息,就需要使用版本控制工具 。 • Subversion 的一个概括性的介绍:Subversion 是什么?它用来做什么?以及如何得到它 。
什么是Subversion? • Subversion 是一个自由的、开放源码的版本控制系统 • 它可以管理各个时刻的文件和目录 。 • Subversion 将文件存放在repository库中。这个仓库非常类似于一个普通的文件服务器 ,只是它还可以记录文件和目录曾经做过的每一次变更 。 • 可把版本控制系统比作一种“时间机器” 。
什么是Subversion? • Subversion 的仓库可以通过网络来访问,允许不同的用户在不同的计算机上使用 。 • 不同的使用者可以进行协同工作 。而且所有工作都是有记录的,如果有错只要撤销就可以。 • Subversion只是版本控制系统,不是软件配置管理系统(SCM) 。 • 它是一个通道,可以管理任何计算机中的文件系统。
What is Subversion not? • svn is not a build system . • svn is not a substitute for management. • svn is not a substitute for developer . Communication. • svn does not have change control . • svn is not an automated testing program.
Subversion的历史 • CVS有明显的局限性和功能上的不足。 • 2000年开始 ,CollabNet公司 就开始着手开发新的版本控制系统来代替CVS。 • Karl Fogel 和Jim Blandy 是CVS开发者,加入到开发subversion当中。 • 他们让 Subversion 来使用 CVS 的特性,并且保留相同的开发模型 ,但是避开 CVS 的那些明显的缺陷 。 • Subversion 于2001年8月进入“自测”阶段 。
Subversion的特色 • 目录控制 • CVS 只能跟踪单个文件的历史,而Subversion 实现了一个"虚拟"的受控文件系统,可以跟踪整个目录的变更。 • 真正的版本历史 • 由于CVS 只限于记录文件的版本信息,像文件复制、重命名这样的操作它就不支持 ,在Subversion 中我们可以添加、删除、复制和重命名文件和目录 。
Subversion的特色 • 原子化提交 • 一个变更集要么完整地被提交到仓库中,要么不做任何改变 ,从而避免发生不完整地提交变更的情况 。 • 受控元数据 • 每一个文件和目录都有一个与其对应的属性集 。 • 可选的网络层 • Subversion 仓库的存取是一个抽象概念,有利于其他人实现新的网络访问机制 ,Subversion 可以作为一个外部模块插入到Apache HTTP 服务器中 。
Subversion的特色 • 一致的数据处理 • Subversion 使用一种二进制的比较算法来表示文件之间的区别 。 • 高效的分支和标记 • 分支和标记所带来的开销与项目的规模并没有直接的关系 ,Subversion 在创建分支和标记时使用类似“连接”的方式来复制项目 。 • 扩展能力 • 它是由一组设计良好的APIs实现的,包含在C 的共享库中 ,这使得它很容易维护。也很容易被其他应用程序或语言使用 。
Subversion的体系结构 • 典型的client/server模式结构 • 在系统的一端是存放着所有受控制数据的Subversion 仓库。 • 另一端是Subversion 的客户端程序,管理着受控数据的一部分在本地的映射(称为“工作副本”)。 • 在这两端之间,是通过各种仓库存取层(Repository Access,RA)的多条通道。这些通道中,有些要使用计算机网络,再通过用来访问Subversion 仓库的服务器。而有些则完全绕过了网络,直接对仓库进行操作 。
Subversion的安装 • Subversion 是建立在一个叫做APR(the Apache Portable Runtime library)的可移植运行库之上的 。 • Subversion 可以运行在任何Apache 服务器可以运行的操作系统之上:Windows、Linux,各种类型的BSD、Mac OS X,Netware 以及其他的系统。 • 获得Subversion 的最简单的方法就是下载适合于你的操作系统的二进制软件包 • Subversion 的站点(http://subversion.tigris.org) • Windows安装是图形化界面,linux安装较复杂,另有讨论。
Subversion的组件 • Svn • 一个命令行的客户端程序 • Svnversion • 报告本地工作副本状态(当前档案的修订版本号表示)的程序 • Svnadmin • 用来创建或者是修复仓库的工具 • svndumpfilter • 过滤资源库程序
Subversion的组件 • mod_dav_svn • Apache 服务器的一个插件模块,用来使其他人可以通过网络访问这个仓库 • svnserve • 一个定制的、独立的Subversion 服务程序。可作为一个驻留进程运行或者是由SSH 调用。是使仓库可以被别人通过网络访问的另一种方法 • 常用的组件是svn和svnadmin,有图形化客户端来实现svn和svnadmin功能。
Subversion的组件 • mod_dav_svn • Apache 服务器的一个插件模块,用来使其他人可以通过网络访问这个仓库 • svnserve • 一个定制的、独立的Subversion 服务程序。可作为一个驻留进程运行或者是由SSH 调用。是使仓库可以被别人通过网络访问的另一种方法 • 常用的组件是svn和svnadmin,有图形化客户端来实现svn和svnadmin功能。
Subversion快速入门 • 运行下面的例子,必须确保svn和svnadmin这两个工具正常运行。 • 同时还必须保证你的svn 工具是针对Berkeley DB 编译的 。 • 可以运行svn --version 然后检查ra_local 模块是否可用来确认 ,如果没有这个模块,我们的客户端程序将无法访问file://URLs
Subversion快速入门 • $ svnadmin create /path/to/repos • ls /path/to/repos • conf/ dav/ db/ format hooks/ locks/ README.txt • 这个命令创建了一个包含Subversion 仓库的目录 /path/to/repos 。另外,这个目录必须创建在本地磁盘,而不能是在网络共享磁盘上 • 下一步,准备一个类似下面例子中的用来导入的文件、目录树。在树结构中,应该包含三个顶层目录:branches、tags 和trunk
Subversion快速入门 /tmp/project/branches/ /tmp/project/tags/ /tmp/project/trunk/ foo.c bar.c Makefile ...
Subversion快速入门 • 一旦你准备好了目录树,就可以使用 svn import 命令来导入数据到仓库中了 • svn import /tmp/project file:///path/to/repos -m "initial import" Adding /tmp/project/branches Adding /tmp/project/tags Adding /tmp/project/trunk Adding /tmp/project/trunk/foo.c Adding /tmp/project/trunk/bar.c Adding /tmp/project/trunk/Makefile ... Committed revision 1.
Subversion快速入门 • 现在,仓库中就有了整个目录树中的数据 • 为了开始操作仓库中的数据,我们需要先创建一个数据的“工作副本(working copy)”出来 。 • 这类似于一种私有的工作区 ,向Subversion “check out”(借出)一份仓库中trunk 目录的工作副本 : • $ svn checkout file:///path/to/repos/trunk project • 在一个新的project 目录下就有了仓库中一部分数据的一个私人副本 ,可以在本地工作副本上编辑某个文件,然后再将那些修改提交到仓库中 。
二、版本控制的基本知识 • 仓库(The Repository) • 版本控制模型 • 实际工作中的subversion • subversion/cvs/vss比较
The Repository • Subversion 是一个集中式的系统。它的核心是一个用来存放数据的中心仓库。中心仓库使用典型的文件和目录层次结构――树状结构来存储信息。 • 许许多多的客户端可以连接到中心仓库,然后读取或者写入文件 。 • 客户端通过写文件来使其他人共享,也可以读取其它客户端所写入的文件。 • 典型的客户端/服务器系统模型 ,如图所示:
The Repository • 仓库就是一种文件服务器,只是不是通常的那种 。 • Subversion 仓库可以记录写入仓库的每一次更改 。 • 这些更改包括对每一个文件的每一次修改,甚至是对目录本身的修改,例如添加文件、删除文件和对文件和目录的重新编排。这些特性使得 Subversion 仓库与一般的文件服务器相比较为特殊。 • 客户端同样可以读取文件和目录以前某个时刻的状态 。 • 版本控制系统的核心:记录和跟踪数据的修改历史
版本控制模型 • 版本控制系统的核心任务是使得数据可以协作处理和共享。但是不同的系统使用不同的策略来达到这个目标 。 • 文件共享的问题 。 • “锁定―修改―解锁” 方案 • "复制―修改―合并"方案
文件共享问题 所有的版本控制系统都必须解决一个共同的基本问题:如何让用户来共享信息,并且还要避免他们不小心覆盖掉别人对仓库中数据作过的修改?
"锁定―修改―解锁" 方案 • 许多版本控制系统都使用“锁定―修改―解锁”模型来解决这个问题 ,诸如:VSS • 在这样一个系统中,仓库在一个特定的时刻只允许一个人对某个文件进行修改 。
"锁定―修改―解锁" 方案 • 这种方案的问题是它有一点过于严格了,经常会阻塞用户的使用 。 • 锁定可能会带来管理问题 。 • 锁定可能导致不必要的串行工作 。 • 锁定可能会引起潜在的不安全性 。
"复制―修改―合并"方案 • Subversion、CVS以及其他一些版本控制系统使用“复制―修改―合并”模型来代替锁定 。 • 每一个用户的客户端软件从中央仓库创建出一份个人的工作副本――仓库中文件和目录的本地映射 。 • 用户就可以并行工作,修改手中的私有副本 。 • 这些私有副本合并成为一个全新的版本 。 • 版本控制系统常常需要合并,但是最终,操作者本身必须负责让合并工作正确进行 。
冲突(conflict) • 如果Sally 的修改会覆盖掉Harry 的工作怎么办?这种情况叫做"冲突(conflict) • 当Harry 要求他的客户端软件合并仓库中的最新修改到工作副本时,文件A 被标记为冲突状态。 • 遇到这种情况,只有人本身才有能力理解和做出合理的选择 。注意,软件并不能自动解决冲突 。 • 用于解决冲突的时间远远少于锁定系统所带来的时间浪费。
解决冲突的关键是用户交流 最终,我们将所有的问题归结为一个关键因素:用户交流。如果用户很少交流,不论是语法的还是语义的冲突都会增加。没有哪个系统可以让用户完美地交流,也没有哪个系统可以自动检查出语义上的冲突。所以,不要被那种锁定系统可以解决冲突的虚假承诺所麻痹,事实上,锁定系统除了限制生产力之外一无是处。
实际中的Subversion • 工作副本Working Copies • 资源库存储的不同方式URLs • 修订本 • 工作副本如何跟踪仓库 • 混合型修订版的局限性
工作副本Working Copies • 一个Subversion 的工作副本其实就是本地系统中的一个普通的文件目录树 。 • 可以使用任何方式来编辑这些文件。如果是源代码文件的话,你也可以像通常情况那样去编译它们。 • 工作副本是你的私人工作区 。 • 如果你不明确的要求,Subversion 绝不会合并其他人的修改,也不会让其他人看到你做的修改 。
工作副本Working Copies • 在你已经修改完工作副本中的文件,并且确信修改正确后,就可以将这些修改公开给同一个项目中的其他工作人员。Subversion 提供了将文件写入仓库的命令 。 • 工作副本中也包含一些额外的文件。它们是由Subversion 创建和维护的,用来辅助完成这些命令。 • 最典型的情况是,每一个目录都包含一个叫做 .svn 的子目录。该目录也被称为“工作副本管理目录”。 • 一个Subversion 的仓库会包含几个项目,而每一个项目都是仓库的目录的一个子目录。这样,用户的工作副本也就对应于仓库中一个特定的子目录。
资源库存储的不同方式URLs 样式 存取方式 file:/// 直接从本地磁盘上访问仓库 http:// 通过 WebDAV 协议访问 Apache 服务器,而访问仓库 https:// 和 http:// 相同,但使用 SSL 来作加密 svn:// 通过自定义的协议访问一个 svnserve 服务器 svn+ssh:// 和 svn:// 相同,但通过一个 SSH 通道来使用
修订本 • 一个svn commit 操作可以将任意数量的文件和目录的修改发布作为一个单独的原子事务来处理 。 • 在仓库中,每一次提交都被作为一个原子事务来对待 。 • 每当仓库接受一次提交,仓库中的文件系统目录都会创建一种新的状态,叫做一个修订本。 • 每一个修订本都被赋予一个唯一的自然数,并且每一个修订本的数字都比前一个要大。刚刚建立的仓库的初始的版本是 0 ,只包含一个空的根目录。 • Subversion 的修订版编号是针对整个目录树的,而不是某一个独立的文件 。 • 如图所示:
修订本 设想一个修订版编号的数列,从 0 开始,从左延伸到右。每一个修订版编号都对应一个画下面的目录树,而每一个目录树就是在每一次提交之后的仓库的"快照"。
混合型修订版 • 一般的原则上,Subversion 努力使自己尽可能的灵活。一个典型的灵活性的体现就是允许工作副本中包含有混合的修订版编号的能力。 • 在完成向仓库的提交之后,刚刚提交的文件和目录就拥有了最新的修订版编号,而其他文件没有。
三、Subversion之 旅 • 基本术语 • 主要讲解SVN 客户端工具的常用命令 • 通过本部分的学习,可以操作所有任务在日常使用subversion版本控制系统
术语 • 修订版(revision) • 存储库接受的每一次修改产生新的修订版 • HEAD:存储库中最新版本 • BASE: • 分支(branches) • 标记(tags) • 合并(merging)
Subversion客户端工具 • 命令行工具 • 通过命令行方式,主要命令包括: • svn:基本svn命令 • svnadmin:存储库管理 • svnlook:存储库查看 • TortoiseSVN • 与windows资源管理器集成 • subclipse • 与eclipse集成
Subversion常用操作 • import • 将本地目录导入存储库 • checkout • 从存储库创建目录树的本地工作拷贝 • update • 将存储库中文件同步到本地工作拷贝中 • commit • 本地工作拷贝中文件修改提交到存储库中 • add • 将本地文件加入到存储库中 • remove • 从存储库中删除一个文件 (保留历史记录). • move • 在存储库中讲一个文件移到另一个位置
Subversion推荐目录结构 • 存储库 • 项目名 • trunk:主版本 • branches:分支版本(独立版本) • tags:标记版本,比如发行版 v 1.0/ v 2.0等等
Svn常用命令介绍 • Help • Import • Checkout • Update your working copy • Svn update • Make changes • add • delete • copy • move