SVN版本管理与大型代码上线html
1、SVN简介web
SVN是近年来崛起的很是优秀的版本管理工具,是一个开源的版本控制系统,开发的代码版本,
这些数据位置放置在一个中央资料档案库,很想一个普通的文件服务器或者FTP服务器
与其余服务器不用的是,SVN会备份并记录每一个文件每一次的修改更新变更,
能够进行回滚操做,能够把任意一个时间点的档案恢复到想要的某一个旧的版本,
也能够浏览指定文件的更新历史记录。shellSVN是一个很是通用的软件系统,它常被用来管理程序源码,可是它也能够管理任何类型的文件,
如文本,视频,图片等等apache
SVN相关站点vim
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/ 中英都有windows
SVN与Git的区别服务器
集中代码版本管理工具——SVN,应用产品开发,可让每一个人协调,开发用的多
我的代码版本管理工具——Git,只针对我的,与其余人没法配合app
企业应用场景运维
SVN还是当前企业的主流,Git正在发展,也许将来也会成为主流,小企业用的多svn
运维人员掌握版本管理
一、安装,部署,维护,排障
二、简单使用,不少公司都是由开发来管理,包括创建新仓库和添加删除帐号
三、对于版本控制系统,运维人员至关于开发商,开发人员是业主,运维搭建的系统为开发人员服务
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)
2、搭建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配置文件
cd /application/svndata/yunjisuan/conf/ cp svnserve.conf{,.bak} vim svnserve.conf #修改十二、13、20、27行内容 12 anon-access = none #禁止匿名访问 13 auth-access = write #验证访问可写 20 password-db = /application/svnpasswd/passwd #密码文件位置 27 authz-db = /application/svnpasswd/authz #验证文件位置
将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 set LC_CTYPE locale svnserve: warning: environment variable LANG is en svnserve: warning: please check that your locale name is correct 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 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 #监听端口默认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 for debugging) [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 is current uids name) [mode: tunnel] -h [--help] : display this help --version : show program version information [root@localhost conf]# svnserve -d -r /application/svndata/ #警告能够忽略 [root@localhost conf]# netstat -antup | grep 3690 #svn默认3690端口
解决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
passwd文件及密码设置
#在/application/svnpasswd/passwd文件末尾追加以下内容: [root@localhost conf]# tail -4 /application/svnpasswd/passwd yunjisuan = 123123 #设置帐号密码 benet = 123123 #设置帐号密码 stu001 = 123 #设置帐号密码 stu oo2 = 456 #设置帐号密码
authz受权
注意:
一、权限配置文件中出现的用户名必须已在用户配置文件中定义(必须有这个用户才行)
二、对权限配置文件的修改当即生效,没必要重启svn
权限配置说明
[groups] zuming = xiaoming,xiaohong #用户组名 = 用户1,用户2 #版本库目录格式: [repository:/baz/fuz] #[<版本库>:/项目/目录] @zuming = rw #<用户组名> = <权限> xiaoming = rw #<用户名> = <权限>
#编辑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/
3、搭建SVN客户端
一、使用SVN客户端(windows版)
软件版本选择
推荐:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7
注意:32位系统要用32位软件版本
SVN客户端安装一直yes便可
SVN客户端软件的使用
先在本地建立一个目录,起名任意,好比data
鼠标右键点击data目录
选择右键菜单里的SVN Checkout,出现下图:
特别提示:
若是链接不通,请检查Linux虚拟机的iptables是否关闭。
点击OK
再次点击OK之后,结束。此时目录里多了一个隐藏的目录,表示此目录已经和svn服务器连通
命令说明:
(1)SVN Checkout:至关于下载,第一次链接svn服务器的时候须要和服务器的对应存储目录进行数据同步,若是服务器的对应目录里有数据文件,那么就会下载到你的本地对应目录里。
(2)SVN Update:更新数据,检查服务器端svn存储目录里是否和本地svn存储目录数据不一致,若是不一致,那么下载改变或新增的部分到本地svn目录里。(不会删除本地目录内容)
(3)SVN Commit:提交数据到svn服务器端存储目录。本地svn存储目录会和服务器端存储目录进行比对校验。会把本地改变的部分和新增的部分同步上传至服务器端。
SVN客户端使用测试
向windows的svn存储目录data里放一个空文件
右键点击data目录,选择SVN Commit
打开本地data目录里的文件,随便写点内容后,再次进行SVN commit
直接从本地查看服务器端的数据内容
右键点击本地svn存储目录data,选择TortoiseSVN ===>Repo-browser后出现下图:
双击文件能够直接远程打开文件,能够看到里面刚刚被修改后的内容已经更新至服务器端。
删除本地svn存储目录data里的文件,后选择SVN Update,会出现刚刚删除的文件又从新下载回来了
继续删除本地svn存储目录data里的文件,后选择SVN Commit
再次查看服务器端存储目录里,发现文件已经被删除了
二、SVN的管理命令(Linux)
[root@localhost ~]# svn --help usage: svn <subcommand> [options] [args] Subversion command-line client, version 1.6.11. Type 'svn help <subcommand>' for help 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) #显示服务器端内容 lock log 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"
A 1
A 2
A 3
A 4
A 5
svn: warning: '666.txt.txt' is already under version control --->这个文件已经标记过了
svn: Commit failed (details follow):
svn: Authorization failed #提交失败,帐户没有写权限,认证失败
换帐户从新checkout
svn co svn://192.168.200.50/yunjisuan/ /root/yunjisuan/ --username=yunjisuan --password=123123
#换拥有写入权限的帐户checkoutStore password unencrypted (yes/no)? yes #是否做为目录的新帐户和密码
从新提交
svn add * svn ci -m "message"
查看服务器数据
svn list file:///application/svndata/yunjisuan/
4、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以前,执行该脚本(提交前出发事务) |
很是用的钩子脚本
svn钩子生产应用场景举例
限制上传文件扩展名及大小,控制提交要输入的信息等。
SVN更新自动周知,MSN,邮件或短信周知。
SVN更新触发checkout程序,而后实时rsync推送到服务器等。
(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/111 A /data/www/120 A /data/www/112 A /data/www/113 A /data/www/114 A /data/www/ffff.txt A /data/www/115 A /data/www/116 A /data/www/117 A /data/www/118 A /data/www/119 Checked out revision 7. [root@localhost yunjisuan]# ll /data/www/ total 44 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 111 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 112 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 113 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 114 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 115 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 116 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 117 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 118 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 119 drwxr-xr-x. 3 root root 4096 Sep 13 21:32 120
-rw-r--r--. 1 root root 30 Sep 13 21:32 ffff.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 #给钩子脚本可执行权限