在Linux环境下搭建SVN(Subversion)服务器是企业级版本控制中常见的需求,SVN作为集中式版本控制系统,能够有效管理代码、文档等文件的变更历史,以下将详细介绍在Linux系统(以CentOS 7为例)中搭建SVN服务器的完整步骤,包括安装、配置、权限管理及服务启动等关键环节。

环境准备与SVN安装
首先需要确保系统已正确安装,并具备管理员权限,以CentOS 7为例,通过yum包管理器安装SVN服务,打开终端,执行以下命令更新系统软件包并安装SVN:
sudo yum update -y sudo yum install subversion -y
安装完成后,通过svnserve --version命令验证安装是否成功,若显示版本信息则表明安装成功。
创建SVN仓库
SVN仓库是存储版本数据的核心目录,通常建议放在/var/svn路径下,首先创建仓库根目录,然后使用svnadmin create命令初始化仓库:
sudo mkdir -p /var/svn sudo svnadmin create /var/svn/project1
执行后,/var/svn/project1会自动生成包含conf、db、hooks、locks等子目录的仓库结构,其中conf目录是核心配置目录,包含以下三个关键文件:

svnserve.conf:SVN服务主配置文件,控制服务行为及认证方式;passwd:用户密码文件,用于存储SVN用户及密码;authz:权限控制文件,定义用户或用户组对仓库目录的访问权限。
配置SVN仓库权限
配置svnserve.conf
编辑/var/svn/project1/conf/svnserve.conf如下:
[general] # 匿名用户访问权限,设为none禁止匿名访问 anon-access = none # 认证用户访问权限,设为read/write允许读写 auth-access = write # 密码文件路径(相对于conf目录) password-db = passwd # 权限控制文件路径 authz-db = authz # 权限控制是否继承子目录,设为true表示继承 authz-authz = true
注意:配置文件中的段落标识(如[general])必须顶格书写,且前后需保留空格,否则配置可能失效。
配置passwd文件
编辑/var/svn/project1/conf/passwd文件,添加用户及密码,格式为用户名 = 密码,
[users] user1 = password1 user2 = password2
SVN密码存储为明文,若需加密可使用htpasswd工具(需安装httpd-tools)。
配置authz文件
authz文件支持基于用户和用户组的精细权限控制,
[groups] # 定义用户组,格式:组名 = 用户1,用户2 dev_team = user1, user2 test_team = user2 [/] # 根目录权限,dev_team组成员有读写权限,user2仅有读权限 @dev_team = rw user2 = r [/trunk] # trunk目录仅dev_team可读写 @dev_team = rw [/branches] # branches目录禁止test_team访问 @test_team =
说明:
- 表示仓库根目录;
- 前缀表示用户组(如
@dev_team); rw表示读写,r表示读,空表示无权限。
启动SVN服务
SVN服务可通过svnserve命令启动,默认端口为3690,启动时需指定仓库路径及监听地址:
svnserve -d -r /var/svn
参数说明:
-d:后台守护进程模式运行;-r:指定仓库根目录,客户端可通过svn://IP地址直接访问该目录下的所有仓库。
若需修改监听端口(如改为8080),添加--listen-port 8080参数;若需绑定特定IP(如192.168.1.100),添加--listen-host 192.168.1.100参数。
检查服务状态:
netstat -tuln | grep 3690 # 查看端口是否监听 ps aux | grep svnserve # 查看进程是否运行
配置防火墙与SELinux
为确保客户端能正常访问SVN服务,需开放3690端口并配置SELinux策略。
防火墙配置(CentOS 7使用firewalld)
sudo firewall-cmd --permanent --add-port=3690/tcp sudo firewall-cmd --reload
SELinux配置
若SELinux处于 enforcing 模式,需为SVN添加端口上下文:
sudo semanage port -a -t svn_port -p tcp 3690
若未安装semanage工具,可通过yum install policycoreutils-python -y安装。
客户端访问测试
在客户端机器(Windows/Linux均可)使用SVN客户端(如TortoiseSVN、命令行svn)访问仓库,以命令行为例:
# 检出仓库到本地 svn checkout svn://服务器IP/project1 # 提交文件(需提前配置用户名) svn commit -m "test commit" --username user1
若提示认证错误,检查passwd和authz文件配置;若连接超时,检查防火墙及SVN服务状态。
SVN服务开机自启
为使SVN服务在系统重启后自动启动,可创建systemd服务单元文件:
sudo vim /etc/systemd/system/svnserve.service ``` 如下: ```ini [Unit] Description=Subversion Repository Server After=network.target [Service] Type=forking User=root Group=root ExecStart=/usr/bin/svnserve -d -r /var/svn ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure [Install] WantedBy=multi-user.target
保存后执行以下命令启用开机自启:
sudo systemctl daemon-reload sudo systemctl enable svnserve sudo systemctl start svnserve
仓库维护与管理
仓库备份
定期备份是保障数据安全的关键,可通过svnadmin hotcopy命令创建热备份(服务不停止):
svnadmin hotcopy /var/svn/project1 /var/svn_backup/project1_$(date +%Y%m%d)
也可结合crontab设置定时任务,例如每天凌晨2点备份:
0 2 * * * svnadmin hotcopy /var/svn/project1 /var/svn_backup/project1_$(date +\%Y\%m\%d) && tar -czf /var/svn_backup/project1_$(date +\%Y\%m\%d).tar.gz /var/svn_backup/project1_$(date +\%Y\%m\%d) && rm -rf /var/svn_backup/project1_$(date +\%Y\%m\%d)
仓库迁移
若需迁移仓库,只需停止SVN服务,复制整个仓库目录至新服务器,重启服务即可:
sudo systemctl stop svnserve sudo cp -r /var/svn/project1 /new_path/svn/ sudo systemctl start svnserve
相关问答FAQs
Q1: SVN服务启动后客户端无法连接,可能的原因有哪些?
A: 可能原因包括:
- 防火墙未开放3690端口,需执行
firewall-cmd --add-port=3690/tcp; - SELinux阻止访问,需添加端口上下文或临时关闭SELinux(
setenforce 0); svnserve.conf中anon-access或auth-access配置错误,导致认证失败;- 客户端使用的IP地址或SVN URL格式错误(如误将
svn://写成http://)。
Q2: 如何修改SVN仓库的默认访问端口?
A: 修改SVN服务启动参数中的--listen-port即可,例如将端口改为8080:
svnserve -d -r /var/svn --listen-port 8080
若需永久修改,可通过systemd服务单元文件的ExecStart参数添加--listen-port 8080,然后重启服务:
sudo systemctl restart svnserve
修改后客户端需使用svn://服务器IP:8080/project1访问仓库。
