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

  1. SVN更新自动周知,MSN邮件或者短信周知。
  2. 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 #主线,与正式线相对应,当天不上线文件不允许提交。

posted @ 2018-03-22 20:00  oldxulinux  阅读(4380)  评论(0编辑  收藏  举报