环境准备
- 操作系统: CentOS 7 / CentOS 8 / CentOS Stream 9 (本教程以 CentOS 7 为例,其他版本命令基本相同)
- 目标: 创建一个名为
myproject的版本库,并设置两个用户:dev1和dev2。 - 服务器IP: 假设为
168.1.100
第一步:安装 SVN 服务器
CentOS 7 的官方软件源中包含了 subversion 包,我们可以直接使用 yum 进行安装。

-
更新系统软件包
sudo yum update -y
-
安装 SVN 服务器
sudo yum install subversion -y
-
验证安装 安装完成后,检查
svnserve是否已安装并可用。svnserve --version
如果看到版本信息,则表示安装成功。
(图片来源网络,侵删)
第二步:创建 SVN 版本库
版本库是存储所有文件和版本历史的地方,我们通常会选择一个专门的目录来存放所有版本库。
-
创建版本库根目录
sudo mkdir -p /var/svn sudo chown -R apache:apache /var/svn # 如果通过Apache访问,需要这个权限
-
创建新的版本库 这里我们创建一个名为
myproject的项目。sudo svnadmin create /var/svn/myproject
-
查看版本库结构 创建完成后,进入
myproject目录,你会看到以下结构:
(图片来源网络,侵删)cd /var/svn/myproject ls -l
你会看到:
conf/: 存放配置文件的目录。db/: 存储版本数据的核心目录。hooks/: 存放钩子脚本的目录。locks/: 用于锁定,防止冲突。format: 一个文本文件,包含版本库的格式版本。
第三步:配置 SVN 访问权限
这是最关键的一步,我们需要在 conf 目录下修改三个配置文件。
-
进入配置目录
cd /var/svn/myproject/conf
-
配置用户密码 (
passwd文件) 这个文件用于定义哪些用户可以访问 SVN 服务器。 编辑passwd文件:sudo vim passwd
在文件末尾添加用户和密码,格式为
用户名 = 密码。[users] # harry = harryssecret # sally = sallyssecret dev1 = password_for_dev1 dev2 = password_for_dev2
-
配置权限 (
authz文件) 这个文件用于定义用户或用户组对不同版本库或目录的读写权限。 编辑authz文件:sudo vim authz
清空文件内容,然后按以下方式配置:
[groups]定义用户组。[/]表示对整个版本库的权限。r表示只读,w表示读写。
[groups] # 定义一个开发组,包含 dev1 和 dev2 developers = dev1, dev2 [/] # 管理员,拥有读写权限 admin = rw # 给 developers 组授予读写权限 @developers = rw # 可以单独给用户赋予权限,会覆盖组权限 # dev1 = rw # dev2 = r
-
配置服务器核心参数 (
svnserve.conf文件) 这个文件是svnserve的主配置文件,它告诉 SVN 服务器去哪里找用户和权限配置。 注意:svnserve.conf中的注释是以 开头的,并且键值对格式为键 = 值,两边不能有空格。编辑
svnserve.conf文件:sudo vim svnserve.conf
修改或取消注释以下几行:
[general] # 使用我们上面配置的 passwd 文件 password-db = passwd # 使用我们上面配置的 authz 文件 authz-db = authz # 指定匿名用户的权限,默认是 'r',我们设为 'none' 表示禁止匿名访问 anon-access = none # 指定认证用户的权限,默认是 'rw',我们保持 'rw' auth-access = write # realm 是一个认证域,在客户端连接时会显示,可以自定义,但要和库名一致 realm = My First Project Repository
**第四步:启动 SVN 服务并设置开机自启
-
启动 SVN 服务 我们使用
-d选项让svnserve在后台运行(守护进程模式),-r选项指定版本库的根目录。sudo svnserve -d -r /var/svn
-d: daemon mode (后台运行)-r /var/svn: 指定版本库的根目录,这样用户就可以通过svn://192.168.1.100/myproject访问到myproject版本库。
-
检查 SVN 服务状态
ps aux | grep svnserve # 或者使用 netstat 查看端口 netstat -tulnp | grep svnserve
你应该能看到
svnserve进程正在运行,并且监听在默认的3690端口。 -
设置开机自启 为了让服务器重启后 SVN 服务能自动启动,我们可以创建一个 systemd 服务文件。 创建文件:
sudo vim /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 并启用服务:
sudo systemctl daemon-reload sudo systemctl enable svnserve.service sudo systemctl start svnserve.service
第五步:客户端连接测试
我们可以从另一台机器(或者在服务器本地)使用 SVN 客户端来测试连接了。
-
检出项目 使用
svn checkout(或svn co) 命令,将版本库中的代码检出到本地。# 格式: svn://服务器IP/版本库名 svn checkout svn://192.168.1.100/myproject /tmp/myproject_test
系统会提示你输入用户名和密码。
Authentication realm: <svn://192.168.1.100:3690> My First Project Repository Username: dev1 Password: <输入 dev1 的密码>输入正确后,项目就会被检出到
/tmp/myproject_test目录。 -
测试提交 进入检出的目录,添加一个新文件并尝试提交,以验证写权限。
cd /tmp/myproject_test echo "This is a test file." > test.txt svn add test.txt svn commit -m "Add test.txt from dev1"
再次输入用户名
dev1和密码,如果提交成功,说明配置完全正确!
常见问题与扩展
防火墙配置
如果你的服务器开启了防火墙,需要开放 svnserve 默认的 3690 端口。
# 永久开放 3690 端口 sudo firewall-cmd --permanent --add-port=3690/tcp sudo firewall-cmd --reload # 或者直接关闭防火墙(仅限测试环境) sudo systemctl stop firewalld sudo systemctl disable firewalld
通过 Web (Apache) 访问 SVN
svnserve 是一个轻量级的独立服务器,如果你希望通过 HTTP/S 协议访问(http://192.168.1.100/svn/myproject),并利用 Apache 的更多功能(如 SSL 加密),你需要安装 mod_dav_svn 模块,这比 svnserve 的配置更复杂,但功能更强大,更适合企业级应用。
使用 SSH 访问 SVN
对于小团队,通过 SSH 访问 SVN 也是一个非常安全和方便的选择,它不需要额外的密码,直接使用系统用户的 SSH 密钥进行认证,配置方法与 svnserve 不同,需要设置 svn+ssh:// 协议。
至此,您已经成功在 CentOS 服务器上搭建并配置好了一个功能完整的 SVN 服务器。
