SVN版本管理与大型代码上线

摘要:
SVN版本管理与大型代码上线一、SVN简介SVN是近年来崛起的非常优秀的版本管理工具,是一个开源的版本控制系统,开发的代码版本,这些数据位置放置在一个中央资料档案库,很想一个普通的文件服务器或者FTP服务器与其他服务器不用的是,SVN会备份并记录每个文件每一次的修改更新变动,可以进行回滚操作,可以把任意一个时间点的档案恢复到想要的某一个旧的版本,也可以浏览指定文件的更新历史记录。

SVN版本管理与大型代码上线

一、SVN简介

SVN是近年来崛起的非常优秀的版本管理工具,是一个开源的版本控制系统,开发的代码版本,
这些数据位置放置在一个中央资料档案库,很想一个普通的文件服务器或者FTP服务器
与其他服务器不用的是,SVN会备份并记录每个文件每一次的修改更新变动,
可以进行回滚操作,可以把任意一个时间点的档案恢复到想要的某一个旧的版本,
也可以浏览指定文件的更新历史记录。

SVN是一个非常通用的软件系统,它常被用来管理程序源码,但是它也可以管理任何类型的文件,
如文本,视频,图片等等

SVN相关站点

Subversion官网:
http://subversion.tigris.org/
http://subversion.apache.org/
svn客户端:http://toroisesvn.net/
svn中文网站:http://www.iusesvn.com/
中文常见问题解答FAQ:http://subversion.apache.org/faq.zh.html
官方手册:http://svnbook.red-bean.com/ 中英都有

SVN与Git的区别

集中代码版本管理工具——SVN,应用产品开发,可以让每个人协调,开发用的多
个人代码版本管理工具——Git,只针对个人,与其他人无法配合

企业应用场景

SVN仍是当前企业的主流,Git正在发展,也许未来也会成为主流,小企业用的多

运维人员掌握版本管理

1、安装,部署,维护,排障
2、简单使用,很多公司都是由开发来管理,包括建立新仓库和添加删除账号
3、对于版本控制系统,运维人员相当于开发商,开发人员是业主,运维搭建的系统为开发人员服务

SVN三种访问方式

(1)独立服务器访问

访问地址如:svn://svn.yunjisuan.org/sadoc;

(2)借助apache等http服务

访问地址如:http://svn.yunjisuan.com/sadoc;

a,单独安装apache+svn(不要用)
b,CSVN(apache+svn)是一个单独的整合的软件,带web界面管理的SVN软件

