部署和使用SVN
简介
Subversion(SVN) 是一个开源的版本控制系统,管理着随时间改变的数据。这些数据放置在一个中央资料档案库(repository) 中。这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。这样您就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。
本文以CentOS 7.2 64位系统为例,说明如何在CentOS 7.2上部署和使用SVN。
前提条件
- 已购买一台弹性云服务器,且已为其绑定弹性公网IP。
- 弹性云服务器所在安全组添加了如下表所示的安全组规则,具体步骤参见为安全组添加安全组规则。
表1 安全组规则 方向
优先级
策略
类型
协议端口
源地址
入方向
1
允许
IPv4
TCP: 22
0.0.0.0/0
入方向
1
允许
IPv4
TCP: 80
0.0.0.0/0
入方向
1
允许
IPv4
TCP: 443
0.0.0.0/0
入方向
1
允许
IPv4
TCP: 3690
0.0.0.0/0
- 为了更好地获取和更新系统和软件,建议您更新镜像源为华为云镜像源,详细操作,请参见如何使用华为云开源镜像配置yum源(x86_64和鲲鹏)?。
部署SVN
SVN具有HTTP和svnserve两种访问模式,这两种模式主要存在以下区别。您可以根据业务需要,选择以下其中一种部署方式。
| 功能 | HTTP模式 | svnserve模式 |
|---|---|---|
| 协议 | 使用HTTP协议进行通信。 | 使用自定义的SVN协议进行通信。 |
| 访问方式 | 支持通过Web浏览器或者SVN客户端进行访问。 | 仅支持通过SVN客户端进行访问。 |
| 端口 | 使用80端口进行通信。 | 使用3690端口进行通信。 |
| 安全性 | 通过HTTPS进行加密通信。 | 默认使用明文通信,可以通过启用加密选项进行加密通信。 |
| 配置 | 需要在Web服务器上进行配置。 | 需要在SVN服务器上进行配置。 |
| 功能支持 | 支持更多的功能,比如权限管理、日志查看等。 | 相对简单,功能较少。 |
- 登录弹性云服务器。
具体操作请参见Linux ECS登录方式概述。
- 安装SVN。
- 执行以下命令,安装SVN。
yum install subversion
- 执行以下命令,查看SVN版本。
svnserve --version
回显如下类似信息:

- 执行以下命令,安装SVN。
- 安装Apache。
- 执行以下命令,安装httpd。
yum install httpd -y
- 执行以下命令,查看httpd版本。
httpd -version
回显如下类似信息:

- 执行以下命令,安装httpd。
- 执行以下命令,安装mod_dav_svn。
mod_dav_svn是一个Apache HTTP服务器的模块,用于提供SVN(Subversion)版本控制系统的Web访问功能。
yum install mod_dav_svn -y
- 创建SVN版本库。
- 执行以下命令,创建目录。
mkdir /var/svn
- 依次执行以下命令,创建版本库。
cd /var/svn svnadmin create /var/svn/svnrepos
- 执行以下命令,将SVN仓库的用户组修改为apache。
chown -R apache:apache /var/svn/svnrepos
- 依次执行以下命令,查看自动生成的版本库文件。
cd svnrepos ls
回显如下类似信息:

Subversion目录说明如下:
- conf目录:SVN版本库的配置文件(版本库的访问账号、权限等)。
- db目录:存放所有版本控制的数据存放文件。
- format文件:一个文本文件,文件中只包含一个整数,表示当前文件库配置的版本号。
- hooks目录:放置hook脚本文件的目录。
- locks目录:用来追踪存取文件库的客户端。
- 执行以下命令,创建目录。
- 执行以下命令,增加SVN版本库的用户和密码。
SVN默认使用明文密码,而HTTP并不支持明文密码,所以需要单独生成passwd文件。本示例中,增加用户userTest,密码设置为passWDTest。
请根据实际情况选择并运行以下命令:
- 如果您第一次增加用户,运行命令时需要带上参数-c生成文件。
sudo htpasswd -c /var/svn/svnrepos/conf/passwd userTest
- 如果您已经增加过用户,当后续还需要增加用户时,请运行以下命令。
sudo htpasswd /var/svn/svnrepos/conf/passwd userTest
根据提示设置用户的密码。
- 如果您第一次增加用户,运行命令时需要带上参数-c生成文件。
- 运行以下命令,进入conf目录。
cd /var/svn/svnrepos/conf/
- 设置账号的权限。
- 执行以下命令,打开权限控制文件。
vim authz
- 按i键进入编辑模式。
- 在末尾添加如下代码(其中,userTest为步骤6添加的账号,r表示读权限,w表示写权限)。
[/] userTest=rw

