最近有机会接触到公司的新项目,对于多人参与的项目,充分感受到 源代码的版本控制
的重要性。为了深刻理解和复用起见,本文将从 搭建
、配置
和 使用
多方面总结 SVN。
当然,版本控制的工具有很多,譬如 CVS、GIT、SVN,CVS 几乎淘汰;GIT 适合开源软件项目;SVN 适合企业内部由项目经理统一协调的多个并行项目的开发。选择哪款版本控制工具视具体情况而定。
源代码管理
介绍参考了资料 [1]。
管理工具
- CVS:历史悠久,现在几乎没人使用。
- SVN:
- 集中式版本控制的代表;
- CVS 的接班人,速度和功能比 CVS 有很大幅度提升.
- GIT:
- 分布式源代码管理工具;
- 目前被大多数开源项目使用。
管理意义
- 目的:为了解决在软件开发过程中,由源代码引发的各种繁琐的问题。
- 作用:
- 能追踪一个项目从诞生一直到定案的过程;
- 记录一个项目的所有内容变化,方便地查阅特定版本的修订情况.
- 常见问题:
- 无法后悔:做错了一个操作后,没有后悔药可以吃;
- 版本备份:费空间、费时间;
- 版本混乱:因版本备份过多造成混乱,难于找回正确的想要的版本;
- 代码冲突:多人操作同一个文件 ( 团队开发中的常见问题 );
- 权限控制:无法对源代码进行精确的权限控制;
- 追究责任:出现了严重的 BUG,无法得知是谁干的,容易耍赖.
概念概述
- Subversion 的简称,SVN 是一个开放源代码的版本控制系统;
- SVN 用于多个人共同开发同一个项目,共用资源;
- SVN 服务器有 2 种
运行方式
:独立服务器和借助 Apache。两种方式各有利弊,可自行选择。 - SVN
存储版本数据
也有 2 种方式:Berkeley DB
( 事务安全型表类型 ) 和FSFS
( 不需要数据库的存储系统 )。因为 Berkeley DB 方式在服务器中断时,有可能锁住数据,故选择 FSFS 方式更安全一点。
环境搭建
SVN 服务器
-
安装 SVN For Windows:VisualSVN Server
具体安装流程就不阐述了,可参考其他文章完成配置
。
Tips.01. 安装过程中,其中 SVN 服务器端口配置推荐使用HTTPS 的
8443
端口,因为 HTTPS 安全性比較高,尽管443
是标准 HTTPSport。
Tips.02. 还有就是用于验证的身份配置:Windows 验证和 Subversion 身份验证,默认是 Subversion 身份验证。 -
安装 SVN For MacOS:自带了 SVN 的服务器端和客户端功能。参考其他文章完成配置即可
。
SVN 客户端
-
Windows Client:TortoiseSVN
-
MacOS Client:Cornerstone
在 Mac 上可利用 SVN 图形界面工具来管理源代码,可以大大减小使用命令行的痛苦
。
SVN 配置与使用
Windows 端配置和使用 SVN 可通过图形界面工具即可完成操作,详细的步骤在 [1]、[2] 中也有提及。
故在本章节主要讲述 Mac 环境下搭建和配置 SVN。
创建代码仓库
-
Step.01. 新建一个
svn
目录,例如/Users/kofe/svn
,以后可在svn
目录下创建多个仓库目录。 -
Step.02. 打开终端,创建一个名为
idea
仓库,输入指令:# 指令执行成功后,会发现硬盘上多了个 /Users/kofe/svn/idea 目录 svnadmin create /Users/apple/svn/idea
配置用户权限
主要是修改 /svn/idea/conf
目录下的三个文件:svnserve.conf
、Passwd
文件和 Authz
文件。
-
svnserve.conf
# anon-access = read 代表匿名访问的时候是只读的 # anon-access = none 代表禁止匿名访问,需要帐号密码才能访问 anon-access = read auth-access = write password-db = passwd authz-bd = authz
-
Passwd 文件:在
[users]
下面添加账号和密码。[users] # 格式:账号 = 密码 kofe = 123456 lucy = 123456
-
Authz 文件:配置用户组和权限我们可以将在 Passwd 里添加的用户分配到不同的用户组里。以后就可对不同用户组设置不同的权限,没有必要对每个用户进行单独设置权限。即在
[groups]
下面添加组名和用户名,多个用户之间用逗号 , 隔开。[groups] usergroup = kofe, lucy # 格式:组名 = 用户1, 用户2, ... # 使用 [/] 代表 SVN 服务器中的所有资源库 # 某个组有读写权限 [/] @usergroup = rw # 使用 [/] 代表 SVN 服务器中的所有资源库 # 某个用户有读写权限 # lucy = rw
启动关闭服务
-
在终端输入下列指令:若没有任何提示,恭喜你启动成功。
svnserve -d -r /Users/kofe/svn # 或输入: svnserve -d -r /User/kofe/svn/idea
-
当然,会启用也要会关闭 SVN 服务器,特别是首次配置完 SVN 服务器需要重启。
Case.01. 在活动监视器
中搜索svn
, 在列表中找到进程svnserve
, 点击左上角的强制退出进程
。
Case.02. 或者可通过 shell 脚本实现一键关闭。#!/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 图形界面工具 ( Cornerstone ) 来管理源代码,可大大减小使用命令行的痛苦,提升使用效率。
-
首次导入工程文件到 SVN 服务器:
# /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 ):
svn checkout svn://localhost/idea --username=kofe --password=123456 /Users/kofe/procedure/idea
-
二次提交代码到服务器:二次提交是有一个前提的, 那就是你首先需要在 SVN服务器上下载代码到本地,然后再去修改这一份代码, 才能够二次提交。
cd /Users/kofe/procedure/idea svn commit -m "修改部分代码 (注释修改的内容)"
-
SVN 基本操作原理:
-
svn checkout
:将服务器代码完整下载到本地。 -
svn update
:将服务器最新的代码下载到本地。 -
svn commit
:将本地修改的内容提交到服务器。
图3-1SVN 基本操作原理
<center>图 3-1 SVN 基本操作原理</center>
-
代码版本冲突
-
版本冲突原因:
假设 A、B 两用户都在版本号为 100 时更新了
sample.txt
文件,A 用户在修改完成之后提交 sample.txt 到服务器,这个时候提交成功,这个时候 sample.txt 文件的版本号已经变成 101 了。同时 B 用户在版本号为 100 的 sample.txt 文件上作修改,修改完成之后提交到服务器时,由于不是在当前最新的 101 版本上作的修改,所以导致提交失败。 -
版本冲突现象:
冲突发生时,SVN 会在当前工作目录中保存所有的目标文件版本 [ 上次更新版本、当前获取的版本 ( 即别人提交的版本 )、自己更新的版本、目标文件 ]。 假设文件名是
sample.txt
,对应的文件名分别是 ( 同时在目标文件中标记来自不同用户的更改 ):sample.txt.r101 sample.txt.r102 sample.txt.mine sample.txt
-
手工合并
SVN 冲突,开始的时候让人觉得害怕,但有规律可循。例如有以下文本:
Mayonnaise Lettuce Tomato Provolone <<<<<<<.mine Salami Mortadella Prosciutto ======= Sauerkraut GrilledChicken >>>>>>>.r2
一连串的大于、小于、等于号是 SVN 冲突标记,这些数据得全部删除才可以提交。在 SVN 冲突区中,或许你需要和你的同事沟通来安排冲突区的文本内容,待所有冲突区得到合理的解决之后方可再提交文件。
// 是你在冲突区里面做的修改 <<<<<<<.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
若有出入,可查看原文章地址:项目 - SVN 环境搭建与使用
网友评论