Subversion的安装与简单使用
 

2009-03-13 作者:Aaron Wong 来源:Aaron Wong的blog

 

0 前言

Subversion是一个免费的开源的版本管理系统,它是作为CVS(Concurrent Versions System)的取代品出现的。本文简单介绍了Subversion在Fedora上的安装过程及其基本概念和使用方法。您可以到O'Reilly出版的开源书籍Version Control with Subversion的主页在线阅读(中、英文版本都有),以获取更多信息。

1 在Fedora上安装Subversion

[aaronwong@localhost ~]$ sudo yum -y install subversion
[aaronwong@localhost ~]$ rpm -ql subversion
//上面的命令可查询subversion软件包在系统上所安装的文件列表
[aaronwong@localhost ~]$ sudo yum -y install mod_dav_svn
//mod_dav_svn不是必须安装的,它是Apache HTTP Server的一个插件,你本地仓库(repository)的文件必须通过它才能在网络上与别人共享。
//subversion的组件列表点此查看。

[aaronwong@localhost ~]$ svn --version
svn,版本 1.4.3 (r23084)
   编译于 Mar 23 2007,09:29:55

版权所有 (C) 2000-2007 CollabNet。
Subversion 是开放源代码软件,请参阅 http://subversion.tigris.org/
此产品包含由 CollabNet (http://www.Collab.Net/)开发的软件。

可使用以下的仓库存取 (RA) 模块:

* ra_dav : 通过WebDAV(DeltaV)协议访问仓库的模块。
  - 处理“http”方案
  - 处理“https”方案
* ra_svn : 使用svn网络协议访问仓库的模块。
  - 处理“svn”方案
* ra_local : 访问本地磁盘的仓库模块。
  - 处理“file”方案
 

2 使用Subversion管理本地project

作为程序开发人员,我们没有必要了解Subversion的所有特性的方方面面,我们的目的是使用它来对我们的project进行方便的简单的版本管理,因此,强烈推荐阅读Subversion Quick-Start GuidBasic Usage

以下是笔者参照上述Guide进行一个简单的本地project的版本管理的示例。假定工程名为hello。

(1)建立本地工程hello的subversion仓库

Subversion把工程的各个版本的数据集中放在一个仓库(repository)中。假定我们要建立一个本地工程,叫做hello,为了使用subversion对它进行版本管理,首先要为该工程建立一个仓库。

[aaronwong@localhost ~]$ svnadmin create .subversion/repos/hello
//subversion安装后会生成一个~/.subversion目录,这里,我们将工程hello的数据仓库建立在~/.subversion/repos/hello目录。

[aaronwong@localhost ~]$ ls -p .subversion/repos/hello/
conf/  dav/  db/  format  hooks/  locks/  README.txt
 

(2)按照subversion的要求组建本地工程hello的工作目录

假定工程hello的顶层目录为~/projects/hello(这里~代表/home/aaronwong/),则应如下组建工程的工作目录:

~/projects/hello/branches
~/projects/hello/tags
~/projects/hello/trunk/
                       hello.c
 
//trunk目录是实际上的工程顶层目录,工程中的所有文件和文件夹都在该目录下组织。
[aaronwong@localhost ~]$ cd projects/hello/
[aaronwong@localhost hello]$ ls -p
branches/  tags/  trunk/
[aaronwong@localhost hello]$ cat trunk/hello.c
//This is a original version.

#include <stdio.h>

int main()
{
        printf("Hello world!\n");

}
 

(3)将本地工程hello导入本地的Subversion的工程仓库

由于是首次导入,因此要加信息-m "initial import"。

[aaronwong@localhost trunk]$ svn import ~/projects/hello/ file:///home/aaronwong/.subversion/repos/hello/ -m "initial improt"
新增           /home/aaronwong/projects/hello/trunk
新增           /home/aaronwong/projects/hello/trunk/hello.c
新增           /home/aaronwong/projects/hello/branches
新增           /home/aaronwong/projects/hello/tags

提交后的版本为 1。
 

注意,完成导入后,原目录~/projects/hello并不转换为“工作副本(working copy)”,而且该项目已经转由该仓库接管,即该仓库中已经包含了首次导入的工程的所有信息,与源目录~/project/hello再无任何关系,我们完全可以删除这一目录而不必担心丢失工程项目数据。注意,如果源目录并不是一个“工作副本”,那么就无法用svn进行管理,在其中所作的任何变动都无法提交到仓库。

要用subversion对工程进行版本管理,那么工程项目的开发必须在一个“工作副本”中进行,即首先要从仓库获取一个“工作副本”。  

(4)工程开发过程中的版本管理与控制

使用subversion对工程进行版本管理的一般流程如下:

a)建立工程的数据仓库,并导入工程的最初版本(前面已经完成);