- 按Esc键退出编辑模式,并输入:wq保存并退出。
- 执行以下命令,打开权限控制文件。
- 修改SVN服务配置文件。
- 执行以下命令,打开SVN服务配置文件。
vim svnserve.conf
- 按i键进入编辑模式。
- 找到如下配置行,删除行前面的注释符#和空格。 注意:每行不能以空格开始,等号两端要有一个空格
anon-access = read #匿名用户可读。若设置anon-access = none,表示不允许匿名用户访问。设置为 none,可以使日志日期正常显示 auth-access = write #授权用户可写 password-db = passwd #使用哪个文件作为账号文件 authz-db = authz #使用哪个文件作为权限文件 realm = /var/svn/svnrepos #认证空间名,版本库所在目录

- 按Esc键退出编辑模式,并输入:wq保存并退出。
- 执行以下命令,打开SVN服务配置文件。
- 执行以下命令,启动SVN版本库。
svnserve -d -r /var/svn/svnrepos
- 执行以下命令,查看SVN服务是否开启。
ps -ef |grep svn
回显如下类似信息,表示SVN服务已经开启。

运行killall svnserve命令,可停止SVN服务。
- 配置Apache。
- 执行以下命令,新增并编辑httpd配置文件。
vim /etc/httpd/conf.d/subversion.conf
- 按i键进入编辑模式。
- 在subversion.conf文件中输入以下配置信息。
<Location /svn> DAV svn SVNParentPath /var/svn AuthType Basic AuthName "Authorization SVN" AuthzSVNAccessFile /var/svn/svnrepos/conf/authz AuthUserFile /var/svn/svnrepos/conf/passwd Require valid-user </Location>
- 按Esc键退出编辑模式,并输入:wq保存并退出。
- 运行以下命令,启动Apache服务。
systemctl start httpd.service
- 执行以下命令,新增并编辑httpd配置文件。
- 登录弹性云服务器。
具体操作请参见Linux ECS登录方式概述。
- 安装SVN。
- 执行以下命令,安装SVN。
yum install subversion
- 执行以下命令,查看SVN版本。
svnserve --version
回显如下类似信息:

- 执行以下命令,安装SVN。
- 创建SVN版本库。
- 执行以下命令,创建目录。
mkdir /var/svn
- 依次执行以下命令,创建版本库。
cd /var/svn svnadmin create /var/svn/svnrepos
- 依次执行以下命令,查看自动生成的版本库文件。
cd svnrepos ls
回显如下类似信息:

Subversion目录说明如下:
- conf目录:SVN版本库的配置文件(版本库的访问账号、权限等)。
- db目录:存放所有版本控制的数据存放文件。
- format文件:一个文本文件,文件中只包含一个整数,表示当前文件库配置的版本号。
- hooks目录:放置hook脚本文件的目录。
- locks目录:用来追踪存取文件库的客户端。
- 执行以下命令,创建目录。
- 设置SVN库的账号密码。
- 执行以下命令,打开用户配置文件。
cd conf/ vim passwd
- 按i键进入编辑模式。
- 在[users]块中添加用户账号和密码。
添加用户账号和密码的格式为:账号=密码。如下图示例中的user1(账号) = passwd1(密码),注意等号两端要有一个空格。

