SVN版本控制系统最佳实践
第1章SVN介绍及应用场景
1.1什么是SVN(Subversion)
Svn(subversion)是近年来崛起非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个跨平台的开源的版本控制系统。Svn版本管理工具随着时间改变的各种数据。这些数据防止在一个中央资料档案库(repository)中,这个档案库很像一个普通的文件服务器或者FTP服务器,但是,与其他服务器不同,SVN会备份并记录每个文件每一次的修改更新变动。这样就可以把任意一个时间点的档案恢复到想要的某一个旧的版本,当然也可以直接浏览指定文件的更新历史记录。
官方解释:为什么会有SVN这样一个项目?为了接管CVS的用户基础,确切的说,我们写了一个新的版本控制系统,它和CVS很相似,但是它修正了以前CVS所没有解决的许多问题。具体查看SVN官方首页。
SVN是一个非常通用的软件系统,它常被用来管理程序源码,但是它也可以管理任何类型的文件,如文本、视频、图片等等。
1.2SVN与Git的区别
1.2.1SVN集中式版本控制系统
SVN版本控制系统是集中式的数据管理,存在一个中央版本库,所有开发人员本地开发所使用的代码都是来自于这个版本库,提交代码也都必须提交到这个中央版本库。
SVN版本控制系统工作流程如下:
1.在中央库上创建或从主干复制一个分分支。
2.从中央库check out下这个分支的代码。
3.增加自己的代码文件,修改现存的代码或者删除代码文件。
4.commit代码,假设有人在刚刚的分支上提交了代码,你就会被提示代码过期,需要先up你的代码后再提交。up代码的时候如果出现冲突,需要解决好后再进行提交。
1.2.2Git分布式版本控制系统
git中没有了中央版本库的说法,但是为了开发小组的代码共享,我们通常还是会搭建一个远程git仓库。
但是和svn不同的是,开发者本地也包含了一个完整的git仓库,从某种程度上说本地的仓库和远程的仓库在身份上是等价的,没有主从之分。
如果是闭源项目,或者你习惯于以往的集中式的管理模式的话,那么在git下你也可以像SVN那样的工作,只是流程中可能会增加一些步骤。
1.你本地创建一个git库,并将其add到远程git库中。
2.你在本地添加或者删除文件,然后commit,当然commit操作都是提交到本地的git库中。(其实提交到git目录下的objects目录中)
3.将本地git库的分支push到远程git库的分支,如果这个时候远程git库中已经有别人push过,那么远程git库将不允许你push,这时候你需要先pull,如果有冲突,先处理好冲突,commit到本地git库后,再push到远程git库。
从上面的描述我们可以看到,我们每个开发人员的本地都会有一个git库,我们可以随时进行commit而不需要联网,可以随时查看历史版本,当某一个功能点开发完了之后我们可以将commit后的内容push到远程git库了,如果远程git库的版本在你上次clone或者pull之后变化了,那么需要进行pull并处理冲突,提交之后,在push到远程git库。
1.3SVN企业应用场景
SVN任是当前企业的主流。git正在发展,未来会成为主流。如果大家精力足够,建议同时掌握。
1.4运维人员掌握版本管理
对于版本管理系统,运维人员需要掌握的技术点:
1、安装、部署、维护、拍障。
2、简单使用,很多公司都是由开发来管理,包括建立仓库和添加删除账号。
3、对于版本控制系统,运维人员相当于开发商,开发人员是业主,运维搭建的系统为开发人员服务。
1.5SVN服务运行模式与访问方式
1.5.1Svn服务端运行方式
SVN服务常见的运行访问方式有3种:
1、独立服务器访问
访问地址如:svn://svn.xuliangwei.com/sadoc;
2、借助Apache等http服务
访问地址如:http://svn.xuliangwei.com/sadoc;
单独安装Apache+svn
CSVN(apache+svn)是一个单独的整合软件,带web界面管理的SVN软件。
3、本地直接访问(例如:file:///application/svndata/sadoc)
咱们主要学习第一种方式以及第二种方式的CSVN web管理方式。
1.6Svn客户端访问方式
Svn客户端可以通过多种访问方式访问服务器端,例如:本地磁盘访问,或各种各样不同的网络协议访问,但一个版本库地址永远都是一个URL,URL反映了访问方法。
访问方式 |
说明 |
svn:// |
通过TCP/IP自定义协议访问svnserve服务器。 |
http:// |
通过WebDAV协议访问支持Subversion的Apache服务器 |
https:// |
与http://相似,但是用SSL加密访问。 |
file:// |
直接通过本地磁盘或者网络磁盘访问版本库。 |
svn+ssh:// |
通过认证并加密的TCP/IP自定义协议访问svnserve服务器 |
1.7SVN档案库数据格式
SVN存储版本数据有2中方式:BDB(一种事物安全性表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。
BDB:
伯克利DB(BerkeleyDB),版本库可以使用的一种经过充分测试的后台数据库实现,不能在通过网络共享的文件系统上使用,伯克利DB是Subversion1.2版本以前的缺省版本库格式。
FSFS:
一个专用于Subversion版本库的文件系统后端,可以使用网络文件系统(例如NFS或SMBFS)。是1.2版本及其后的缺省版本库格式。
1.8SVN版本控制系统优点
1、管理方便,逻辑清晰明确,符合一般人思维习惯。
2、易于管理,集中式svn服务器更能保证数据安全性。
3、代码一致性非常高。
4、适合开发人数不多的项目开发。
5、普及度高,大部分软件配置管理的大学教材都是SVN。
第2章SVN版本系统最佳实践
2.1SVN安装部署
检查操作系统环境,以及内核版本
[root@svn-node1 ~]# cat /etc/redhat-release #查看系统版本
CentOS release 6.7 (Final)
[root@svn-node1 ~]# uname -r #查看内核
2.6.32-573.el6.x86_64
SVN属于功能性软件,yum安装即是最佳实践。
[root@svn-node1 ~]# yum install subversion #安装Svn
[root@svn-node1 ~]# rpm -qa subversion #检查svn是否安装完毕
subversion-1.6.11-14.el6.x86_64
2.2创建SVN目录
建立svn版本库数据存储根目录(svndata)及用户、密码权限目录(svnpasswd)
[root@svn-node1 ~]# mkdir -p /application/svndata #数据存储根目录
[root@svn-node1 ~]# mkdir -p /application/svnpasswd #用户、密码权限目录
2.3建立项目版本库
创建一个新的Subversion项目sadoc,类似sadoc这样的项目可以创建多个,每个项目对应不同的代码,这里只是以创建一个项目为例演示:
[root@svn-node1 ~]# svnadmin create /application/svndata/sadoc #使用svnadmin创建项目版本库,以及初始化版本库
2.4调整SVN配置文件及权限文件
下面对svn全局配置文件进行配置管理:注意:修改位置顶格不能有空格,否则报错
[root@svn-node1 ~]# cd /application/svndata/sadoc/conf/
[root@svn-node1 conf]# cp svnserve.conf svnserve.conf.ori #备份SVN主配置文件,方便对比
[root@svn-node1 conf]# egrep -v "^$|#" svnserve.conf #打开如下注释的行
[general]
anon-access = none #read(匿名访问) none(不让匿名访问)
auth-access = write #授权用户可写
password-db = /application/svnpasswd/passwd #使用哪个文件作为帐号密码文件
authz-db = /application/svnpasswd/authz #使用哪个文件作为权限文件
realm = My xuliangwei First Repository #认证空间名,版本所在目录(可选)
[root@svn-node1 conf]# mv authz passwd/application/svnpasswd/ #把密码认证及权限模板拷到相关目录
[root@svn-node1 conf]# chmod 600 /application/svnpasswd/{authz,passwd} #修改权限,不允许其他用户读写执行权限
快速修改替换方法:
sed -i 's/# anon-access = read/anon-access=none/' svnserve.conf
sed -i 's/# auth-access = write/auth-access=write/g' svnserve.conf
sed -i 's@# password-db = passwd@password-db = /application/svnpasswd/passwd@g' svnserve.conf
sed -i 's@# authz-db = authz@authz-db = /application/svnpasswd/authz@g' svnserve.conf
2.5配置svn用户及密码
配置账户及密码 格式: user=passwd
[root@svn-node1 svnpasswd]# egrep -v "^$|#" /application/svnpasswd/passwd
[users]
xuliangwei = xlw123
xiaomi = xiaomi123
stu001 = 123
stu002 = 456
提示:
1.等号前为SVN账号,等号后为SVN密码,密码是明文的,注意密码权限
2.更改svnserve.conf时,需要重起SVN,更改authz,passwd文件时不需要重启
2.6配置svn用户及权限
权限使用的用户名,必须在passwd文件里面存在,权限配置文件的修改立即生效,不必重启SVN;
用户组格式:
[groups]
xuliangwei26 = stu001,stu002
其中,1个组可以包含1个用户或者多个用户,用户间以逗号分隔。
版本库目录格式:
[<版本库>:/项目/目录]
@<用户组名> = <权限>
<用户名> = <权限>
方括号内部分可以有多种写法:
[/] #表示根目录及以下,根目录是sevnserve启动时指定的,我们指定为/application/svndata [/]就是表示对全部版本库设置权限;
[sadoc:/] #表示对版本库sadoc设置权限;
[sadoc:/linux] #表示对版本库sadoc中的linux项目设置权限;
[sadoc:/linux/centos] #表示对版本库sadoc中的linux项目的centos目录设置权限;
权限主体可以是用户组、用户或者*,用户组在前面加@,*表示全部用户。
权限可以是r、w、rw和空,空表示没有任何权限。
如下权限体系的控制
[root@svn-node1 svnpasswd]# egrep -v "#" /application/svnpasswd/authz
[aliases]
[groups]
xuliangwei26 = stu001,stu002
[sadoc:/]
xuliangwei = rw
[sadoc:/linux]
xiaomi = rw
[sadoc:/linux/centos]
@xuliangwei26 =r
根目录只有xuliangwei可以读写,匿名用户没有任何权限。
二级Linux目录只有xiaomi可以读写,匿名用户没有任何权限。
三级centos目录只有xuliangwei26组可读,但是xuliangwei可读写,xiaomi也可读写。
2.7svn启动命令详解
svn启动命令详解
[root@svn-node1 sadoc]# svnserve --help
usage: svnserve [-d | -i | -t | -X] [options]
Valid options:
-d [--daemon] : daemon mode #以守护进程运行
-i [--inetd] : inetd mode #以inetd模式运行
-t [--tunnel] : tunnel mode #以隧道模式运行
-X [--listen-once] : listen-once mode (useful for debugging) #调试模式
-r [--root] ARG : root of directory to serve #指定根目录
-R [--read-only] : force read only, overriding repository config file #只读,覆盖库的配置文件
--config-file ARG : read configuration from file ARG #从文件读取配置
--listen-port ARG : listen port #指定监听svn端口
[mode: daemon, listen-once]
--listen-host ARG : listen hostname or IP address #监听主机名或者IP地址
[mode: daemon, listen-once]
-T [--threads] : use threads instead of fork [mode: daemon] #线程的使用
--foreground : run in foreground (useful for debugging) #在前台运行(调试模式)
[mode: daemon]
--log-file ARG : svnserve log file #指定日志文件
--pid-file ARG : write server process ID to file ARG #指定pid文件路径
[mode: daemon, listen-once]
--tunnel-user ARG : tunnel username (default is current uid's name) #隧道用户名(默认UID的名称)
[mode: tunnel]
-h [--help] : display this help #查看帮助
--version : show program version information #显示程序版本信息
2.8配置并启动svn服务
[root@svn-node1 sadoc]# svnserve -d -r /application/svndata/#-d代表后台运行 -r 指定根目录
[root@svn-node1 sadoc]# netstat -lntup|grep 3690 #查看SVN端口
tcp 00 0.0.0.0:36900.0.0.0:* LISTEN 1855/svnserve
第3章SVN客户端管理
3.1Windows客户端管理
windows客户端下载TortoiseSVN软件进行代码的上传、下载、提交、更新、等操作管理。
使用xuliangwei用户来checkout
checkout 成功
添加新的文件,进行提交
通过browse浏览成功
3.2Linux客户端管理
3.2.1SVN建立目录树
[root@svn-node1 /]# mkdir -p /tmp/dir/linux/centos
[root@svn-node1 /]# svn import /tmp/dir/ svn://10.0.0.3/sadoc/ -m "import svntree" #导入svn目录树
Adding /tmp/dir/linux
Adding /tmp/dir/linux/centos
3.2.2从SVN库提取数据
将文件checkout到本地目录
[root@svn-node1 ~]# mkdir /svn-data
[root@svn-node1 ~]# cd /svn-data
[root@svn-node1 svn-data]# svn co svn://10.0.0.7/sadoc/ /svn-data/ --username xuliangwei --password xlw123
3.2.3从本地提交到SVN
客户端提交文件至SVN服务器,如下
[root@svn-node1 svn-sadoc]# mkdir stu00{10..12}
[root@svn-node1 svn-data]# svn add *
A stu0010
A stu0011
A stu0012
[root@svn-node1 svn-sadoc]# svn ci -m "Message data" --username xuliangwei --password xlw123
Adding stu0010
Adding stu0011
Adding stu0012
Committed revision 5.
第4章SVN备份实践
[root@svn-node1 svn-sadoc]# svnadmin --help
general usage: svnadmin SUBCOMMAND REPOS_PATH[ARGS & OPTIONS ...]
Type 'svnadmin help <subcommand>' for help on a specific subcommand.
Type 'svnadmin --version' to see the program version and FS modules.
Available subcommands:
crashtest
create
deltify
dump
help (?, h)
hotcopy
list-dblogs
list-unused-dblogs
load
lslocks
lstxns
pack
recover
rmlocks
rmtxns
setlog
setrevprop
setuuid
upgrade
verify
第5章SVN钩子实践
5.1SVN钩子脚本简介
钩子脚本的具体写法就是操作系统中shell脚本程序的写法,可根据自己的SVN所在的操作系统和shell程序进行相对应的开发。
钩子脚本就是被某些版本库事件触发的程序,例如:创建新版本或修改未被版本控制的属性。每个钩子都能掌管足够的信息来了解发生了什么事件,操作对象是什么以及触发事件用户的账号。
根据钩子的输出或者返回状态,钩子程序能够以某种方式控制该动作继续执行,停止或者挂起。
5.2SVN的hooks模板
常见钩子脚本
钩子脚本 |
说明 |
post-commit |
在提交完成成功创建版本之后执行该钩子,提交已经完成,不可更改,因此,本脚本的返回值被忽略。提交完成时触发事物 |
pre-commit |
提交完成前触发执行脚本 |
start-commit |
在客户端还没有向服务器提交数据之前,即还没有建议txn之前,执行该脚本(提交前触发事务) |
5.3SVN钩子生产应用场景
pre-commit
1.闲置上传扩展名及大小啊,控制提交要输入的信息等。
post-commit
- SVN更新自动周知,MSN邮件或者短信周知。
- SVN更新触发checkout程序,然后实现rsync推送到服务器等。
5.4SVN钩子生产应用实践
5.4.1单台svn同步web目录
安装web服务
yum –y instal httpd 使用yum一键安装apache
service httpd start 启动apache服务测试
配置文件修改
cd /svndata/code1/hooks/ 进入仓库钩子目录
cp post-commit.tmpl post-commit 复制模版
chmod 755 post-commit 添加执行权限
> post-commit 清空配置信息
vim post-commit
#! /bin/sh
export LANG="zh_CN.UTF-8"
svn=/usr/bin/svn
$svn update /var/www/code1 --username admin --password admin
同步svn至/var/www/目录下 (admin用户必须对根目录有可读可写)
将Apache虚拟主机指向/var/www/code1 即可访问
关联Web目录
cd /var/www/
svn checkout svn://192.168.1.200/code1 checkout更新svn
首次checkout需要输入root的密码
其次输入post-commit里面定义同步的用户和密码
用户:admin
密码: admin
首次需要确认是否保存密码 输入yes即可
5.4.2rsync与svn钩子结合实现数据实时同步
1、建立同步WEB目录
2、将SVN中内容checkout到WEB目录一份
[root@svn-node1 ~]# mkdir -p /data/www #建立同步Web目录
[root@svn-node2 ~]# svn co svn://10.0.0.7/sadoc /data/www/ --username=xuliangwei --password=xlw123 #将SVN中内容checkout到WEB目录一份
A /data/www/linux
A /data/www/linux/centos
Checked out revision 7.
5.5SVN钩子注意事项
1、钩子脚本的权限要允许svn执行,一般可以设置chmod 755 post-commit
2、写钩子脚本时要尽可能定义环境变量,主要是需要用命令的路径。因为SVN考虑安全问题,不会调用系统环境变量,所以如果发现手动执行post-commit没有问题,但是SVN自动执行也可能会无法执行。
3、在SVN upate之前一定要先手动checkout一份出来,还有尽可能要加上用户和密码,如果只是手动一样会更新,但自动触发可能就不能更新了。
第6章大中小型企业上线解决方案
SVN目录组织结构说明
branch #分支,为测试时使用,几天以上的项目必须开分支,测试需要本分支通过,主线合并到分支通过,才能合并到主线进行测试
tags #版本记录
trunk #主线,与正式线相对应,当天不上线文件不允许提交。