SVN 环境搭建与使用

最近有机会接触到公司的新项目,对于多人参与的项目,此刻才感受到 源代码版本控制 的重要性。遗憾之余,为了加深理解和复用起见,本文将从 搭建配置使用 多方面总结 SVN ( Subversion,开放源代码的版本控制系统 )。

当然,版本控制的工具有很多,比如 CVS、GIT、SVN。CVS 几乎淘汰;GIT 适合开源软件项目;SVN 适合企业内部由项目经理统一协调的多个并行项目的开发。考虑到种种因素,我们不能单方面评论每种版本控制工具的优劣,故选择哪款版本控制工具视具体情况而定。

源代码管理

介绍参考了资料 [1]。

管理的意义

  • 目的:为了解决在软件开发过程中,由源代码引发的各种繁琐的问题。
  • 作用:
    • 能追踪一个项目从诞生一直到定案的过程;
    • 记录一个项目的所有内容变化,方便地查阅特定版本的修订情况.
  • 常见问题:
    • 代码冲突:多人操作同一个文件 ( 团队开发中的常见问题 );
    • 版本备份:费空间 ( 大数据时代,储存成本反而最 “廉价” );
    • 权限控制:无法对源代码进行精确的权限控制;

管理的工具

  • CVS:历史悠久,现在几乎没人使用。
  • SVN:
    • 集中式版本控制的代表;
    • CVS 的接班人,速度和功能比 CVS 有很大幅度提升.
  • GIT:
    • 分布式源代码管理工具;
    • 目前被大多数开源项目使用。

SVN 概念概述

  • Subversion 的简称为 SVN,是一个开放源代码的版本控制系统;
  • SVN 用于多个人共同开发同一个项目,目的是为了资源共享共用;
  • SVN 服务器有 2 种 运行方式:独立服务器和借助 Apache。两种方式各有利弊,可自行选择。
  • SVN 存储版本数据 也有 2 种方式:Berkeley DB ( 事务安全型表类型 ) 和 FSFS ( 不需要数据库的存储系统 )。因为 Berkeley DB 方式在服务器中断时,有可能锁住数据,故选择 FSFS 的存储方式会更安全一点。

SVN 环境搭建

SVN 服务器

  • 安装 SVN Server For WindowsVisualSVN Server

    配置是通过界面操作完成的,具体安装流程就不阐述了,可参考引用文章完成配置 $^{[1,2]}$。

    Tips.01. 安装过程中,其中 SVN 服务器端口配置推荐使用HTTPS 的 8443 端口,因为 HTTPS 安全性比較高,尽管 443 是标准 HTTPSport。
    Tips.02. 还有就是用于验证的身份配置:Windows 验证和 Subversion 身份验证,默认是 Subversion 身份验证。

  • 安装 SVN Server For MacOS:MacOS 自带了 SVN 的服务器端和客户端功能。参考引用文章完成配置即可使用 $^{[3,4]}$。

SVN 客户端

  • Windows Client:TortoiseSVN
  • MacOS Client:Cornerstone

    在 MacOS 上可利用 SVN 图形界面工具来管理源代码,可以大大减小使用命令行的痛苦 $^{[5]}$。

SVN 配置与使用

Windows 端配置和使用 SVN,可通过图形界面工具即可完成操作,详细的步骤在引用文章 [1]、[2] 中也有提及。故在本章节主要讲述 Mac 环境下搭建和配置 SVN。

SVN 服务端配置

创建代码仓库
  • Step.01. 新建一个 svn 目录,例如 /Users/kofe/svn,以后可在 svn 目录下创建多个仓库目录。
  • Step.02. 打开终端,创建一个名为 idea 仓库,输入指令:

    1
    2
    # 指令执行成功后,会发现硬盘上多了个 /Users/kofe/svn/idea 目录
    svnadmin create /Users/kofe/svn/idea
配置用户权限

主要是修改 /svn/idea/conf 目录下的三个文件:svnserve.confPasswd 文件和 Authz 文件。

  • svnserve.conf

    1
    2
    3
    4
    5
    6
    # anon-access = read 代表匿名访问的时候是只读的
    # anon-access = none 代表禁止匿名访问,需要帐号密码才能访问
    anon-access = read
    auth-access = write
    password-db = passwd
    authz-bd = authz
  • Passwd 文件:在 [users] 下面添加账号和密码。

    1
    2
    3
    4
    [users]
    # 格式:账号 = 密码
    kofe = 123456
    lucy = 123456
  • Authz 文件:配置用户组和权限我们可以将在 Passwd 里添加的用户分配到不同的用户组里。以后就可对不同用户组设置不同的权限,没有必要对每个用户进行单独设置权限。即在 [groups] 下面添加组名和用户名,多个用户之间用逗号 , 隔开。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [groups] 
    usergroup = kofe, lucy # 格式:组名 = 用户1, 用户2, ...

    # 使用 [/] 代表 SVN 服务器中的所有资源库
    # 某个组有读写权限
    [/]
    @usergroup = rw

    # 使用 [/] 代表 SVN 服务器中的所有资源库
    # 某个用户有读写权限
    # lucy = rw
