我们将使用 svnserve 这个轻量级、独立的 SVN 服务器程序,它非常适合中小型团队使用。

总览步骤
- 安装 SVN 服务端软件
- 创建 SVN 仓库
- 配置仓库访问权限
- 启动 SVN 服务
- 客户端连接测试
- 配置开机自启(可选)
第一步:安装 SVN 服务端软件
在大多数主流的 Linux 发行版上,SVN 的服务端软件包都叫做 subversion。
对于 Debian / Ubuntu 系统
使用 apt 包管理器进行安装:
# 更新软件包列表 sudo apt update # 安装 subversion sudo apt install subversion
对于 CentOS / RHEL / Rocky Linux / AlmaLinux 系统
使用 yum 或 dnf 包管理器进行安装:
# 对于 CentOS 7, RHEL 7 或使用 yum 的系统 sudo yum install subversion # 对于 CentOS 8+, RHEL 8+, Rocky Linux 8+ 或使用 dnf 的系统 sudo dnf install subversion
安装完成后,可以验证一下是否安装成功:

svnserve --version
如果显示出版本信息,说明安装成功。
第二步:创建 SVN 仓库
我们约定将所有的 SVN 仓库统一存放在 /var/svn 目录下。
-
创建仓库根目录
sudo mkdir -p /var/svn
-
创建第一个仓库 假设我们的项目名为
my-project。sudo svnadmin create /var/svn/my-project
-
设置仓库目录所有者 为了避免权限问题,建议将仓库目录的所有者设置为运行
svnserve服务的用户(通常是root或svn),这里我们简单起见,先设置为root。sudo chown -R root:root /var/svn/my-project
执行完上述命令后,/var/svn/my-project 目录下会生成一系列文件和文件夹,如 conf, db, hooks, format 等,这表明 SVN 仓库已经成功创建。
第三步:配置仓库访问权限
这是最关键的一步,我们需要配置哪些用户可以读写,哪些用户只读。
-
进入仓库的配置目录
cd /var/svn/my-project/conf
该目录下有三个重要的配置文件:
svnserve.conf: SVN 服务的主配置文件。passwd: 存储用户名和密码的文件。authz: 定义用户和用户组权限的文件。
-
配置
svnserve.conf用你喜欢的编辑器打开svnserve.conf文件(sudo nano svnserve.conf),并确保以下几行是取消注释(即去掉行首的 和空格)并且内容正确的:[general] # 匿名用户无任何权限 anon-access = none # 认证用户有读写权限 auth-access = write # 密码文件路径 password-db = passwd # 权限配置文件路径 authz-db = authz # 使用 realms,建议与仓库名一致,用于提示用户 realm = My Project Repository
关键点解释:
anon-access = none: 不允许匿名用户访问,这是安全的基本要求。auth-access = write: 要求用户必须通过认证才能进行读写操作。password-db = passwd: 指定了密码文件是当前目录下的passwd文件。authz-db = authz: 指定了权限控制文件是当前目录下的authz文件。
-
配置
passwd文件 打开passwd文件,添加用户名和密码,格式为用户名 = 密码。[users] # harry = harry_secret # sally = sally_secret # 添加我们自己的用户 zhangsan = zhangsan_password lisi = lisi_password
这里我们创建了两个用户:
zhangsan和lisi。 -
配置
authz文件 这个文件非常强大,可以精细控制每个用户或用户组对不同仓库或仓库中不同目录的访问权限。打开
authz文件,进行如下配置:[groups] # 定义一个管理员组 admin = zhangsan # 定义一个开发组 dev_team = zhangsan, lisi [/] # 根目录 `/` 的权限 # @dev_team 表示 dev_group 组内的所有成员 @dev_team = rw # lisi 用户单独设置 # lisi = rw # * 表示所有其他认证用户 * = r [/my-project/trunk/doc] # 特定目录的权限,doc 目录只允许 zhangsan 访问 @admin = rw * =
关键点解释:
[groups]:定义用户组,方便管理。[/]:代表整个仓库的根目录。@组名:表示对该组内的所有用户生效。用户名:对特定用户生效。rw:读和写权限。r:只读权限。- 无权限。
- 匹配所有认证用户。
第四步:启动 SVN 服务
仓库和权限都已配置好,可以启动 svnserve 服务了。
-
启动服务 建议使用以下命令,它会以后台守护进程模式运行,并监听在 3690 端口(SVN 的默认端口)。
sudo svnserve -d -r /var/svn
参数解释:
-d: 以 daemon(守护进程)模式运行。-r /var/svn: 指定 SVN 仓库的根目录,这样客户端就可以通过svn://服务器IP/my-project的方式访问,而不需要输入完整路径。
-
检查服务状态
# 检查端口是否被监听 netstat -tulnp | grep 3690 # 或者使用 ss 命令 (新版本 Linux 推荐) ss -tulnp | grep 3690
如果看到类似
LISTEN 0 5 *:3690 *:*的输出,说明服务已经成功启动。
第五步:客户端连接测试
现在你可以从另一台机器(或者本机)使用 SVN 客户端来测试了。
-
检出仓库 打开终端,使用
svn checkout(或svn co) 命令,将<服务器IP>替换为你的 Linux 服务器的实际 IP 地址。# 格式: svn://<服务器IP>/<仓库名> svn co svn://192.168.1.100/my-project
-
输入用户名和密码 执行上述命令后,SVN 客户端会提示你输入用户名和密码。
Authentication realm: <svn://192.168.1.100:3690> My Project Repository Username: zhangsan Password: (输入 zhangsan 的密码) -
验证结果 如果一切正常,它会提示你
Checked out revision 0.,并且会在当前目录下创建一个my-project文件夹,里面包含了 SVN 仓库的.svn文件,说明检出成功。 -
测试写入权限 进入
my-project文件夹,创建一个新文件,然后尝试提交。cd my-project echo "Hello, SVN!" > test.txt svn add test.txt svn commit -m "Add test file"
同样,它会要求你输入
zhangsan的密码,提交成功后,说明写入权限配置正确。
第六步:配置开机自启(可选)
为了让 SVN 服务器在系统重启后能自动启动,可以创建一个 systemd 服务单元文件。
-
创建服务文件
sudo nano /etc/systemd/system/svnserve.service
-
写入以下内容
[Unit] Description=Subversion Protocol Daemon After=network.target [Service] Type=forking ExecStart=/usr/bin/svnserve -d -r /var/svn ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure [Install] WantedBy=multi-user.target
-
重新加载 systemd 并启用服务
# 重新加载 systemd 配置 sudo systemctl daemon-reload # 启用 svnserve 服务,并设置为开机自启 sudo systemctl enable svnserve.service # 立即启动服务(如果还没启动的话) sudo systemctl start svnserve.service
你的 SVN 服务器就搭建完成了,并且具备开机自启的能力。
总结与常见问题
- 防火墙问题:如果客户端无法连接,请检查 Linux 服务器上的防火墙是否允许 3690 端口的流量。
- 对于
iptables(CentOS 7 之前):sudo iptables -I INPUT -p tcp --dport 3690 -j ACCEPT - 对于
firewalld(CentOS 7+ / RHEL 7+ / Fedora):sudo firewall-cmd --permanent --add-port=3690/tcp && sudo firewall-cmd --reload
- 对于
- SELinux 问题:在 CentOS/RHEL 系统上,如果启用 SELinux,可能会阻止
svnserve访问/var/svn目录,可以先临时关闭 SELinux 来测试:sudo setenforce 0,如果确认是 SELinux 问题,则需要配置相应的策略,这是一个更高级的话题。 - 数据备份:SVN 仓库本质上就是一个文件系统,定期使用
tar或rsync等工具备份/var/svn目录即可。 - 更高级的方案:对于需要 HTTPS 访问、与 Apache 集成或更复杂权限管理的场景,可以考虑使用
svn+https方案,但这需要额外配置 Apache 服务器和 SSL 证书,比svnserve复杂得多。svnserve已经能满足绝大多数中小团队的需求。
