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

 

学习SVN03的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

随机推荐

  1. windows系统如何远程桌面连接

    转至:https://jingyan.baidu.com/article/67662997adb46a54d51b84bd.html 远程桌面连接是一种通过网络技术,远程操作另一台电脑的过程,随着wi ...

  2. docker:nginx+confd动态生成配置

    docker:nginx+confd动态生成配置 当我们项目越来越多时手动去服务器修改nginx配置是一件很麻烦而且可能出错的事情.我们可以通过nginx+confd+配置中心实现一套方案避免出错并减 ...

  3. go 中 sort 如何排序,源码解读

    sort 包源码解读 前言 如何使用 基本数据类型切片的排序 自定义 Less 排序比较器 自定义数据结构的排序 分析下源码 不稳定排序 稳定排序 查找 Interface 总结 参考 sort 包源 ...

  4. HTTP请求过程和状态响应码

    HTTP请求过程 我们在浏览器中输入一个URL,回车之后便可以在浏览器中观察到页面内容.实际上,这个过程是浏览器向网站所在的服务器发送了一个请求,网站服务器接收到这个请求后进行处理和解析,然后返回对应 ...

  5. websocket原理和基于c/c++实现的websocket协议栈(更新中)

    参考: 博客1:http://blog.sina.com.cn/s/blog_bf397e780102w25k.html https://www.cnblogs.com/barrywxx/p/7412 ...

  6. Python 学习路线(2022)

    原文链接: Python 学习路线(2022) 前几天整理了一份 Go 学习路线(2022),广受好评.那么趁火打劫,不是,是趁热打铁,又整理了一份 Python 学习路线. 内容依然是从入门到进阶, ...

  7. 在 Nebula K8s 集群中使用 nebula-spark-connector 和 nebula-algorithm

    本文首发于 Nebula Graph Community 公众号 解决思路 解决 K8s 部署 Nebula Graph 集群后连接不上集群问题最方便的方法是将 nebula-algorithm / ...

  8. [ Skill ] print println printf fprintf sprintf lsprintf

    https://www.cnblogs.com/yeungchie/ 几种 print 函数的差异 print 接收任意的数据类型,并打印到 CIW print( 12345 ) ; 12345 pr ...

  9. python 绘图介绍

    1. python 绘图介绍 2. 函数 import numpy as np import matplotlib.pyplot as plt t = np.arange(0.0, 3.0, 0.01 ...

  10. java 知识点梳理

    1.ArrayList与linkedList 区别 ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦; 优点是查找比较快. Lin ...