启动关闭服务
  • 在终端输入下列指令:若没有任何提示,恭喜你启动成功。

    1
    2
    svnserve -d -r /Users/kofe/svn
    # 或输入: svnserve -d -r /User/kofe/svn/idea
  • 当然,会启用也要会关闭 SVN 服务器,特别是首次配置完 SVN 服务器需要重启。
    Case.01. 在 活动监视器 中搜索 svn, 在列表中找到进程 svnserve, 点击左上角的强制退出进程
    Case.02. 或者可通过 shell 脚本实现一键关闭。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
    echo "Current Process List:"
    echo "= = = = = = = = = = ="
    ps -A | grep svn
    echo "= = = = = = = = = = ="
    kill `pgrep "svn"`

    echo "Kill successfully!" Current Process Status:
    echo "= = = = = = = = = = = = = = = = = = = = = ="
    ps -A | grep svn
    echo "= = = = = = = = = = = = = = = = = = = = = ="

SVN 客户端操作

代码版本控制

当然,充分利用 SVN 图形界面工具 ( Cornerstone ) 来管理源代码,可大大减小使用命令行的痛苦,提升使用效率。

  • 首次导入工程文件到 SVN 服务器:

    1
    2
    3
    4
    5
    # /Users/kofe/procedure/idea/SSM_DEMO,指的是需要导入的工程文件
    # svn://localhost/idea 指把工程文件上传到 idea 目录下
    # --username=admin --password=123456 指的是校验用户名和密码
    # -m "初始化导入" 指的是提交的信息注释
    svn import /Users/kofe/procedure/idea/SSM_DEMO svn://localhost/idea --username=kofe --password=123456 -m "初始化导入"
  • 从 SVN 服务器下载工程文件到本地 ( Checkout ):

    1
    svn checkout svn://localhost/idea --username=kofe --password=123456 /Users/kofe/procedure/idea
  • 二次提交代码到服务器:二次提交是有一个前提的, 那就是你首先需要在 SVN服务器上下载代码到本地,然后再去修改这一份代码, 才能够二次提交。

    1
    2
    cd /Users/kofe/procedure/idea
    svn commit -m "修改部分代码 (注释修改的内容)"
  • SVN 基本操作原理:

    • svn checkout:将服务器代码完整下载到本地。
    • svn update:将服务器最新的代码下载到本地。
    • svn commit:将本地修改的内容提交到服务器。

      图3-1SVN 基本操作原理

      图 3-1 SVN 基本操作原理
代码版本冲突
  • 版本冲突原因:

    假设 A、B 两用户都在版本号为 100 时更新了 sample.txt 文件,A 用户在修改完成之后提交 sample.txt 到服务器,这个时候提交成功,这个时候 sample.txt 文件的版本号已经变成 101 了。同时 B 用户在版本号为 100 的 sample.txt 文件上作修改,修改完成之后提交到服务器时,由于不是在当前最新的 101 版本上作的修改,所以导致提交失败。

  • 版本冲突现象:

    冲突发生时,SVN 会在当前工作目录中保存所有的目标文件版本 [ 上次更新版本、当前获取的版本 ( 即别人提交的版本 )、自己更新的版本、目标文件 ]。 假设文件名是 sample.txt ,对应的文件名分别是 ( 同时在目标文件中标记来自不同用户的更改 ):

    1
    2
    3
    4
    sample.txt.r101
    sample.txt.r102
    sample.txt.mine
    sample.txt
  • 手工合并 SVN 冲突 $^{[6]}$,开始的时候让人觉得害怕,但有规律可循。例如有以下文本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Mayonnaise
    Lettuce
    Tomato
    Provolone
    <<<<<<<.mine
    Salami
    Mortadella
    Prosciutto
    =======
    Sauerkraut
    GrilledChicken
    >>>>>>>.r2

    一连串的大于、小于、等于号是 SVN 冲突标记,这些数据得全部删除才可以提交。在 SVN 冲突区中,或许你需要和你的同事沟通来安排冲突区的文本内容,待所有冲突区得到合理的解决之后方可再提交文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 是你在冲突区里面做的修改
    <<<<<<<.mine
    Salami
    Mortadella
    Prosciutto
    =======

    // 是别人在冲突区做的修改
    Sauerkraut
    GrilledChicken
    >>>>>>>.r2
  • 如何降低冲突解决的复杂度:
    • 在提交时写上明确的 Message ( 注释 ),方便以后查找用户更新的原因。
    • 养成良好的使用习惯,使用 SVN 时每次都是先提交,后更新。每天 早上 打开后,首先要从版本库 获取最新版本,每天 下班前 必须将已经编辑过的文档都 提交 到版本库。

参考资料

[1] PhelanGeek. SVN 服务器搭建教程. jianshu.com. 2016
[2] RealLiuNing. Windows 10 搭建独立 SVN 服务器. jianshu.com. 2018
[3] CainLuo. 搭建 MacOS 本地 SVN 服务器. juejin.im. 2016
[4] Sunny Fight. iOS 版本控制 SVN (Mac 环境下 SVN 的使用). jianshu.com. 2016
[5] 天蓝. SVN 在 Mac 上使用 Xcode+Cornerstone. jianshu.com. 2017
[6] aaronGao. svn conflict 冲突解决. cnbologs.com. 2016