波波技术栈
article

Linux 下 SVN 安装、配置及权限管理教程

本文以 CentOS/RHEL 为例,详细介绍了在 Linux 系统上安装 Subversion 服务器的完整流程,包括使用 yum/apt 安装、创建版本库、配置 svnserve.conf、passwd 和 authz 三个核心文件实现用户与权限管理,以及启动服务、开放防火墙端口和客户端连接测试的方法。

本教程将指导你在 Linux 系统(以 CentOS/RHEL 为例,Ubuntu/Debian 类似)上安装 Subversion (SVN) 服务器,创建版本库,并配置用户权限。

1. 安装 SVN

CentOS / RHEL / Fedora

使用 yumdnf 安装:

bash
sudo yum install -y subversion
# 或者
sudo dnf install -y subversion

Ubuntu / Debian

使用 apt 安装:

bash
sudo apt-get update
sudo apt-get install -y subversion

验证安装

安装完成后,检查版本以确认安装成功:

bash
svnserve --version

2. 创建版本库

创建存储目录

通常将 SVN 版本库存放在 /var/svn/opt/svn 目录下。这里以 /var/svn 为例:

bash
sudo mkdir -p /var/svn

初始化版本库

使用 svnadmin create 命令创建一个名为 myproject 的版本库:

bash
sudo svnadmin create /var/svn/myproject

执行后,/var/svn/myproject 目录下会自动生成以下子目录和文件:

  • conf/: 配置文件目录(核心配置在此)
  • db/: 版本数据存储目录
  • hooks/: 钩子脚本目录
  • locks/: 锁文件目录
  • format: 版本库格式标识

3. 配置用户与权限

进入版本库的 conf 目录:

bash
cd /var/svn/myproject/conf

你需要修改三个核心文件:svnserve.confpasswdauthz

3.1 配置主服务文件 (svnserve.conf)

编辑 svnserve.conf

bash
vim svnserve.conf

找到 [general] 部分,修改或取消注释以下行。‌**注意:配置项必须顶格写,前面不能有空格,等号两边建议保留空格。**‌

ini
[general]
# 禁止匿名访问
anon-access = none
# 授权用户拥有读写权限
auth-access = write
# 指定密码文件为当前目录下的 passwd
password-db = passwd
# 指定权限配置文件为当前目录下的 authz
authz-db = authz
# 认证域名称(客户端登录时显示)
realm = MyProject Repo

3.2 设置用户密码 (passwd)

编辑 passwd 文件添加用户:

bash
vim passwd

[users] 块中添加用户名和密码,格式为 用户名 = 密码

ini
[users]
admin = admin123
developer1 = dev123
intern = intern123

3.3 配置详细权限 (authz)

编辑 authz 文件定义用户组和目录权限:

bash
vim authz

‌**示例配置:**‌

ini
[groups]
# 定义用户组
admins = admin
developers = developer1
interns = intern

# 根目录权限
[/]
# 管理员组拥有读写权限
@admins = rw
# 其他所有人默认无权限
* = 

# 项目主干目录权限
[/trunk]
# 开发组拥有读写权限
@developers = rw
# 实习生只有只读权限
@interns = r

# 特定敏感目录权限
[/trunk/config]
# 只有管理员能修改配置
@admins = rw
# 其他人无权限
* = 

‌**权限说明:**‌

  • r: 只读
  • rw: 读写
  • *: 代表所有其他用户
  • @组名: 引用用户组
  • 重要提示‌:如果在同一级目录下配置了权限,建议对该层级下的所有子目录都进行显式配置,以避免权限继承导致的访问问题。

4. 启动 SVN 服务

手动启动

使用 svnserve 命令启动服务,-d 表示后台运行,-r 指定版本库的根目录:

bash
sudo svnserve -d -r /var/svn

注意‌:-r 指定的是版本库的‌父目录‌(即 /var/svn),而不是具体的项目目录(/var/svn/myproject)。客户端连接时使用 svn://IP地址/myproject

检查服务状态

bash
ps -ef | grep svnserve

开放防火墙端口

SVN 默认使用 ‌3690‌ 端口。

‌**CentOS 7+ (firewalld):**‌

bash
sudo firewall-cmd --permanent --add-port=3690/tcp
sudo firewall-cmd --reload

‌**Ubuntu (ufw):**‌

bash
sudo ufw allow 3690/tcp

5. 客户端连接测试

在本地机器上使用 SVN 客户端(如 TortoiseSVN 或命令行)进行连接。

‌**命令行测试:**‌

bash
svn checkout svn://<服务器IP>/myproject --username developer1

输入密码后,如果能成功检出代码,则说明配置成功。

6. 常见问题与维护

修改配置后生效规则

  • 修改 passwdauthz 文件:‌立即生效‌,无需重启服务。
  • 修改 svnserve.conf 文件:‌需要重启 SVN 服务‌才能生效。

重启 SVN 服务

bash
# 查找进程 ID
ps -ef | grep svnserve
# 杀死进程 (假设 PID 为 12345)
kill -9 12345
# 重新启动
svnserve -d -r /var/svn

权限报错排查

如果客户端提示“权限不足”或“认证失败”,请检查:

  1. svnserve.conf 中的 password-dbauthz-db 路径是否正确。
  2. authz 文件中是否对访问的目录进行了显式授权。
  3. 配置文件每行是否‌顶格写‌,没有多余空格。
  4. 防火墙是否放行了 3690 端口。

开机自启(可选)

可以将启动命令加入 /etc/rc.local 或创建 systemd 服务文件以实现开机自启。

‌**Systemd 服务示例 (/etc/systemd/system/svnserve.service):**‌

ini
[Unit]
Description=Subversion Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/svnserve -d -r /var/svn
PIDFile=/var/run/svnserve.pid
Restart=on-failure

[Install]
WantedBy=multi-user.target

启用服务:

bash
sudo systemctl daemon-reload
sudo systemctl enable svnserve
sudo systemctl start svnserve