(3)本地直接访问(例如:file://application/svndata/sadoc)

二、搭建SVN服务端

安装配置SVN服务

#光盘安装svn
[root@localhost ~]# yum -y install subversion
[root@localhost ~]# rpm -qa subversion
subversion-1.6.11-9.el6_4.x86_64

#建立svn版本库数据存储根目录(svndata)及用户,密码权限目录(svnpasswd)
mkdir -p /application/svndata   #数据存储根目录
mkdir -p /application/svnpasswd #用户,密码权限目录

建立项目版本仓库

创建一个新的subversion项目yunjisuan,其实类似yunjisuan这样的项目可以创建多个,
每个项目对应不同的代码。这里只创建一个项目为例:

svnadmin create /application/svndata/yunjisuan
tree /application/svndata/yunjisuan/

SVN版本管理与大型代码上线第1张

编辑SVN配置文件

cd /application/svndata/yunjisuan/conf/cp svnserve.conf{,.bak}
vim svnserve.conf    #修改12、1320、27行内容
12  anon-access =none          #禁止匿名访问
13  auth-access =write         #验证访问可写
20  password-db = /application/svnpasswd/passwd #密码文件位置
27  authz-db = /application/svnpasswd/authz     #验证文件位置

SVN版本管理与大型代码上线第2张

将authz文件和passwd文件拷贝到/application/svnpasswd下

cp /application/svndata/yunjisuan/conf/authz /application/svnpasswd/cp /application/svndata/yunjisuan/conf/passwd /application/svnpasswd/

启动SVN

[root@localhost conf]# svnserve --help          #svn启动命令帮助
svnserve: warning: cannot setLC_CTYPE locale
svnserve: warning: environment variable LANG isen
svnserve: warning: please check that your locale name iscorrect
usage: svnserve [-d | -i | -t | -X] [options]

Valid options:
  -d [--daemon]            : daemon mode        #守护进程启动(后台)
  -i [--inetd]             : inetd mode
  -t [--tunnel]            : tunnel mode
  -X [--listen-once]       : listen-once mode (useful fordebugging)
  -r [--root] ARG          : root of directory to serve #指定根目录
  -R [--read-only]         : force read only, overriding repository config file
  --config-file ARG        : read configuration fromfile ARG
  --listen-port ARG        : listen port        #监听端口默认3690
                             [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 fordebugging)
                             [mode: daemon]
  --log-file ARG           : svnserve log file
  --pid-file ARG           : write server process ID to file ARG
                             [mode: daemon, listen-once]
  --tunnel-user ARG        : tunnel username (default iscurrent uids name)
                             [mode: tunnel]
  -h [--help]              : display thishelp
  --version                : show program version information

[root@localhost conf]# svnserve -d -r /application/svndata/#警告可以忽略
[root@localhost conf]# netstat -antup | grep 3690    #svn默认3690端口

SVN版本管理与大型代码上线第3张

解决svnserve启动时的警告问题

[root@localhost conf]# source /etc/sysconfig/i18n   #启用中文字符集
[root@localhost conf]# pkill svnserve
[root@localhost conf]# svnserve -d -r /application/svndata/[root@localhost conf]# netstat -antup | grep 3690

SVN版本管理与大型代码上线第4张

passwd文件及密码设置

#在/application/svnpasswd/passwd文件末尾追加如下内容:
[root@localhost conf]# tail -4 /application/svnpasswd/passwd
yunjisuan = 123123#设置账号密码
benet = 123123#设置账号密码
stu001 = 123#设置账号密码
stu oo2 = 456    #设置账号密码

authz授权

注意:
1、权限配置文件中出现的用户名必须已在用户配置文件中定义(必须有这个用户才行)
2、对权限配置文件的修改立即生效,不必重启svn

权限配置说明

[groups]
zuming = xiaoming,xiaohong    #用户组名 =用户1,用户2
#版本库目录格式:
[repository:/baz/fuz]    #[<版本库>:/项目/目录]
@zuming = rw        #<用户组名> = <权限>xiaoming = rw        #<用户名> = <权限>

SVN版本管理与大型代码上线第5张

#编辑authz配置文件进行授权,在authz末尾加入以下几句代码
[root@localhost conf]# egrep -v "#|^$" /application/svnpasswd/authz
[aliases]
[groups]
sagroup =stu001,stu002    #新增本行,定义组名
[yunjisuan:/]        #定义授权的范围
yunjisuan =rw        #用户单独授权
benet =r            #用户单独授权
@sagroup = r        #组用户授权

重启svnserve

[root@localhost conf]# ps -ef | grep svn | grep -v grep
root       1261      1  0 17:16 ?        00:00:00 svnserve -d -r /application/svndata/[root@localhost conf]# kill 1261[root@localhost conf]# ps -ef | grep svn | grep -v grep
[root@localhost conf]# svnserve -d -r /application/svndata/

三、搭建SVN客户端

1、使用SVN客户端(windows版)

软件版本选择

推荐:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7

注意:32位系统要用32位软件版本

SVN客户端安装一直yes即可

SVN客户端软件的使用

先在本地创建一个目录,起名任意,比如data

鼠标右键点击data目录

选择右键菜单里的SVN Checkout,出现下图:

SVN版本管理与大型代码上线第6张

特别提示:
如果连接不通,请检查Linux虚拟机的iptables是否关闭。

点击OK

SVN版本管理与大型代码上线第7张

再次点击OK以后,结束。此时目录里多了一个隐藏的目录,表示此目录已经和svn服务器连通

SVN版本管理与大型代码上线第8张

命令说明:
(1)SVN Checkout:相当于下载,第一次连接svn服务器的时候需要和服务器的对应存储目录进行数据同步,如果服务器的对应目录里有数据文件,那么就会下载到你的本地对应目录里。
(2)SVN Update:更新数据,检查服务器端svn存储目录里是否和本地svn存储目录数据不一致,如果不一致,那么下载改变或新增的部分到本地svn目录里。(不会删除本地目录内容)
(3)SVN Commit:提交数据到svn服务器端存储目录。本地svn存储目录会和服务器端存储目录进行比对校验。会把本地改变的部分和新增的部分同步上传至服务器端。

SVN客户端使用测试

向windows的svn存储目录data里放一个空文件

SVN版本管理与大型代码上线第9张

右键点击data目录,选择SVN Commit

SVN版本管理与大型代码上线第10张

打开本地data目录里的文件,随便写点内容后,再次进行SVN commit

SVN版本管理与大型代码上线第11张

SVN版本管理与大型代码上线第12张

直接从本地查看服务器端的数据内容

右键点击本地svn存储目录data,选择TortoiseSVN ===>Repo-browser后出现下图:

SVN版本管理与大型代码上线第13张

双击文件可以直接远程打开文件,可以看到里面刚刚被修改后的内容已经更新至服务器端。

删除本地svn存储目录data里的文件,后选择SVN Update,会出现刚刚删除的文件又重新下载回来了

继续删除本地svn存储目录data里的文件,后选择SVN Commit

SVN版本管理与大型代码上线第14张

SVN版本管理与大型代码上线第15张

再次查看服务器端存储目录里,发现文件已经被删除了

SVN版本管理与大型代码上线第16张

2、SVN的管理命令(Linux)

[root@localhost ~]# svn --help
usage: svn <subcommand>[options] [args]
Subversion command-line client, version 1.6.11.
Type 'svn help <subcommand>' forhelp on a specific subcommand.
Type 'svn --version'to see the program version and RA modules
  or 'svn --version --quiet'to see just the version number.

Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.

Available subcommands:
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)        #下载数据
   cleanup
   commit (ci)          #提交数据
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)            #显示服务器端内容
   locklog
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   resolve
   resolved
   revert
   status (stat, st)
   switch(sw)
   unlock
   update (up)                  #更新数据

