# 部署和使用SVN
#### 简介
Subversion(SVN) 是一个开源的版本控制系统，管理着随时间改变的数据。这些数据放置在一个中央资料档案库(repository) 中。这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。这样您就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。
本文以CentOS 7.2 64位系统为例，说明如何在CentOS 7.2上部署和使用SVN。
#### 前提条件
- 已购买一台弹性云服务器，且已为其绑定弹性公网IP。
- 弹性云服务器所在安全组添加了如下表所示的安全组规则，具体步骤参见[为安全组添加安全组规则](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0030969470.html)。
  表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和鲲鹏)？](https://support.huaweicloud.com/ecs_faq/zh-cn_topic_0118948562.html)。
 
#### 部署SVN
SVN具有HTTP和svnserve两种访问模式，这两种模式主要存在以下区别。您可以根据业务需要，选择以下其中一种部署方式。
| **功能** | **HTTP模式**              | **svnserve模式**              |
|:---|:---|:---|
| 协议    | 使用HTTP协议进行通信。         | 使用自定义的SVN协议进行通信。           |
| 访问方式 | 支持通过Web浏览器或者SVN客户端进行访问。 | 仅支持通过SVN客户端进行访问。           |
| 端口    | 使用80端口进行通信。             | 使用3690端口进行通信。              |
| 安全性   | 通过HTTPS进行加密通信。        | 默认使用明文通信，可以通过启用加密选项进行加密通信。 |
| 配置     | 需要在Web服务器上进行配置。         | 需要在SVN服务器上进行配置。           |
| 功能支持  | 支持更多的功能，比如权限管理、日志查看等。   | 相对简单，功能较少。                |
   
- [部署HTTP访问SVN]
  1. 登录弹性云服务器。 
     具体操作请参见[Linux ECS登录方式概述](https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0013771089.html)。
     
     
  
  2. 安装SVN。 
     1. 执行以下命令，安装SVN。
        ```
        yum install subversion
        ```
        
     
     2. 执行以下命令，查看SVN版本。
        ```
        svnserve --version
        ```
        回显如下类似信息：
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002619439543.png "点击放大")
        
     
     
     
     
  
  3. 安装Apache。 
     1. 执行以下命令，安装httpd。
        ```
        yum install httpd -y
        ```
        
     
     2. 执行以下命令，查看httpd版本。
        ```
        httpd -version
        ```
        回显如下类似信息：
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002619537403.png "点击放大")
        
     
     
     
     
  
  4. 执行以下命令，安装mod_dav_svn。 
     mod_dav_svn是一个Apache HTTP服务器的模块，用于提供SVN（Subversion）版本控制系统的Web访问功能。
     ```
     yum install mod_dav_svn -y
     ```
     
     
  
  5. 创建SVN版本库。 
     1. 执行以下命令，创建目录。
        ```
        mkdir /var/svn
        ```
        
     
     2. 依次执行以下命令，创建版本库。
        ```
        cd /var/svn
        svnadmin create /var/svn/svnrepos
        ```
        
     
     3. 执行以下命令，将SVN仓库的用户组修改为apache。
        ```
        chown -R apache:apache /var/svn/svnrepos
        ```
        
     
     4. 依次执行以下命令，查看自动生成的版本库文件。
        ```
        cd svnrepos
        ls
        ```
        回显如下类似信息：
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002589159802.png "点击放大")
        Subversion目录说明如下：
        - conf目录：SVN版本库的配置文件（版本库的访问账号、权限等）。
        
        - db目录：存放所有版本控制的数据存放文件。
        
        - format文件：一个文本文件，文件中只包含一个整数，表示当前文件库配置的版本号。
        
        - hooks目录：放置hook脚本文件的目录。
        
        - locks目录：用来追踪存取文件库的客户端。
         
     
     
     
     
  
  6. 执行以下命令，增加SVN版本库的用户和密码。
     
     SVN默认使用明文密码，而HTTP并不支持明文密码，所以需要单独生成passwd文件。本示例中，增加用户userTest，密码设置为passWDTest。
     请根据实际情况选择并运行以下命令：
     - 如果您第一次增加用户，运行命令时需要带上参数-c生成文件。
       ```
       sudo htpasswd -c /var/svn/svnrepos/conf/passwd userTest
       ```
       
     
     - 如果您已经增加过用户，当后续还需要增加用户时，请运行以下命令。
       ```
       sudo htpasswd /var/svn/svnrepos/conf/passwd userTest
       ```
       
     
     
     根据提示设置用户的密码。
     
     
  
  7. 运行以下命令，进入conf目录。 
     ```
     cd /var/svn/svnrepos/conf/
     ```
     
     
  
  8. 设置账号的权限。 
     1. 执行以下命令，打开权限控制文件。
        ```
        vim authz
        ```
        
     
     2. 按**i**键进入编辑模式。
     
     3. 在末尾添加如下代码（其中，userTest为[步骤6]添加的账号，r表示读权限，w表示写权限）。
        ```
        [/]
        userTest=rw
        ```
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002589138740.png "点击放大")
        
     
     4. 按**Esc** 键退出编辑模式，并输入**:wq**保存并退出。
     
     
     
     
  
  9. 修改SVN服务配置文件。 
     1. 执行以下命令，打开SVN服务配置文件。
        ```
        vim svnserve.conf
        ```
        
     
     2. 按**i**键进入编辑模式。
     
     3. 找到如下配置行，删除行前面的注释符#和空格。
        注意：每行不能以空格开始，等号两端要有一个空格
        ```
        anon-access = read    #匿名用户可读。若设置anon-access = none，表示不允许匿名用户访问。设置为 none，可以使日志日期正常显示
        auth-access = write   #授权用户可写
        password-db = passwd  #使用哪个文件作为账号文件
        authz-db = authz      #使用哪个文件作为权限文件
        realm = /var/svn/svnrepos #认证空间名，版本库所在目录
        ```
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002588980362.png "点击放大")
        
     
     4. 按**Esc** 键退出编辑模式，并输入**:wq**保存并退出。
     
     
     
     
  
  10. 执行以下命令，启动SVN版本库。 
      ```
      svnserve -d -r /var/svn/svnrepos
      ```
      
      
  
  11. 执行以下命令，查看SVN服务是否开启。 
      ```
      ps -ef |grep svn
      ```
      回显如下类似信息，表示SVN服务已经开启。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002619420643.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
      运行**killall svnserve**命令，可停止SVN服务。
      
      
  
  12. 配置Apache。 
      1. 执行以下命令，新增并编辑httpd配置文件。
         ```
         vim /etc/httpd/conf.d/subversion.conf
         ```
         
      
      2. 按**i**键进入编辑模式。
      
      3. 在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>
         ```
         
      
      4. 按**Esc** 键退出编辑模式，并输入**:wq**保存并退出。
      
      5. 运行以下命令，启动Apache服务。
         ```
         systemctl start httpd.service
         ```
         
      
      
      
      
   
- [部署svnserve访问SVN]
  1. 登录弹性云服务器。 
     具体操作请参见[Linux ECS登录方式概述](https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0013771089.html)。
     
     
  
  2. 安装SVN。 
     1. 执行以下命令，安装SVN。
        ```
        yum install subversion
        ```
        
     
     2. 执行以下命令，查看SVN版本。
        ```
        svnserve --version
        ```
        回显如下类似信息：
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002619559417.png "点击放大")
        
     
     
     
     
  
  3. 创建SVN版本库。 
     1. 执行以下命令，创建目录。
        ```
        mkdir /var/svn
        ```
        
     
     2. 依次执行以下命令，创建版本库。
        ```
        cd /var/svn
        svnadmin create /var/svn/svnrepos
        ```
        
     
     3. 依次执行以下命令，查看自动生成的版本库文件。
        ```
        cd svnrepos
        ls
        ```
        回显如下类似信息：
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002588999896.png "点击放大")
        Subversion目录说明如下：
        - conf目录：SVN版本库的配置文件（版本库的访问账号、权限等）。
        
        - db目录：存放所有版本控制的数据存放文件。
        
        - format文件：一个文本文件，文件中只包含一个整数，表示当前文件库配置的版本号。
        
        - hooks目录：放置hook脚本文件的目录。
        
        - locks目录：用来追踪存取文件库的客户端。
         
     
     
     
     
  
  4. 设置SVN库的账号密码。
     
     1. 执行以下命令，打开用户配置文件。
        ```
        cd conf/
        vim passwd
        ```
        
     
     2. 按**i**键进入编辑模式。
     
     3. 在**\[users\]** 块中添加用户账号和密码。
        添加用户账号和密码的格式为：账号=密码。如下图示例中的user1（账号） = passwd1（密码），注意等号两端要有一个空格。
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002619559419.png "点击放大")
        
     
     4. 按**Esc** 键退出编辑模式，并输入**:wq**保存并退出。
     
     
     
     
  
  5. 设置账号的权限。 
     1. 执行以下命令，打开权限控制文件。
        ```
        vim authz
        ```
        
     
     2. 按**i**键进入编辑模式。
     
     3. 在末尾添加如下代码（其中，user1为[步骤3]添加的账号，r表示读权限，w表示写权限）。
        ```
        [/]
        user1=rw
        ```
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002588999898.png "点击放大")
        
     
     4. 按**Esc** 键退出编辑模式，并输入**:wq**保存并退出。
     
     
     
     
  
  6. 修改SVN服务配置文件。 
     1. 执行以下命令，打开SVN服务配置文件。
        ```
        vim svnserve.conf
        ```
        
     
     2. 按**i**键进入编辑模式。
     
     3. 找到如下配置行，删除行前面的注释符#和空格。
        注意：每行不能以空格开始，等号两端要有一个空格
        ```
        anon-access = read    #匿名用户可读。若设置anon-access = none，表示不允许匿名用户访问。设置为 none，可以使日志日期正常显示
        auth-access = write   #授权用户可写
        password-db = passwd  #使用哪个文件作为账号文件
        authz-db = authz      #使用哪个文件作为权限文件
        realm = /var/svn/svnrepos #认证空间名，版本库所在目录
        ```
        ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002619439545.png "点击放大")
        
     
     4. 按**Esc** 键退出编辑模式，并输入**:wq**保存并退出。
     
     
     
     
  
  7. 执行以下命令，启动SVN版本库。 
     ```
     svnserve -d -r /var/svn/svnrepos
     ```
     
     
  
  8. 执行以下命令，查看SVN服务是否开启。 
     ```
     ps -ef |grep svn
     ```
     回显如下类似信息，表示SVN服务已经开启。
     ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002589159804.png "点击放大")
     ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
     运行**killall svnserve**命令，可停止SVN服务。
     
     
   
#### 使用SVN
使用SVN管理代码的常见流程为：
1. 您提取源代码到本地（Checkout）。
2. 其他人修改并提交源代码到Repository。
3. 您获得最新的代码（Update）。
4. 您修改并调试成功源代码。
5. 提交修改后的代码到Repository，其他人即可看到您的修改（Commit）。
具体操作流程如下：
**提取源代码到本地（Checkout）**
1. 在本地Windows环境中下载并安装[TortoiseSVN客户端](https://sourceforge.net/projects/tortoisesvn/files/latest/download)。
2. 在本地项目文件夹内的空白区域单击鼠标右键。 本示例中，项目文件夹为C:\\work01。
   
3. 在弹出菜单中，选择"SVN Checkout..."。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002030955464.png "点击放大")
   
4. 填写如下参数后，单击"OK"。
   - URL of repository：版本库URL，源代码统一存放的地址，格式为svn://*实例公网IP地址*/。
   
   - Checkout directory：检出到本地的目录，本文示例中，目录为C:\\work01。
   
   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002067153537.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   第一次登录需要输入账号和密码，即[步骤3]在passwd文件中设置的用户和密码。
   检出完成结果如下。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002067194893.png "点击放大")
   
**获取更新（Update）**
SVN服务端系统库上的项目更新后，您可在本地项目文件空白处单击右键，选择"SVN Update"，即可自动完成下载最新项目，并会显示所有更新内容。
![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002031113860.png "点击放大")
![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
在原项目文件夹内选择SVN Update，会自动覆盖原有内容。建议您先备份，再更新，防止自己本来的项目内容丢失。
**提交修改（Commit）**
1. 在项目文件空白处单击右键，选择"SVN Commit..."。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002030955488.png "点击放大")
   
2. 输入本次提交的版本更新信息（所做修改的注释），选中要提交的操作内容，单击"OK"。 即可将本地项目提交到SVN服务器资源库，覆盖资源库项目从而实现更新。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002067153569.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   如果提交时出现冲突，即两人都提交修改，后提交者由于版本落后会提交失败。这时，您可以先备份自己的项目，然后从服务端下载最新的项目，并将自己的项目覆盖到本地项目文件夹，再单击SVN提交即可成功提交。
   
 
#### 常见问题
**问题描述：**
为什么使用TortoiseSVN访问SVN服务器时服务连接，提示"主机没有反应"？
![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002619439099.png "点击放大")
**可能原因：**
- SVN服务器未启动
- 安全组中未开放SVN服务器所需端口
- ECS实例开启了firewalld防火墙，但是未放行SVN服务器所需的端口
**处理方法：**
1. 执行以下命令，查看SVN服务状态。
   ```
   ps -ef |grep svn
   ```
   返回如下所示信息时，表示SVN服务已经开启。如果未返回以下信息，请执行**svnserve -d -r /var/svn/svnrepos/**启动SVN服务。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002619559421.png "点击放大")
   
2. 查看ECS实例所在安全组规则是否满足SVN服务器要求。
   - HTTP模式：开放22、80、443
   
   - svnserve模式：开放22、80、443、3690
    
3. 查看firewalld防火墙。
   1. 查看firewalld防火墙状态。
      ```
      firewall-cmd --state
      ```
      - 回显信息为not running说明firewalld防火墙未开启，对SVN服务器无影响。
      
      - 回显信息为running说明firewalld防火墙已开启，请继续执行下一步。
       
   
   2. 在firewalld规则中放行SVN服务器所需端口（例如3690）。
      ```
      firewall-cmd --add-port=3690/tcp --permanent
      ```
      
   
   3. 重新加载firewalld服务配置，使配置生效。
      ```
      systemctl reload firewalld
      ```
      
    
 
