在Linux服务器上部署Subversion(SVN)是构建企业级版本控制环境的核心步骤,通过标准化的安装流程、精细的权限配置以及服务管理,能够实现代码与文档的安全存储与高效协作。SVN的部署不仅涉及软件包的安装,更关键在于版本库的创建、配置文件的精细化调整以及服务的持久化运行。 以下内容将基于CentOS及Ubuntu主流发行版,详细阐述从环境搭建到权限管理的全流程,并提供专业的生产环境部署建议。

环境准备与软件安装
在开始安装之前,确保系统已更新至最新状态,以避免依赖包冲突,SVN在Linux下的安装主要分为服务端和客户端,通常我们只需要安装服务端即可。
对于基于RedHat的系统(如CentOS 7、CentOS 8、Rocky Linux),使用yum或dnf包管理器是最便捷的方式,执行安装命令前,建议先检查系统是否已预装旧版本。安装命令如下:
yum install -y subversion
对于基于Debian的系统(如Ubuntu 20.04、Ubuntu 22.04),则使用apt包管理器。安装命令如下:
apt update apt install -y subversion
安装完成后,使用svnserve --version命令验证安装是否成功,若输出版本号,说明软件已正确安装。专业的运维建议是将SVN数据目录规划在独立的分区或大容量数据盘上,例如/data/svn,而非系统默认的根目录,以防止日志或版本库膨胀占满系统盘导致系统宕机。
版本库创建与核心配置
版本库是SVN存储数据的实际位置,假设我们将根目录设定为/data/svn,首先创建该目录并初始化一个名为project的版本库。
创建目录与版本库的命令:
mkdir -p /data/svn svnadmin create /data/svn/project
执行上述命令后,/data/svn/project目录下会生成配置文件、钩子脚本及数据库文件等。核心配置工作主要集中在conf目录下的三个文件:svnserve.conf、passwd和authz。
主配置文件 svnserve.conf
这是版本库的主控开关,决定了认证策略和权限文件的读取路径。修改该文件时需注意,配置项前不能留有空格,否则会导致服务启动失败。

- [general]:配置段标识。
- anon-access = none:禁止匿名访问,出于安全考虑,生产环境必须设置为
none,防止未授权用户读取代码。 - auth-access = write:授权用户拥有读写权限。
- password-db = passwd:指定用户密码文件名,默认为当前目录下的
passwd。 - authz-db = authz:指定权限控制文件名,默认为当前目录下的
authz。 - realm = My Project Repository:认证域名称,客户端提示时显示。
用户密码文件 passwd
该文件用于存储用户名和密码哈希值。格式为“用户名 = 密码”,密码以明文存储,因此必须严格限制该文件的读取权限(chmod 600 passwd)。
[users] admin = admin123 developer = dev123 guest = guest123
权限控制文件 authz
这是SVN权限管理的精髓,支持分组管理和目录级权限控制。通过合理的分组,可以大幅降低权限维护的复杂度。
- [groups]:定义用户组。
[groups] dev_team = developer, guest admin_team = admin
- [/]:版本库根目录的权限配置。
[/] @admin_team = rw @dev_team = r
上述配置表示管理员组拥有读写权限,开发组仅拥有读取权限。
- [/trunk/src]:针对特定子目录的权限配置。
[/trunk/src] @dev_team = rw
这允许开发组在特定目录下拥有写入权限,实现精细化的目录隔离。
服务启动与防火墙配置
配置完成后,需要启动SVN服务,SVN默认使用3690端口。启动服务时,建议使用-r参数指定版本库的根目录,这样客户端在连接时可以直接使用版本库名称,而无需输入绝对路径。
启动命令:
svnserve -d -r /data/svn
-d:表示以守护进程模式在后台运行。-r /data/svn:设置版本库根目录。
检查服务状态:
ps -ef | grep svnserve netstat -antp | grep 3690
防火墙配置是容易被忽略的关键步骤,若云服务器或系统开启了防火墙,必须放行3690端口。

- CentOS 7 (firewalld):
firewall-cmd --permanent --add-port=3690/tcp firewall-cmd --reload
- Ubuntu (ufw):
ufw allow 3690/tcp
进阶:Systemd守护进程与自动备份
直接使用svnserve命令启动服务在服务器重启后会失效。为了符合生产环境的高可用标准,应编写Systemd服务单元文件,实现SVN服务的开机自启和崩溃重启。
创建文件/etc/systemd/system/svnserve.service如下:
[Unit] Description=Subversion protocol daemon After=network.target [Service] Type=forking User=svn Group=svn ExecStart=/usr/bin/svnserve -d -r /data/svn --log-file /var/log/svn.log Restart=on-failure [Install] WantedBy=multi-user.target
执行systemctl daemon-reload并启用服务:systemctl enable --now svnserve。
数据备份是版本控制系统的生命线,SVN提供了svnadmin hotcopy命令,支持在不停止服务的情况下进行完整备份。建议编写Shell脚本结合Crontab定时任务,每日凌晨自动执行全量备份,并将备份文件同步到异地存储或对象存储中,确保数据万无一失。
常见问题与解决方案
在部署过程中,权限拒绝和连接失败是最常见的错误。
- 配置文件格式错误:若修改
svnserve.conf时行首留有空格,会导致客户端报错“Repository moved permanently”或无法连接。解决方法是严格检查配置文件,确保参数顶格书写。 - 权限归属问题:若启动SVN服务的用户(如root)与版本库文件的所有者不一致,可能导致写入失败。建议创建专用的
svn系统用户来运行服务并管理版本库目录。
相关问答
Q1:如果忘记了SVN用户的密码,该如何重置?
A: SVN的用户密码以明文形式存储在版本库conf目录下的passwd文件中,管理员可以直接编辑该文件,找到对应的用户名,等号后面即为密码,直接修改为新密码并保存即可,无需重启SVN服务,更改会即时生效。
Q2:如何修改SVN服务的默认监听端口3690?
A: 修改默认端口需要在启动svnserve命令时添加--listen-port参数,若想将端口改为8080,启动命令应为:svnserve -d -r /data/svn --listen-port 8080,请务必在防火墙和云服务器安全组中放行新的端口8080。