从SVN库提取数据

将文件checkout到本地目录
svn checkout(co) remotepath localpath

[root@localhost ~]# mkdir yunjisuan
[root@localhost ~]# cd yunjisuan/[root@localhost yunjisuan]# pwd
/root/yunjisuan

#下载服务器端数据到Linux本地目录
[root@localhost yunjisuan]# svn co svn://192.168.200.50/yunjisuan/ /root/yunjisuan/ --username=benet --password=123123

查看SVN版本库中的数据

[root@localhost yunjisuan]# svn list file:///application/svndata/yunjisuan/

第一次提交的时候会失败

提交前需要先标记,跟windows的勾选一样
svn add *
Linux版本提交的时候每次都需要叫备注,随便写但是必须有
svn ci -m "message"

SVN版本管理与大型代码上线第17张

  1. A1
  2. A2
  3. A3
  4. A4
  5. A5
  6. svn:warning:'666.txt.txt'isalready under version control--->这个文件已经标记过了
  1. svn:Commitfailed(details follow):
  2. svn:Authorizationfailed#提交失败,账户没有写权限,认证失败

换账户重新checkout

svn co svn://192.168.200.50/yunjisuan/ /root/yunjisuan/ --username=yunjisuan --password=123123
#换拥有写入权限的账户checkout

Store password unencrypted (yes/no)? yes  #是否作为目录的新账户和密码

重新提交

svn add *svn ci -m "message"

SVN版本管理与大型代码上线第18张

查看服务器数据

svn list file:///application/svndata/yunjisuan/

SVN版本管理与大型代码上线第19张

四、SVN钩子脚本

SVN钩子脚本简介

  • 钩子脚本的具体写法就是操作系统中shell脚本程序的写法,可根据自己的SVN所在的操作系统和shell程序进行相应的开发。
  • 钩子脚本就是被某些版本库事件触发的程序,例如:创建新版本或修改未被版本控制的属性。每个钩子都能掌管足够的信息来了解发生了什么事件,操作对象是什么以及触发事件用户的账号。
  • 根据钩子的输出或返回状态,钩子程序能够以某种方式控制该动作继续执行,停止或挂起。

默认情况下,钩子的子目录中包含各种版本库钩子模板

