Subversion (SVN) 简介
Subversion 是一个开源的版本控制系统,用于管理文件和目录的变更,它集中式管理,所有版本数据都存储在中央服务器上,开发者通过客户端连接到服务器,进行检出、提交、更新等操作。

核心概念:
- 仓库: 存储所有文件和版本历史记录的地方,一个服务器上可以有多个仓库。
- 检出: 从仓库下载文件到本地工作副本。
- 提交: 将本地工作副本的更改上传到仓库。
- 更新: 从仓库获取最新的更改到本地工作副本。
在 Linux (CentOS 7/8) 上搭建 SVN 服务器
这是最常见和推荐的服务器环境,通常使用 httpd (Apache) 作为服务前端,可以通过 Web 浏览器访问和操作仓库。
第一步:安装 SVN 和 Apache
更新你的系统包列表,然后安装 subversion 和 httpd。
# 1. 更新系统 sudo yum update -y # 2. 安装 SVN 服务器和 Apache Web 服务器 sudo yum install -y subversion httpd
第二步:创建 SVN 仓库
我们选择在 /var/svn 目录下创建仓库,这是一个常见的实践。

# 1. 创建仓库目录 sudo mkdir -p /var/svn # 2. 创建一个新的仓库,例如名为 "myproject" # svnadmin create 命令会创建一个包含所有必要文件的仓库目录结构 sudo svnadmin create /var/svn/myproject # 3. 设置仓库目录的所有权 # 让 Apache 进程 (apache 用户) 可以读写仓库 sudo chown -R apache:apache /var/svn/myproject
第三步:配置 Apache 访问 SVN
我们需要配置 Apache 来提供 SVN 服务的 Web 访问方式。
-
创建 Apache 配置文件
在 Apache 的配置目录下为你的 SVN 仓库创建一个配置文件。
sudo vi /etc/httpd/conf.d/svn.conf
-
添加以下内容到
svn.conf文件中# 设置 SVN 仓库的根目录 <Location /svn> # 指定 SVN 仓库的路径 DAV svn # SVNParentPath 指向包含所有仓库的父目录 SVNParentPath /var/svn # 认证类型,可以是 Basic(基础)或 Digest(,Digest 更安全 AuthType Basic # 认证领域,提示用户输入凭据时显示 AuthName "SVN Repository" # 指定用户密码文件 AuthUserFile /etc/svn/passwd # 指定用户权限文件 AuthzSVNAccessFile /etc/svn/authz # 控制访问权限,默认拒绝所有 Require valid-user </Location>
第四步:创建用户和密码
Apache 的基本认证需要一个密码文件来存储用户名和加密后的密码。
-
创建密码文件并添加第一个用户
我们使用
htpasswd命令来管理密码文件。-c参数表示创建新文件。# 创建用户 'admin',首次创建需要 -c sudo htpasswd -c /etc/svn/passwd admin
系统会提示你为
admin用户设置密码。 -
添加更多用户
当添加第二个及以后的用户时,不要使用
-c参数,否则会覆盖原有文件。sudo htpasswd /etc/svn/passwd user1 sudo htpasswd /etc/svn/passwd user2
第五步:配置用户权限
现在创建一个权限文件来定义哪些用户可以访问哪些仓库,以及他们的权限(读 r,写 w)。
-
创建权限文件
sudo vi /etc/svn/authz
-
添加以下权限规则
# [groups] 定义用户组 [groups] # 定义一个名为 'developers' 的组,包含 user1 和 user2 developers = user1, user2 # [/] 表示根目录下的所有仓库 # @developers 表示 'developers' 组 # rw 表示读写权限 [/] * = r # 所有人都有读权限 @developers = rw # developers 组有读写权限 admin = rw # admin 用户有读写权限 # [myproject:/] 特定 'myproject' 仓库的根目录 # 你可以为不同仓库设置不同权限 [myproject:/] @developers = rw admin = rw # [myproject:/branches] 特定路径的权限 # [myproject:/tags] # [myproject:/trunk]
第六步:启动并设置开机自启
现在启动 Apache 服务并设置它开机自动启动。
# 启动 Apache sudo systemctl start httpd # 设置开机自启 sudo systemctl enable httpd # 检查服务状态 sudo systemctl status httpd
第七步:配置防火墙
如果服务器开启了防火墙,需要开放 HTTP (80) 和 HTTPS (443) 端口。
# 永久开放 HTTP 端口 sudo firewall-cmd --permanent --add-service=http # 重新加载防火墙配置 sudo firewall-cmd --reload
第八步:测试访问
-
通过命令行测试
使用
svn客户端命令行工具进行测试。# 检出仓库到本地 # URL 格式为 http://<你的服务器IP>/svn/<仓库名> svn checkout http://192.168.1.100/svn/myproject
系统会提示你输入用户名和密码,输入
admin及其密码,如果成功,会在当前目录下创建一个myproject文件夹。 -
通过浏览器测试
在浏览器中访问
http://<你的服务器IP>/svn/myproject。 如果配置正确,浏览器会弹出登录对话框,输入用户名和密码后,你应该能看到仓库的目录结构(branches,tags,trunk)。
在 Windows 上搭建 SVN 服务器
在 Windows 上,我们可以使用 svnserve,这是 SVN 自带的独立服务器进程,配置更简单,但不如 Apache 方式功能强大(如无法通过 Web 浏览器直接访问)。
第一步:下载并安装 SVN for Windows
-
访问 VisualSVN Server 官网 或 SlikSVN 官网。
- VisualSVN Server: 强烈推荐给新手,它是一个集成的、易于安装和管理的 SVN 服务器包,自带图形化管理界面。
- SlikSVN: 只包含命令行工具和
svnserve服务,适合熟悉命令行的用户。
-
下载并运行安装程序,这里以 VisualSVN Server 为例,安装过程非常直观,一路 "Next" 即可,安装时会自动安装 Apache 服务,并配置好 HTTPS 访问。
第二步:使用 VisualSVN Server 创建仓库
- 安装完成后,开始菜单中找到 "VisualSVN Server Manager" 并打开。
- 在左侧的 "Repositories" 上右键,选择 "Create New Repository"。
- 输入仓库名称(如
myproject),选择布局(建议选择 "Standard layout"),然后点击 "OK"。 - 仓库创建成功后,它会自动启动。
第三步:配置用户和权限
VisualSVN Server 的图形界面非常友好。
- 在左侧的 "Users" 上右键,选择 "Create User...",创建用户(如
admin,user1,user2)。 - 在左侧的 "Groups" 上右键,可以创建用户组(如
developers),并将用户添加到组中。 - 右键点击你创建的仓库 (
myproject),选择 "Properties"。 - 在 "Security" 选项卡中,你可以为用户或组分配权限:
Read: 只读权限。Read/Write: 读写权限。Deny: 拒绝访问。
第四步:访问 SVN 仓库
VisualSVN Server 默认使用 HTTPS,更安全。
-
通过命令行测试
# 使用 `svn` 命令行工具 # URL 格式为 https://<你的服务器IP>/<仓库名> svn checkout https://localhost/svn/myproject
系统会提示你输入用户名和密码。
-
通过 TortoiseSVN (图形化客户端) 测试
- 在任意文件夹空白处右键,选择 "SVN Checkout..."。
- 在 URL of repository 中输入
https://localhost/svn/myproject。 - 在 "Checkout directory" 中选择一个本地路径。
- 点击 "OK",会弹出登录框,输入用户名和密码。
安全建议
- 始终使用 HTTPS: 如果你使用 Apache,强烈建议配置 SSL/TLS 证书,将 HTTP 流量重定向到 HTTPS,以加密数据传输,防止密码泄露。
- 使用强密码: 为 SVN 用户设置复杂且不易猜测的密码。
- 最小权限原则: 只授予用户完成其工作所必需的最小权限,不要随意给所有用户
rw权限。 - 定期备份: 仓库是项目的核心资产,必须定期备份,备份整个仓库目录即可。
- 考虑现代替代品: 对于新项目,可以考虑使用 Git,Git 是分布式版本控制系统,功能更强大,分支管理更灵活,是目前的主流选择,SVN 仍在一些特定领域(如需要精细权限控制的集中式环境)有应用。
