目录
前言:为什么选择SVN?
Subversion (SVN) 是一个开源的版本控制系统,用于管理文件和目录的变更,尽管Git目前已成为绝对的主流,但SVN因其集中式管理的特性,在许多企业级项目、需要严格权限控制和历史记录追溯的场景中仍然被广泛使用。

SVN的核心优势:
- 集中式服务器:所有代码和版本历史都存储在中央服务器上,便于管理和备份。
- 简单的学习曲线:对于习惯了CVS或没有分布式版本控制经验的用户来说,SVN的命令更直观。
- 成熟的权限管理:通过
authz文件可以精细地控制每个用户或用户组对不同目录的读写权限。 - 稳定的文件版本:SVN以文件为单位进行版本控制,不像Git那样有暂存区的概念,对一些开发者来说更直接。
准备工作
- 一台Linux服务器:本手册以 CentOS 7 为例,也提供 Ubuntu/Debian 的命令。
- 拥有
root权限或sudo权限的用户。 - 确保服务器网络畅通,并能从客户端访问服务器的SVN端口(默认3690)或HTTP/HTTPS端口(80/443)。
安装SVN服务器
在 CentOS / RHEL / Rocky / AlmaLinux 上
使用 yum 包管理器安装。
# 更新软件包列表 sudo yum update -y # 安装 Subversion sudo yum install -y subversion
在 Ubuntu / Debian 上
使用 apt 包管理器安装。
# 更新软件包列表 sudo apt update && sudo apt upgrade -y # 安装 Subversion sudo apt install -y subversion
验证安装

安装完成后,检查 svnserve 是否已安装。
svnserve --version
如果看到版本信息,说明安装成功。
创建版本库
SVN的版本库是存储项目代码和版本历史的地方,我们通常创建一个专门的目录来存放所有版本库。
创建版本库根目录
# 在 /var/svn 下创建版本库目录,这是一个常见的做法 sudo mkdir -p /var/svn
创建一个新的版本库
我们创建一个名为 myproject 的项目。

# 使用 svnadmin 命令创建版本库 sudo svnadmin create /var/svn/myproject
设置目录所有者
为了避免权限问题,建议将版本库目录的所有者设置为运行SVN服务的用户(通常是 apache 或 svn),我们先创建一个 svn 用户。
# 创建 svn 用户 (CentOS/RHEL) sudo useradd -m -s /bin/bash svn # 创建 svn 用户 (Ubuntu/Debian) sudo adduser --system --group --no-create-home svn
然后设置版本库目录的所有权。
sudo chown -R svn:svn /var/svn
你的版本库结构已经创建完成,位于 /var/svn/myproject。
配置用户权限
SVN的用户认证和权限控制通过两个文件实现:passwd 和 authz。
配置用户密码 (passwd)
这个文件用于存储用户名和密码的明文映射,它位于 每个版本库的 conf 目录下。
编辑 /var/svn/myproject/conf/passwd 文件:
sudo vi /var/svn/myproject/conf/passwd
在文件末尾添加用户,格式为 用户名 = 密码。
[users] # harry = harryssecret # sally = sallyssecret admin = mysecretpassword1 developer = devpassword123 guest = guestpass
保存并退出。
配置访问权限 (authz)
这个文件用于定义用户和用户组对不同目录的访问权限,它同样位于 每个版本库的 conf 目录下。
编辑 /var/svn/myproject/conf/authz 文件:
sudo vi /var/svn/myproject/conf/authz
[groups] # 定义用户组 admin_group = admin dev_group = developer [/] # 根目录的权限 @admin_group = rw # admin_group 组对根目录有读写权限 * = r # 其他用户(包括未登录用户)只有读权限 # 禁止 guest 用户访问 [myproject:/trunk] guest = # 给 developer 组对 branches 目录的读写权限 [myproject:/branches] @dev_group = rw # 给 admin 组对 tags 目录的读写权限 [myproject:/tags] @admin_group = rw
authz 文件语法说明:
[groups]:定义用户组。[项目路径]:定义对特定路径的权限,路径可以是 (整个库),/trunk,/branches/my-branch等。用户名 = 权限:r(read-only),rw(read-write), (无权限)。@用户组名 = 权限:为整个用户组设置权限。- 代表所有用户。
配置SVN服务
SVN服务可以通过 svnserve 守护进程来运行,我们需要配置它的主配置文件。
编辑 全局的 svnserve.conf 文件。注意:这个文件在 /etc/subversion/ 目录下,而不是在版本库的 conf 目录里!
sudo vi /etc/subversion/svnserve.conf
确保以下配置项被正确设置,并去掉前面的 号注释:
[general] # 匿名访问的权限,设置为 none 表示禁止匿名访问 anon-access = none # 认证用户的权限,设置为 write 表示允许读写 auth-access = write # 密码文件路径,指向我们刚刚创建的版本库的 passwd 文件 # 注意:这里的路径是相对于运行svnserve的用户家目录的,或者使用绝对路径 # 使用绝对路径是最稳妥的方式 password-db = /var/svn/myproject/conf/passwd # 权限配置文件路径,同样使用绝对路径 authz-db = /var/svn/myproject/conf/authz # realm(领域)用于在认证提示时显示给用户,通常设置为版本库名称 realm = My First Project Repository
重要提示:svnserve.conf 文件中所有路径、键名、值都不能以行首的空格开始, 号两边最好有一个空格,配置文件中的注释(以 开头)会影响后续行的读取,确保要启用的配置行前没有注释。
启动、开机自启与检查
启动 svnserve 服务
# -d 表示以守护进程模式运行 # -r 指定版本库的根目录,这样用户就可以通过 svn://server/myproject 访问,而无需写全路径 sudo svnserve -d -r /var/svn
设置开机自启
为了确保服务器重启后SVN服务能自动运行,我们需要将其设置为系统服务。
对于使用 systemd 的系统 (CentOS 7+, Ubuntu 16.04+)
创建一个服务单元文件:
