我们将使用 svnserve 这个轻量级的、独立的服务器程序来搭建 SVN 服务器,它通过一个自定义的 TCP 端口(默认 3690)与客户端通信,配置相对简单,非常适合中小型团队使用。

第一步:更新系统并安装 SVN
登录到你的 Ubuntu 服务器,确保系统包列表是最新的,然后安装 subversion 包。
# 更新 apt 包索引 sudo apt update # 安装 subversion sudo apt install subversion
安装完成后,可以验证 SVN 是否安装成功:
svnserve --version
你应该能看到类似下面的版本信息,表示安装成功。
svnserve, version 1.14.1 (r1886148)
compiled Aug 18 2025, 17:01:35 on x86_64-pc-linux-gnu
Copyright (C) 2025 the Apache Software Foundation.
This software consists of contributions made by many people; see the
NOTICE file for more information.
Subversion is open source software, see http://subversion.apache.org/
The following repository back-end (FS) modules are available:
* fs_base : Module for working with a Berkeley DB repository.
- handles symlinks
- handles large files
* fs_fs : Module for working with a plain file (FSFS) repository.
- handles symlinks
- handles large files
第二步:创建 SVN 仓库
SVN 仓库是存储所有版本数据的地方,我们会创建一个专门的目录来存放所有仓库。

