• 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 #主线,与正式线相对应,当天不上线文件不允许提交。

  • 相关阅读:
    MFC OnOk(),OnCancel(),OnClose(),OnDestroy()的区别总结
    MFC中的Invalidate、OnDraw、OnPaint函数的作用
    MFC中和定时器使用
    SwapBuffers的等待,虚伪的FPS(转)
    OpenGl常用函数说明
    Win7_Ultimate + VS2010 + openGL_MFC单文档应用开发框架搭建步骤
    OpenGL模型视图变换、投影变换、视口变换的理解
    不同电脑的开机启动项
    第一百二十三节,JavaScript错误处理与调试
    第一百二十二节,JavaScript表单处理
  • 原文地址:https://www.cnblogs.com/xuliangwei/p/8626125.html
Copyright © 2020-2023  润新知