[root@localhost ~]# ls -l /application/svndata/yunjisuan/hooks/total 36
-rw-r--r--. 1 root root 1977 Sep 13 16:02 post-commit.tmpl
-rw-r--r--. 1 root root 1638 Sep 13 16:02 post-lock.tmpl
-rw-r--r--. 1 root root 2289 Sep 13 16:02 post-revprop-change.tmpl
-rw-r--r--. 1 root root 1567 Sep 13 16:02 post-unlock.tmpl
-rw-r--r--. 1 root root 3426 Sep 13 16:02 pre-commit.tmpl
-rw-r--r--. 1 root root 2410 Sep 13 16:02 pre-lock.tmpl
-rw-r--r--. 1 root root 2786 Sep 13 16:02 pre-revprop-change.tmpl
-rw-r--r--. 1 root root 2100 Sep 13 16:02 pre-unlock.tmpl
-rw-r--r--. 1 root root 2780 Sep 13 16:02 start-commit.tmpl

SVN的hooks模板

常用的钩子脚本

钩子脚本说明
post-commit在提交完成成功创建版本之后执行该钩子,提交已经完成,不可更改,因此,本脚本的返回值被忽略。提交完成时触发事务
pre-commit提交完成前触发执行该脚本
start-commit在客户端还没有向服务器提交数据之前,即还没有建立Subversion transaction之前,执行该脚本(提交前出发事务)

非常用的钩子脚本

  1. pre-revprop-change:在修改revision属性之前,执行该脚本
  2. post-revprop-change:在修改revision属性之后,执行该脚本。因为修改稿已经完成,不可更改,因此本脚本的返回值被忽略(不过实际上的实现似乎是该脚本的正确执行与否影响属性修改)
  3. pre-unlock:对文件进行解锁操作之前执行该脚本
  4. post-unlock:对文件进行解锁操作之后执行该脚本
  5. pre-lock:对文件进行加锁操作之前执行该脚本
  6. post-lock:对文件进行加锁操作之后执行该脚本。

svn钩子生产应用场景举例

  • pre-commit:

限制上传文件扩展名及大小,控制提交要输入的信息等。

  • post-commit:

SVN更新自动周知,MSN,邮件或短信周知。
SVN更新触发checkout程序,然后实时rsync推送到服务器等。

svn钩子生产应用实战

rsync与svn钩子结合实现数据实时同步某企业小案例

(1)建立同步WEB目录

mkdir -p /data/www

(2)将SVN中内容checkout到WEB目录一份。

[root@localhost yunjisuan]# mkdir -p /data/www
[root@localhost yunjisuan]# svn checkout svn://192.168.0.220/yunjisuan /data/www --username=yunjisuan --password=123123
A    /data/www/xxxx
A    /data/www/111A    /data/www/120A    /data/www/112A    /data/www/113A    /data/www/114A    /data/www/ffff.txt
A    /data/www/115A    /data/www/116A    /data/www/117A    /data/www/118A    /data/www/119Checked out revision 7.
[root@localhost yunjisuan]# ll /data/www/total 44drwxr-xr-x. 3 root root 4096 Sep 13 21:32 111drwxr-xr-x. 3 root root 4096 Sep 13 21:32 112drwxr-xr-x. 3 root root 4096 Sep 13 21:32 113drwxr-xr-x. 3 root root 4096 Sep 13 21:32 114drwxr-xr-x. 3 root root 4096 Sep 13 21:32 115drwxr-xr-x. 3 root root 4096 Sep 13 21:32 116drwxr-xr-x. 3 root root 4096 Sep 13 21:32 117drwxr-xr-x. 3 root root 4096 Sep 13 21:32 118drwxr-xr-x. 3 root root 4096 Sep 13 21:32 119drwxr-xr-x. 3 root root 4096 Sep 13 21:32 120
-rw-r--r--. 1 root root   30 Sep 13 21:32ffff.txt
-rw-r--r--. 1 root root    0 Sep 13 21:32 xxxx

(3)制作钩子脚本,post-commit

