Subversion是新一代的开源版本控制系统,用以取代CVS。有关Subversion最详尽的资料就是官方的
Subversion Book了。它是由开源社区编写的自由图书,已通过O'Reilly Media出版。下面简单介绍一下Subversion在Debian下的安装和配置过程。
1.安装
debian:/# aptitude install subversion subversion-tools apache2 libapache2-svn
2.创建一个新的空的版本库:
debian:/# mkdir -p /home/svn/lxq
debian:/# svnadmin create /home/svn/lxq #版本名称
lxq
在/home/svn/lxq 此路径上创建一个新的空的版本库,如果提供的路径不存在,它会为你创建。数据储存方式默认采用Berkeley DB。
3.修改apache的svn设定文档:/etc/apache2/mods-available/dav_svn.conf
配置文件位于/etc/apache2/mods-enabled/目录下,配置文件共有两个,分别是dav_svn.conf和dav_svn.load.
dav_svn.load文件负责装载必要的模块,内容如下:
# Depends: dav
LoadModule dav_svn_module /usr/lib/apache2/modules/mod_dav_svn.so
LoadModule authz_svn_module /usr/lib/apache2/modules/mod_authz_svn.so
在装载mod_dav_svn.so前,必须先装载mod_dav.so模块。它由dav.load文件控制,内容如下:
LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so
dav_svn.conf是mod_dav_svn.so模块的配置文件,内容如下:
# dav_svn.conf - Example Subversion/Apache configuration
#
# For details and further options see the Apache user manual and
# the Subversion book.
#
# NOTE: for a setup with multiple vhosts, you will want to do this
# configuration in /etc/apache2/sites-available/*, not here.
# <Location URL> ... </Location>
# URL controls how the repository appears to the outside world.
# In this example clients access the repository as http://hostname/svn/
# Note, a literal /svn should NOT exist in your document root.
<Location /svn> #设置访问路径
# Uncomment this to enable the repository,
DAV svn #启用
# Set this to the path to your repository
SVNPath /home/svn #设置版本存储库路径,仅支持单个储存库,该路径要可被Apache进程访问。
# Alternatively, use SVNParentPath if you have multiple repositories under
# under a single directory (/var/lib/svn/repo1, /var/lib/svn/repo2, ...).
# You need either SVNPath and SVNParentPath, but not both.
#SVNParentPath /data/subversion #如果subversion下有多个储存库,则用SVNParentPath
# Access control is done at 3 levels: (1) Apache authentication, via
# any of several methods. A "Basic Auth" section is commented out
# below. (2) Apache <Limit> and <LimitExcept>, also commented out
# below. (3) mod_authz_svn is a svn-specific authorization module
# which offers fine-grained read/write access control for paths
# within a repository. (The first two layers are coarse-grained; you
# can only enable/disable access to an entire repository.) Note that
# mod_authz_svn is noticeably slower than the other two layers, so if
# you don't need the fine-grained control, don't configure it.
# Basic Authentication is repository-wide. It is not secure unless
# you are using https. See the 'htpasswd' command to create and
# manage the password file - and the documentation for the
# 'auth_basic' and 'authn_file' modules, which you will need for this
# (enable them with 'a2enmod').
AuthType Basic #启用Apache基础验证
AuthName "Subversion Repository" #设置验证框标题
AuthUserFile /etc/apache2/dav_svn.passwd #指定验证用户文件名
# To enable authorization via mod_authz_svn
# AuthzSVNAccessFile /etc/apache2/dav_svn.authz #启用目录级别授权,dav_svn.authz是
授权配置文档
# The following three lines allow anonymous read, but make
# committers authenticate themselves. It requires the 'authz_user'
# module (enable it with 'a2enmod').
<LimitExcept GET PROPFIND OPTIONS REPORT> #允许匿名访问,不允许Commit,不能
与AuthzSVNAccessFile同时使用
Require valid-user
</LimitExcept>
</Location>
4.更改该目录的拥有者为网页读取
修改/目录访问权限使它可被Apache进程访问,我的Apache是用www-data启动的,所以设置方法如下:
debian:/# chown -R www-data.www-data /home/svn/lxq
5.设定使用人的权限:修改/etc/apache2/dav_svn.authz
通过Apache的用户验证功能可以区别匿名用户和验证用户,从而赋予匿名用户读权限和验证用户读/写的权限。这些权限只能在全局范围内设置,不能设置具体的某个目录是否能被某个用户操作。要实现目录级别的授权,就要使用mod_authz_svn.so模块提供的AuthzSVNAccessFile指令。它会指定一个授权文档,该授权文档设置具体的目录权限。根据上面的配置,授权文档名叫dav_svn.authz,它的内容如下:
[groups] #定义组
admin=lxq001,lxq007
tests=test1,test2
[lxq:/] #定义lxq版本库根目录的访问权限
@admin=rw #admin组有读写权限
tests=r #test用户只有读权限
[lxq:/test] #定义oa版本库下test目录的访问权限
*= #禁止所有用户访问,星号代表所有用户,权限为空代表没有任何权限
lxq=rw #打开lxq001用户的读写权限
6.增加apache连接进来的使用者帐号 /etc/apache2/dev_svn.passwd
debian:/# htpasswd -c /etc/apache2/dav_svn.passwd lixueq
New password:
Re-type new password:
Adding password for user lixueq
debian:/# htpasswd -c /etc/apache2/dev_svn.passwd test1
7.重启apache2
在/etc/apache2/sites-available/default中添加:
<Location /svn>
DAV svn
SVNListParentPath on
SVNParentPath /home/svn
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
=========================================================
<Location /svn>
DAV svn
# SVNListParentPath on
SVNParentPath /home/svn
#SVNPath /home/svn
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
AuthzSVNAccessFile /etc/apache2/dav_svn.authz
</Location>
</VirtualHost>
然后重启apache2
debian:/# nano /etc/init.d/apache2 restart
8.导入你的源码:
debian:/# svn import /var/www/web1 file:///home/svn/lxq
9.显示储存库内容:
debian:/# svn list file:///home/svn/lxq
index.php
a.php
显示web1目录内容,成功导入。
使用svn://访问,需开启此服务:
debian:/# svnserve -d -r /home/svn/lxq/
上面我使用了file:///形式的URL来访问Subversion库,这表示在本地通过文件系统访问。但我们的Subversion库可能需要通过网络被其它用户访问,这就需要用到其它的协议,下表是Subversion支持的各种访问协议:
Table 访问协议
协议 |
访问方法 |
file:/// |
通过本地磁盘访问。 |
http:// |
与Apache组合,通过WebDAV协议访问。 |
https:// |
同上,但支持SSL协议加密连接。 |
svn:// |
通过svnserve服务自定义的协议访问。 |
svn+ssh:// |
同上,但通过SSH协议加密连接。 |