b)从仓库获取一个“工作副本”(svn checkout,可以获取最新版本也可以获取以前的某个版本),在这个“工作副本”中进行工程开发,修改完毕将变动提交到仓库。

下面简单介绍b)步骤。

由于工程hello已经导入到仓库,因此原目录可以删除。我们删除原目录,并从仓库获取工程hello的一个“工作副本”(working copy);当然,如果你当心这样做会造成数据丢失,完全可以重新建立一个目录,将“工作副本”保存到那里。

[aaronwong@localhost projects]$ rm -rf hello/
[aaronwong@localhost projects]$ svn checkout file:///home/aaronwong/.subversion/repos/hello/trunk hello
A    hello/hello.c
取出版本 1。
//注意,我们用红色标出了"trunk",如果不指定这一目录,则会取出除工程源文件外的其他不必要的目录如branches和tags。
[aaronwong@localhost projects]$ ls -a hello/
.  ..  hello.c  .svn
//可以看到“工作副本”下有一个.svn隐藏目录,其中就包含了subversion用來进行版本管理的信息。
 

下面可以对工程hello的内容进行编辑和修改。注意,如果要在工程中增加或删除某一文件或目录(包括复制和移动),必须使用svn add/delete/mkdir/copy/move等相关命令进行标记。

[aaronwong@localhost hello]$ pwd
/home/aaronwong/projects/hello
[aaronwong@localhost hello]$ vim hello.c

[aaronwong@localhost hello]$ cat hello.c
//This is the second version.

#include <stdio.h>

int main()
{
        printf("Hello world!\n");
        return;
}
[aaronwong@localhost hello]$ mkdir doc
[aaronwong@localhost hello]$ vim doc/readme.txt
[aaronwong@localhost hello]$ svn add doc
A         doc
A         doc/readme.txt
//说明:如果svn add的对象是一个目录,则该目录及其子目录和其下的文件都会被添加到工程。
 

对工程编辑完毕,你可以检查一下该次编辑对工程(实际上是对你的"工作副本")做了哪些改动。

[aaronwong@localhost hello]$ svn status
M      hello.c
A      doc
A      doc/readme.txt
[aaronwong@localhost hello]$ svn diff
Index: hello.c
===================================================================
--- hello.c     (版本 1)
+++ hello.c     (工作副本)
@@ -1,10 +1,10 @@
-//This is a original version.
+//This is the second version.
 
 #include <stdio.h>
 
 int main()
 {
         printf("Hello world!\n");
-
+       return;
 }
 
Index: doc/readme.txt
===================================================================
--- doc/readme.txt      (版本 0)
+++ doc/readme.txt      (版本 0)
@@ -0,0 +1,2 @@
+This is an example for subversion tutorial.
+
//可以看到,svn diff提供了更详细的改动信息,并且很容易的将该命令的输出重定向为一个patch补丁。
 

检查确认无误后,便可提交此次更改,同时要附加此次更改的说明注释信息。

[aaronwong@localhost hello]$ svn commit -m "documents added."
新增           doc
新增           doc/readme.txt
正在发送        hello.c
传输文件数据..
提交后的版本为 2。
 

现在工程仓库中已经保存了上面所提交的版本2的工程的所有信息,因此,上面的“工作副本”也可以被删除:当然,如果下次你还要继续使用这个“工作副本”进行工作,则可以保留这个副本,不过需要注意的是,如果你是在一个开发团队中,开发团队的任一成员都可能在你不知情的情况下更新了工程版本,因此,在团队开发中,进入已有的“工作副本”进行编辑前,应该先使用"svn update"命令将当前“工作副本”更新到仓库中的最新版本。

3 使用svn获取开源项目源代码

这实际上是获取一个“工作副本”的过程。例如我需要下载ffmpeg的最新源代码,就可以使用svn checkout命令来完成:

[aaronwong@localhost ~]$ svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
A    ffmpeg/configure
A    ffmpeg/Doxyfile
A    ffmpeg/ffmpeg.c
A    ffmpeg/vhook
A    ffmpeg/vhook/imlib2.c
A    ffmpeg/vhook/drawtext.c
A    ffmpeg/vhook/fish.c
A    ffmpeg/vhook/null.c
......
 

火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织