跳到主要内容

CentOS用yum安装SVN

· 阅读需 6 分钟
Random Image
图片与正文无关

源代码管理目前的市场上 Git 主键主流,SVN 也仍然有大把的人用,其他也有一些新的或者小众的版本管理软件。对我来说,我选择 SVN 和 Git,一个集中式管理,一个分布式管理,虽然 Git 强大到可以替代 SVN,但有时也没有必要,对我来说部署一个简单的集中式版本控制系统,还是 SVN 要简单一些。

本文以 CentOS 6.3 为例阐述了如何用 yum 的方式安装和部署 SVN。

以下命令假设都是 root 用户来执行,我就可以不必每次都加 sudo 了。

SVN 一般有两种部署方式一种使用 svn 服务器模式,一种使用 http 做代理,其显示效果如下:

svn://yourdomain/repo http://code.yourdomain/repo

因为第一种部署最简单,所以先说第一种的部署方式。

svn 服务器部署方式 1:svn://yourdomain/repo

首先检查已安装的版本并卸载,然后从源安装最新版 SVN。

rpm -qa subversion
yum remove subversion
yum install -y subversion

假设我们的版本库在服务器上都是在/opt/svn目录下分子目录存放,而我们第一个示例版本库名是 repo。

mkdir -p /opt/svn/repo
svnadmin create /opt/svn/repo

为了 SVN 能够生效,我们需要编辑版本库的配置,首先是 svnserve.conf

vim /opt/svn/repo/conf/svnserve.conf
[general]
#匿名访问的权限,可以是read,write,none,默认为read
anon-access=none
#使授权用户有写权限
auth-access=write
#密码数据库的路径
password-db=/opt/svn/passwd
#访问控制文件
authz-db=authz
#认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm=My Test Repo

password 配置文件放在/opt/svn/passwd而不是/opt/svn/repo/conf/passwd的目的是让多个版本库共享同一份账户文件。

配置密码只需要编辑对应的密码 passwd 文件,一看就明白就不演示了。

vim /opt/svn/passwd

然后为了有权限访问,还需要编辑授权文件

vim /opt/svn/repo/conf/authz

在这个文件里,你可以针对不同的人授予不同的访问权限,这里授权给用户所有路径的权限。

[/]
testuser=rw

另外有的教程还会提一下如果设置 iptables 和关闭 selinux,这里就默认大家这两个都已经弄好了。

启动 SVN

一般的启动方式是直接使用 svnserve -d -r DIR 的形式,但在 CentOS6,我发现有守护进程的方式,/etc/init.d/svnserve,这样就更简单和稳定。

创建 svnserve.conf

vim /etc/sysconfig/svnserve

只需要一行代码

OPTIONS='-d -r /opt/svn'

当然这里你可以指定监听端口,和监听 IP 地址等其他额外参数,不过最常用的还是-d -r。

这样一来,我们就可以使用 svn://yourdomain/repo 的方式 checkout 代码了。

svn 服务器部署方式 2:http://code.yourdomain/repo

配置 http 方式,还需要从源安装额外的软件,特别是我们需要 Apache 的 DAV 模块。

yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql

然后你需要为 SVN 服务器创建一个 Apache 虚拟主机,并且带 DAV 权限控制

<Location />
DAV svn
SVNParentPath /opt/svn # 支持多个版本库
AuthType Basic
# SVNListParentPath on # 可以列出所有版本库
AuthName "Authorization SVN"
AuthUserFile /opt/svn/conf/passwd.conf
AuthzSVNAccessFile /opt/svn/conf/authz.conf
Require valid-user
</Location>

接下来就是对目录进行权限控制,以及设置 SVN 账户了,这里要注意的一点是使用 DAV 方式,版本库下的 svnserve.conf 就自动失效了,我们必须通过 passwd.conf 和 authz.conf 来保证版本库的安全性。

为 SVN 添加账户

# 首次
htpasswd -c /opt/svn/conf/passwd.conf testuser

# 以后
htpasswd /opt/svn/conf/passwd.conf testuser

权限控制,以下配置掩饰了复杂授权控制的方法。

[groups]
svn_developer = testuser_1,testuser_2
svn_admin = testuser_2,testuser_3

# 已经离开的人最好还是保留账号,只是禁用权限,这样在blame的时候比较好追踪。
user_left = testuser_4,testuser_5

# 默认只要有SVN账号都可以有读权限,设为已经离开团队的人除外
[/]
@svn_developer = rw
@svn_admin = rw

* = r

@user_left =


# 根据版本库授权
[repo:/trunk]
@svn_developer = rw
@svn_admin = rw

[repo:/tags]
@svn_admin = rw
@svn_developer = r

# 为单个用户提权
testuser_2 = rw


以上仅仅是显示了可能性,实际要根据对项目安全性的要求结合团队规划,项目规划进行合理的设置。

如果遇到错误:

svn: E195019: Redirect cycle detected for URL ...

是因为你设置的 DocumentRoot 和 SVN 目录相同的原因,设置一个不同的即可。