- 按Esc键退出编辑模式,并输入:wq保存并退出。
- 执行以下命令,打开用户配置文件。
- 设置账号的权限。
- 执行以下命令,打开权限控制文件。
vim authz
- 按i键进入编辑模式。
- 在末尾添加如下代码(其中,user1为步骤3添加的账号,r表示读权限,w表示写权限)。
[/] user1=rw

- 按Esc键退出编辑模式,并输入:wq保存并退出。
- 执行以下命令,打开权限控制文件。
- 修改SVN服务配置文件。
- 执行以下命令,打开SVN服务配置文件。
vim svnserve.conf
- 按i键进入编辑模式。
- 找到如下配置行,删除行前面的注释符#和空格。 注意:每行不能以空格开始,等号两端要有一个空格
anon-access = read #匿名用户可读。若设置anon-access = none,表示不允许匿名用户访问。设置为 none,可以使日志日期正常显示 auth-access = write #授权用户可写 password-db = passwd #使用哪个文件作为账号文件 authz-db = authz #使用哪个文件作为权限文件 realm = /var/svn/svnrepos #认证空间名,版本库所在目录

- 按Esc键退出编辑模式,并输入:wq保存并退出。
- 执行以下命令,打开SVN服务配置文件。
- 执行以下命令,启动SVN版本库。
svnserve -d -r /var/svn/svnrepos
- 执行以下命令,查看SVN服务是否开启。
ps -ef |grep svn
回显如下类似信息,表示SVN服务已经开启。

运行killall svnserve命令,可停止SVN服务。
使用SVN
使用SVN管理代码的常见流程为:
- 您提取源代码到本地(Checkout)。
- 其他人修改并提交源代码到Repository。
- 您获得最新的代码(Update)。
- 您修改并调试成功源代码。
- 提交修改后的代码到Repository,其他人即可看到您的修改(Commit)。
具体操作流程如下:
提取源代码到本地(Checkout)
- 在本地Windows环境中下载并安装TortoiseSVN客户端。
- 在本地项目文件夹内的空白区域单击鼠标右键。
- 在弹出菜单中,选择“SVN Checkout...”。
- 填写如下参数后,单击“OK”。
- URL of repository:版本库URL,源代码统一存放的地址,格式为svn://实例公网IP地址/。
- Checkout directory:检出到本地的目录,本文示例中,目录为C:\work01。

检出完成结果如下。

获取更新(Update)
SVN服务端系统库上的项目更新后,您可在本地项目文件空白处单击右键,选择“SVN Update”,即可自动完成下载最新项目,并会显示所有更新内容。

在原项目文件夹内选择SVN Update,会自动覆盖原有内容。建议您先备份,再更新,防止自己本来的项目内容丢失。
提交修改(Commit)
常见问题
问题描述:
为什么使用TortoiseSVN访问SVN服务器时服务连接,提示“主机没有反应”?

可能原因:
- SVN服务器未启动
- 安全组中未开放SVN服务器所需端口
- ECS实例开启了firewalld防火墙,但是未放行SVN服务器所需的端口
- 执行以下命令,查看SVN服务状态。
ps -ef |grep svn
返回如下所示信息时,表示SVN服务已经开启。如果未返回以下信息,请执行svnserve -d -r /var/svn/svnrepos/启动SVN服务。

- 查看ECS实例所在安全组规则是否满足SVN服务器要求。
- HTTP模式:开放22、80、443
- svnserve模式:开放22、80、443、3690
- 查看firewalld防火墙。
- 查看firewalld防火墙状态。
firewall-cmd --state
- 回显信息为not running说明firewalld防火墙未开启,对SVN服务器无影响。
- 回显信息为running说明firewalld防火墙已开启,请继续执行下一步。
- 在firewalld规则中放行SVN服务器所需端口(例如3690)。
firewall-cmd --add-port=3690/tcp --permanent
- 重新加载firewalld服务配置,使配置生效。
systemctl reload firewalld
- 查看firewalld防火墙状态。