-
创建仓库根目录 我们选择在
/var/svn下创建仓库,这是一个常见的实践,因为该目录通常具有合适的权限。sudo mkdir -p /var/svn
-
创建第一个仓库 假设我们要创建一个名为
myproject的仓库。sudo svnadmin create /var/svn/myproject
执行此命令后,
/var/svn/myproject目录下会生成一系列文件和文件夹,这就是你的仓库结构。 -
设置仓库所有者 为了方便管理和避免权限问题,我们将仓库的所有者设置为当前运行
svnserve的用户(通常是root,但我们不推荐以root运行服务),这里我们创建一个svn用户来专门管理 SVN。
(图片来源网络,侵删)# 创建 svn 用户(如果不存在) sudo adduser --system --group --no-create-home svn # 将仓库目录的所有权赋给 svn 用户 sudo chown -R svn:svn /var/svn/myproject
第三步:配置 SVN 仓库访问权限
SVN 的权限和用户信息存储在仓库配置文件中,我们需要编辑两个关键文件:passwd(用户密码)和 authz(权限控制)。
-
配置用户密码 (
passwd)编辑
myproject仓库下的conf/passwd文件。sudo nano /var/svn/myproject/conf/passwd
这个文件的格式是
[users]段落下,用户名 = 密码,取消注释并添加你的用户。[users] # harry = harryssecret # sally = sallyssecret admin = mysecretpassword developer = devpassword
-
配置权限 (
authz)编辑
myproject仓库下的conf/authz文件。sudo nano /var/svn/myproject/conf/authz
这个文件定义了用户和用户组对不同仓库路径的读写权限。
[groups] # 定义用户组 admin_group = admin dev_group = developer [/] # 根目录 `/` 的权限 @admin_group = rw * = r [/trunk] # trunk 目录,开发组有读写权限 @dev_group = rw [/branches] # branches 目录,开发组有读写权限 @dev_group = rw [/tags] # tags 目录,只有管理员有读写权限 @admin_group = rw
权限说明:
r: 读权限w: 写权限rw: 读写权限- 匹配任何匿名用户(未在
passwd中定义的用户)。
-
配置仓库基本选项 (
svnserve.conf)这是仓库最重要的配置文件,它告诉
svnserve去哪里查找用户和权限信息。sudo nano /var/svn/myproject/conf/svnserve.conf
确保以下几行被取消注释并且设置正确:
[general] # 匿名用户访问权限设置为无 anon-access = none # 认证用户访问权限设置为读写 auth-access = write # 密码文件路径,相对于当前 conf 目录 password-db = passwd # 权限控制文件路径,相对于当前 conf 目录 authz-db = authz # 使用 realm(领域)来区分不同的认证空间,建议设置为仓库名称 realm = My First Repository
注意:
svnserve.conf文件中,每一项的键和值左右两侧的空格和制表符都非常敏感,最好直接使用 号,不要有多余的空格。
第四步:启动 SVN 服务
我们已经准备好了仓库,可以启动 svnserve 服务了。
-
手动启动(用于测试)
你可以手动启动
svnserve来测试一下。# -d 表示后台守护进程运行 # -r 指定仓库的根目录,这样客户端就可以直接通过 svn://server/myproject 访问 sudo svnserve -d -r /var/svn
-
使用 Systemd 持久化运行(推荐)
为了让 SVN 服务在服务器重启后自动启动,并且方便管理,我们应该创建一个 systemd 服务单元文件。
创建服务文件:
sudo nano /etc/systemd/system/svnserve.service
粘贴进去,并根据你的实际情况修改
User,Group, 和--root参数。[Unit] Description=Subversion Protocol Daemon After=network.target [Service] Type=simple User=svn Group=svn ExecStart=/usr/bin/svnserve -i -r /var/svn # 如果想使用非标准端口,可以添加以下行 # Environment="SVNSERVE_LISTEN_PORT=3690" [Install] WantedBy=multi-user.target
参数解释:
-i: 以“独立”模式运行,而不是 inetd 模式。-r /var/svn: 指定仓库根目录。
启动并启用服务:
# 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动 svnserve 服务 sudo systemctl start svnserve # 设置开机自启 sudo systemctl enable svnserve
检查服务状态:
sudo systemctl status svnserve
如果看到绿色的
active (running),说明服务已成功启动。
第五步:客户端连接测试
你可以在你的客户端电脑(可以是另一台 Linux, Windows 或 macOS)上使用 SVN 客户端(如 svn 命令行或 TortoiseSVN)来连接服务器。
假设你的服务器 IP 地址是 168.1.100。
-
检出仓库 (Checkout)
这会在你的本地电脑上创建一个仓库的副本。
# 在命令行中执行 svn checkout svn://192.168.1.100/myproject
系统会提示你输入用户名和密码,就是我们之前在
passwd文件中设置的admin或developer。Authentication realm: <svn://192.168.1.100:3690> My First Repository Username: admin Password: ******** A myproject/trunk A myproject/branches A myproject/tags Checked out revision 1.检出成功后,你的本地就会有一个
myproject文件夹。 -
提交更改 (Commit)
你可以修改本地文件,然后提交回服务器。
cd myproject echo "Hello from SVN" > README.md svn add README.md svn commit -m "Add initial README file"
同样需要输入用户名和密码,提交成功后,你的更改就已经保存在服务器上了。
防火墙配置
如果你的服务器启用了 UFW (Uncomplicated Firewall),你需要开放 SVN 服务的默认端口 3690。
# 允许来自任何 IP 的 3690 端口访问(不推荐在生产环境中) sudo ufw allow 3690/tcp # 更安全的做法是只允许特定 IP 访问 # sudo ufw allow from 192.168.1.0/24 to any port 3690 proto tcp
总结与最佳实践
- 备份!备份!备份! 定期备份你的 SVN 仓库
/var/svn,可以使用svnadmin hotcopy命令创建一个热备份,不影响服务运行。 - 使用 SSH 协议 (可选):对于更安全的场景,可以考虑使用
svn+ssh://协议,它通过 SSH 隧道传输数据,利用了系统现有的用户认证和加密,无需单独配置svnserve和用户密码,但配置相对复杂,且每个开发者都需要一个系统账户。 - 使用 HTTPS 协议 (可选):如果需要通过 Web 浏览器访问仓库,或者集成到现有的 Web 服务器(如 Apache)中,可以使用
svn+https://协议,这需要配置 Apache 和 WebDAV,功能最强大,但也最复杂。 - 用户管理:当用户数量增多时,手动编辑
passwd和authz会变得很麻烦,可以考虑使用 LDAP 或其他集中式的用户认证系统来集成 SVN。
通过以上步骤,你就成功在 Ubuntu 服务器上搭建了一个功能完善的 SVN 服务器。svnserve 是一种简单、高效且易于维护的解决方案,非常适合中小型项目的版本控制需求。