root@localhost yunjisuan]# cd /application/svndata/yunjisuan/hooks/[root@localhost hooks]# cp post-commit.tmpl post-commit #复制模板一份
[root@localhost hooks]# egrep -v "#|^$" post-commit     #模板原始内容
REPOS="$1"REV="$2"mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
[root@localhost hooks]# vim post-commit         #修改post-commit脚本
[root@localhost hooks]# egrep -v "#|^$" post-commit
REPOS="$1"#传参(未用上)
REV="$2"#传参(未用上)
SvnIP="192.168.0.220"#svn服务端的IP地址
ProjectName="yunjisuan"#svn服务端的项目库名称
UserName="yunjisuan"#账户姓名
PassWord="123123"#账户密码
LocalPath="/data/www"#位于svn本地的共享目录
SVN=/usr/bin/svn            #svn命令的绝对路径
export LC_CTYPE="en_US.UTF-8"#中文字符集支持
export LC_ALL=
if [ ! -d ${LocalPath} ];then   
    mkdir -p ${LocalPaht}
    $SVN checkout svn://${SvnIP}/${ProjectName} ${LocalPath} --username=${UserName} --password=${PassWord}       #新创建目录需要先经过checkout才能update
else$SVN update --username yunjisuan --password 123123 /data/www        #更新共享目录内容
fi
if [ $? -eq 0];then
    /usr/bin/rsync -az --delete /data/www /tmp/         #数据同步推送到本地/tmp目录下(生产环境可以直接同步推送到Web测试服务器)
fi

(4)进行钩子脚本同步测试

#删除之前的测试记录
[root@localhost hooks]# rm -rf /data/www/[root@localhost hooks]# ll -d /data/www
ls: cannot access /data/www: No such file or directory
[root@localhost hooks]# rm -rf /tmp/*[root@localhost hooks]# ll /tmp/
total 0
[root@localhost hooks]# chmod 700 post-commit   #给钩子脚本可执行权限

免责声明:文章转载自《SVN版本管理与大型代码上线》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux文件系统应用---系统数据备份和迁移(用户角度)使用Roslyn的C#语言服务实现UML类图的自动生成下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QT phonon在windows下的编译( 转)

最近需要用windows下的qt写一些界 面,里面用到qt的多媒体框架phonon,我用的是qt- 4.5.3。从官网上下载安装的qt本身并没有把phonon集成进去,只是提供了源码。自己在编译phonon时遇到一些问题,网上相关讨论不少,但很 少是关于windows下phonon的编译的,所以我在这把我编译phonon的过程系统的描述下,希 望能帮到大家...

关于Xcode9的一些问题

最近几天一直在做一项工作,为新项目在做搭建框架的前期准备,然后恰逢更新iOS11和Xcode9,笔者心急的尝了个先,发现了一些问题,记录一下,如果有相同问题的程序猿,也可以参考一下。 目前问题遇到两点 1.Xcode9将SVN功能隐藏了 曾经我们需要在设置-账户 然后点击那个“+”然后添加代码仓库,就能添加SVN地址了,Xcode8时代有俩选项可以选 一个是...

exception throw in progress runner thread_VS2015中SVN源代码无说明提交异常

1-问题描述:通过SVN将代码变更提交服务器时,你可能会遇到以下异常:  exception throw in progress runner thread 2-解决办法: SVN代码源代码管理和TFS源代码管理稍微有些区别:TFS代码提交时可以不填写任何说明,而SVN需要填写 所以解决办法很简单,在提交时填写提交说明即可。如下:...

IDEA里面的facets和artifacts的讲解

Facets: Facets表述了在Module中使用的各种各样的框架、技术和语言。这些Facets让Intellij IDEA知道怎么对待module内容,并保证与相应的框架和语言保持一致。 使用Facets能让我们下载并配置framework所必须的组件,会自动生成各种各样的描述符,并存储在适当的位置,等等。 大多数Facets可以无冲突得添加到Mod...

SVN的配置和使用

1、svn是代替cvs而衍生出来的一种新的版本控制器系统。他的图标是个小龟。2、1)备份数据2)、项目同步 3)、进行版本控制。3、svn版本控制器的原理 项目组成员A上传代码,然后项目组成员B下载下来。然后进行协同开发。4、安装1)、服务器端软件(提示重启必须的不要重启) 2)、客户端软件 3)、中文语言包5、说了怎样去建立版本库,就是怎样去在你的电脑上...

linux命令详解——ftp

ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相信掌握了这些使用Linux 进行ftp操作将会非常容易。 Linux ftp命令的一般格式如下: $ ftp 主机名/IP 其中“主机名/IP”是所要连接的远程机的主机名或IP地址。在命...