Subversion,简称SVN,是一个开放源代码的版本控制系统,相对于的RCS、CVS,采用了分支管理系统,它的设计目标就是取代CVS。互联网上越来越多的控制服务从CVS转移到Subversion。网络上关于Subversion的介绍非常多,我这里也没必要重复了,就以常用的命令做个简单说明吧。
一、Subversion的结构
Subversion的官方网站是:http://subversion.tigris.org/
另外,还有中文的介绍网站:Subversion中文站、SVNBook
正體中文版、Subversion中文社区、中文SVN技术资料。
这些网站都提供了非常详细、多样的说明文档,有时间大家可以逐一细查。
Subversion使用服务端—客户端的结构,当然服务端与客户端可以都运行在同一台服务器上。在服务端是存放着所有受控制数据的Subversion仓库,另一端是Subversion的客户端程序,管理着受控数据的一部分在本地的映射(称为“工作副本”)。在这两端之间,是通过各种仓库存取层(Repository
Access,简称RA)的多条通道进行访问的。这些通道中,可以通过不同的网络协议,例如HTTP、SSH等,或本地文件的方式来对仓库进行操作。
Subversion 是一种开放源码的全新版本控制系统,支持可在本地访问或通过网络访问的数据库和文件系统存储库。不但提供了常见的比较、修补、标记、提交、回复和分支功能性,Subversion
还增加了追踪移动和删除的能力。此外,它支持非 ASCII 文本和二进制数据,所有这一切都使 Subversion
不仅对传统的编程任务非常有用,同时也适于 Web 开发、图书创作和其他在传统方式下未采纳版本控制功能的领域。
二、安装
1、版本
通常,大部分的发行版都已经提供Subversion套件(很多项目本身就是基于SVN提供的)。可以通过下面的命令进行确认:
引用
# rpm -qa|grep subversion
subversion-devel-1.4.2-2.1AX
subversion-ruby-1.4.2-2.1AX
subversion-perl-1.4.2-2.1AX
subversion-javahl-1.4.2-2.1AX
subversion-1.4.2-2.1AX
2、组件
一旦Subversion成功安装,其会提供一些可用的工具:
引用
svn 一个命令行式的客户端程序;
svnversion 报告本地工作副本状态(即当前文档的修订版本号)的程序;
svnadmin 用来创建、调整或修复仓库的工具;
svndumpfilter 用于过滤仓库中的数据;
mod_dav_svn Apache服务器的一个插件模块,用于使其他人可以通过网络访问该仓库;
snvserve 一个定制的、独立的Subversion服务程序,可以作为一个驻留进程或通过ssh调用,以便他人可以通过其访问仓库。
当然,还有很多第三方的Subversion插件,通过调用相关的接口以提供更好的管理方式,例如GUI、Web等。但svn命令工具是最基础的控制方式。
三、基本使用
1、创建仓库(Repository)
仓库是今后项目文件存放的路径,一般位于远端服务器上,在远端服务器上运行。但也可以安装在本地,并通过后续的svn工具使用file:///的方式访问:
$ svnadmin create /svn
2、导入现有项目
假设有一个项目,其架构如下:
引用
# pwd
/tmp/test
# tree
.
`-- project1
|-- dir1
`-- file1
通过svn的import方式,就可以把现有的项目结构及文件导入仓库中:
$ svn import /tmp/test/project1 file:///svn/
-m "初始化"
这样,会把/tmp/test/project1作为根目录,把其下的目录和文件放入Repository的根目录中。
使用list,可显示Repository的内容:
引用
# svn list file:///svn
dir1/
file1
如果希望把project1也作为目录放入Repository,应该使用上一层的父目录,即/tmp/test。
# svn import /tmp/test file:///svn/
-m '初始化'
或者这样写:
# svn import /tmp/test/project1 file:///svn/project1
-m '初始化'
※ 反正,对于一个项目而言,import的工作通常只进行一次,然后是在该基础上进行添加、调整、删除等工作。
可以通过export一个SVN_EDITOR变量,当进行commit等更新、提交工作时,作为输入-m (messages)信息的编辑器:
# export SVN_EDITOR="/bin/vi"
3、客户端Checkout(借出)
也就是从Repository中拿出一个修订版到客户端指定的目录中,相当于拷贝:
引用
# svn checkout file:///svn/project
A project/dir1
A project/file1
Repository中的路径需要使用绝对路径,Checkout的工作可以进行多次,对已经Checkout出来的目录或文件进行修改,然后再次Checkout,不会改变(覆盖)已经修改或添加的文件的。
Checkout 默认使用最新的修订版,可以使用-r 指定从哪个修订版中拿出文件:
引用
# svn checkout -r 8 file:///svn
A svn/project
A svn/project/dir1
A svn/project/file1
A svn/project1
A svn/project1/dir1
A svn/project1/file1
取出修订版 8。
4、修订版本
修订命令,分PATH和URL两种模式,请留意最后“注意事项”中的说明
每次提交都会创建一个新的修订版本,这可能是因为包括删除、更新、添加等工作创建的: ◎
删除
引用
# svn delete file:///svn/file1
-m 'clear'
提交后的修订版为 5。
# svn delete file:///svn/dir1 -m 'clear'
提交后的修订版为 6。
◎ 添加
通过add方式,往仓库中添加文件:
引用
# svn add project/dir1/*
A (bin) project/dir1/rflicense-3.0-13.i386.rpm
A 表示状态为添加。但该动作不会马上进行数据传输,直到运行调度方式,则它们才会“真正”的加入仓库中,并创建一个新的修订版:
引用
# svn commit -m "update
2" project/
新增 (二进制) project/dir1/rflicense-3.0-13.i386.rpm
传输文件数据.
提交后的修订版为 11。
※ 可以在add与commit之间做个Checkout动作的对比,以理解该意思。注意对比后面“注意事项”中提到的PATH和URL两种模式的不同
◎ 更新(还原)
把项目中的文件更新(或还原)到某个版本
引用
# svn update -r 9 project/
D project/dir1/rflicense-3.0-13.i386.rpm
U project/file1
更新至修订版 9。
如果不指定-r,就是更新到最新版本。
注意,该操作只会影响已经加入仓库的目录或文件,但还没有加入或提交到仓库的文件,则完全不会收到影响的。因为这些目录或文件根本不受svn的控制。
※ 总的来说就是,如果你对项目中的目录或文件进行了添加或删除的动作,那么,应该即使用add/delete/update方式加入仓库,然后commit提交。这样,才能真正控制相关的文件。否则,两次提交之前的目录和文件是不受仓库控制的。
5、对比
可通过diff方式,为当前项目文件与仓库中指定的修订版,或在仓库中不同修订版之间进行对比:
(不输入目标目录时,为对比当前目录。要执行svn操作的目录下,应该有.svn目录)
引用
# svn diff project/
Index: project/file1
===================================
--- project/file1
(修订版 9)
+++ project/file1
(工作拷贝)
@@ -1 +1,2 @@
2009-02-19 20:30:00
+2009-02-19 22:00:21
指定-r 参数可控制仓库中对比的版本:
# svn diff -r 9 project/file1
Index: project/file1
====================================
--- project/file1
(修订版 9)
+++ project/file1
(工作拷贝)
@@ -1 +1,2 @@
2009-02-19 20:30:00
+2009-02-19 22:00:21 参数支持,-r
m:n(对版本m和版本n比较差异)
引用
# svn diff -r 9:10 project/file1
Index: project/file1
====================================
--- project/file1
(修订版 9)
+++ project/file1
(修订版 10)
@@ -1 +1,2 @@
2009-02-19 20:30:00
+2009-02-19 22:00:21
※ 注意,但二进制文件无法对比文件内容的。
引用
# svn diff -r 9
Index: dir1/rflicense-3.0-13.i386.rpm
====================================
无法显示:文件标记为二进制类型。
svn:mime-type = application/octet-stream
属性改变于:dir1/rflicense-3.0-13.i386.rpm
_______________________________________________
名字:svn:mime-type
+ application/octet-stream
Index: file1
=====================================
--- file1 (修订版
9)
+++ file1 (工作拷贝)
@@ -1 +1,3 @@
2009-02-19 20:30:00
+2009-02-19 22:00:21
+2009-02-19 22:24:52
6、查看文件的详细内容
引用
# svn info project/
路径:project
地址(URL):file:///svn/project
Repository Root: file:///svn
档案库 UUID:db1eab10-20c7-4639-89d5-c183b2e03bfa
修订版:11
节点种类:目录
调度:正常
最后修改的作者:root
最后修改的修订版:11
最后修改的时间: 2009-02-19 22:10:57 +0800 (四, 19 2月
2009)
7、查看日志
引用
# svn log project/
------------------------------------------------------------------------
r11 | root | 2009-02-19 22:10:57 +0800 (四, 19 2月
2009) | 1 line
update 2
------------------------------------------------------------------------
r10 | root | 2009-02-19 22:05:58 +0800 (四, 19 2月
2009) | 1 line
add new files
------------------------------------------------------------------------
r8 | root | 2009-02-19 21:52:21 +0800 (四, 19 2月
2009) | 1 line
初始化
------------------------------------------------------------------------
8、查看状态
当前项目与档案库中目录或文件对比的状态:
引用
# svn status
# echo 'Testing' > file3
# svn status
? file3
# svn add *
svn: 警告:“dir1”已纳入版本控制
svn: 警告:“dir2”已纳入版本控制
A
file3
[root@asianux3 project]# svn status
A file3
9、撤销
撤销指定修改的文件:
引用
# rm file2
rm:是否删除 一般文件 “file2”? y
# svn revert file2
已恢复“file2”
如果不是删除file2,而是修改其内容的话,也可以试试 svn revert * 。
10、SVN 帮助
svn help
svn help commit (获得某个指定文件的帮助)
四、注意事项
关于PATH和URL两种模式
以svn mkdir为例,支持两种写法:
svn mkdir: 创建纳入版本控制下的新目录。
用法: 1、mkdir PATH...
2、mkdir URL...
创建版本控制的目录。
引用
1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。
2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
※ 在这两个情况下,所有的中间目录都必须事先存在。
也就是话:
a、第一种写法,会马上在当前项目中创建对应的目录,但不会马上加入档案库中,而是加入调度,等待下一次的提交;
引用
# svn mkdir dir3
A
dir3
# ll
总计 28
drwxr-xr-x 3 root root 4096 02-19 22:16 dir1
drwxr-xr-x 3 root root 4096 02-19 22:30 dir2
drwxr-xr-x 3 root root 4096 02-19 22:36 dir3
-rw-r--r-- 1 root root 60 02-19 22:30
file1
-rw-r--r-- 1 root root 14 02-19 22:30
file2
# svn commit -m "update 4"
新增
dir3
提交后的修订版为 14。
b、而第二种写法,则需要定义-m参数,然后马上提交到档案库,相反,当前项目中不会建立该目录。
#
引用
svn mkdir file:///svn/project/dir4
-m "update 5"
提交后的修订版为 15。
[root@asianux3 project]# ll
总计 20
drwxr-xr-x 3 root root 4096 02-19 22:16 dir1
drwxr-xr-x 3 root root 4096 02-19 22:30 dir2
drwxr-xr-x 3 root root 4096 02-19 22:36 dir3
-rw-r--r-- 1 root root 60 02-19 22:30
file1
-rw-r--r-- 1 root root 14 02-19 22:30
file2
同样的,svn delete命令也是相同的。删除一个本地文件的做法是:
引用
# rm file3
rm:是否删除 一般文件 “file3”? y
# svn delete file3
D
file3
# svn commit -m "update 7"
※ 这两种方法其实不难明白,实际上,可理解为,只要已经归入SVN管理(也就是拥有正确的.svn目录)的项目。那么svn可以对本地、远端分别进行管理,PATH就是本地方式、URL就是远端方式。
试对比下面两个命令的结果:
# svn list (这需要在一个被Checkout出来的目录中运行)
# svn list file:///svn/project
如果该项目在Checkout出来后内容发生了改变,则两个命令的结果是不相同的。
五、参考文档
Subversion 简介
svn命令行
svn命令在linux下的使用 ※
提供一份Subversion Check Sheet
下载文件
(资料来自:
Added Bytes)
六、TortoiseSVN
简介
TortoiseSVN是Subversion版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。TortoiseSVN与Windows外壳(例如资源管理器)无缝集成,你可以保持在熟悉的工具上工作,不需要在每次使用版本控制功能时切换应用程序。
并且你不一定必须使用Windows资源管理器,TortoiseSVN的右键菜单可以工作在其他文件管理器,以及文件/打开对话框等标准的Windows应用程序中。
官方网站:http://tortoisesvn.tigris.org/
TortoiseSVN 的历史,Tortoise默认界面为中文,但可以从官网上下载中文语言包,然后在“setting”中设置即可。
与资源管理器集成的使用界面:
自带的版本库浏览器:
|