zoukankan      html  css  js  c++  java
  • 学习SVN03

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

     
  • 相关阅读:
    poj3278 Catch That Cow
    poj2251 Dungeon Master
    poj1321 棋盘问题
    poj3083 Children of the Candy Cor
    jvm基础知识—垃圾回收机制
    jvm基础知识1
    java面试基础必备
    java soket通信总结 bio nio aio的区别和总结
    java scoket aIO 通信
    java scoket Blocking 阻塞IO socket通信四
  • 原文地址:https://www.cnblogs.com/wuhg/p/9816643.html
Copyright © 2011-2022 走看看