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 Guid和Basic
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
......
|
|