Subversion版本控制(3)—基本概念续

一、Subversion Repositories

    subversion版本控制仓库(Repository)与其他版本控制系统并无区别。与工作副本不同之处在于,subversion repository是个抽象的实体,能够被subversion自己的工具和库几乎专有的操作。许多用户与subversion的交互都是基于工作副本,因此后续会着重介绍subversion中工作副本的操作。


二、Revisions

    subversion客户端提交(commit)任意数目的文档和目录都是基于单独的原子事务操作。简而言之,要么就是版本库接受了所有的修改操作,要么就不接受任何的修改。subversion针对程序崩溃和系统崩溃尽量保持原子性。
    每次版本库接收到一个commit命令,就会对文件系统树创建一个新的状态,这个新的状态称之为revision。每个revision都被赋予一个唯一的自然数表示,后续的revision数字比前面的revision数字要大。一个新创建的repository的revision值为0,而且除了一个空的根目录外不包含其他任何东西。
    如下图所示,想象一个revision由数字组成的数组,从0开始计数,从左向右扩展。每个revision下面有一棵文件系统树,每棵文件系统树是版本库在接收到commit命令后的一个快照。
    
          图1 随时间改变的文件系统树

三、访问版本库

    访问版本库有不同的方式,subversion客户端程序通常通过URL去访问版本库。通常情况下,版本库的URL是标准的格式,如同网页一样。如下面所示:
  • http://svn.example.com/svn/project
  • http://svn.example.com:9834/repos
    由于subversion为客户端和服务器端交互提供了多种方式,因此subversion版本库的URL不仅仅局限于http://这种格式,还有其他的格式,如下表所示:

表1  subversion版本库访问方式    
Schema Access method
file:/// Direct repository access (on local disk)
http:// Access via WebDAV protocol to Subversion-aware Apache server
https:// Same as http://, but with SSL encryption
svn:// Access via custom protocol to an svnserve server
svn+ssh:// Same as svn://, but through an SSH tunnel
    subversion处理URL有些值得注意的地方。例如包含file://存取方法的URL(本地版本库)必须是下面两种之一:
  • file:///var/svn/repos
  • file://localhost/var/svn/repos

四、subversion的工作副本  

   一个subversion的工作副本是你的本地系统的普通的目录树,包含一批文件的集合。你可以随意编辑修改这些文件。工作副本是你的私人地盘,在你显示的commit之前,你的工作副本中不会融入其他人的修改,你对工作副本的修改对其他人也不可见。 当然,subversion提供了一系列的操作供你提交你的修改到版本库中,如果其他人已经提交了修改,则如前一篇文章中提到的,需要使用merge操作来写入你的修改到版本库中。此外,工作副本中还包含额外的一些文件,这些额外文件由subversion创建和维护。例如在每个工作副本目录下面都有一个.svn子目录,这是工作副本的管理目录。这个目录中的文件帮助subversion确认哪些版本文件的修改没有提交,哪些文件过时了等等。 


五、工作副本的工作机制

    对于工作目录下面的每个文件,subversion都会记录两个重要信息:
  • 工作文件基于哪一个revision
  • 本地副本最后从版本库更新的时间戳记录
   在subversion中一个工作文件有如下四种状态:

   1)没有修改,且没有过时

   文件没有修改,且从上次更新后版本库没有修改,则svn commit命令和svn update命令都不用做任何事情。

   2)本地修改,且没有过时

   工作目录中修改了该文件,且从上次更新后版本库没有修改,则svn commit命令则会写入该修改的内容,而svn update命令不做任何事情。

   3)没有修改,且过时

   文件没有修改,但是版本库中文件已经修改,本地文件已经过时。svn commit命令不做任何事情,svn update则将最新的修改加入到工作副本中。

   4)本地修改,且过时

   工作目录中修改了该文件,而且版本库中文件从上次更新后也做了修改,即本地工作副本已经过时。这时则如果有冲突,则需要进行merge操作。

六、工作副本基本交互

   一个subversion版本库中通常存储多个项目的文档和源码,每个项目在版本库中都存在于一个子目录中。如下图所示,这是一个subversion的文件系统示意图。

   要想得到一个工作副本,需要使用svn checkout命令导出版本库中的文件系统树的子树。例如我们要导出/calc,我们将输入下面的命令:
$ svn checkout http://svn.example.com/repos/calc
A    calc/Makefile
A    calc/integer.c
A    calc/button.c
Checked out revision 56.
$ ls -A calc
Makefile  button.c integer.c .svn/
$
   要将修改提交到版本库,则使用svn commit命令。如下所示,更改了button.c文件并提交到版本库中。此后,如果有用户checkout这个/calc的工作副本,将看到你的修改。
$ svn commit button.c -m "Fixed a typo in button.c."
Sending        button.c
Transmitting file data .
Committed revision 57.
$
   如果项目有多人合作开发,则如果有其他人Sally与你同一时刻checkout出工作副本,则你对button.c做的修改不能为Sally所知晓,则为了保证自己工作副本保持最新,Sally可以使用svn update命令更新自己的工作副本。
$ pwd
/home/sally/calc
$ ls -A
Makefile button.c integer.c .svn/
$ svn update
Updating '.':
U    button.c
Updated to revision 57.
$

七、混合版本的工作副本

      在实际使用中,常常遇到混合版本的情况。假定我们从版本库中checkout出一个项目版本,如下:

calc/
   Makefile:4
   integer.c:4
   button.c:4

   我们修改button.c文件,并用commit命令提交修改,则此时会变成:

calc/
   Makefile:4
   integer.c:4
   button.c:5

  假定这个时候,另一个合作者Sally修改了文件integer.c并提交生成版本6。则我们使用svn update命令保持我们的工作副本为最新的,则工作副本版本如下:

calc/
   Makefile:6
   integer.c:6
   button.c:6

  特别需要注意的一点是,subversion中commit和update是分开的。







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值