最近有机会接触到公司的新项目,对于多人参与的项目,此刻才感受到 源代码版本控制
的重要性。遗憾之余,为了加深理解和复用起见,本文将从 搭建
、配置
和 使用
多方面总结 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
Windows
:VisualSVN 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.conf
、Passwd
文件和 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 = authzPasswd 文件:在
[users]
下面添加账号和密码。1
2
3
4[users]
# 格式:账号 = 密码
kofe = 123456
lucy = 123456Authz 文件:配置用户组和权限我们可以将在 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
2svnserve -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
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
2cd /Users/kofe/procedure/idea
svn commit -m "修改部分代码 (注释修改的内容)"
SVN 基本操作原理:
svn checkout
:将服务器代码完整下载到本地。svn update
:将服务器最新的代码下载到本地。svn commit
:将本地修改的内容提交到服务器。图 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
4sample.txt.r101
sample.txt.r102
sample.txt.mine
sample.txt
手工合并
SVN 冲突 $^{[6]}$,开始的时候让人觉得害怕,但有规律可循。例如有以下文本:1
2
3
4
5
6
7
8
9
10
11
12Mayonnaise
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