Linux上subversion的安装和使用

目录

1、Linux上subversion下载... 3

2、Linux上subversion的安装... 6

2.1、查询系统之前安装的旧版本... 6

2.2、yum安装yum源默认版本... 7

2.3、yum安装自定义版本... 8

3、Linux上SVN服务端和客户端环境搭建... 13

3.1、服务端命令与客户端命令... 13

3.2、版本库的创建与删除... 13

3.3、版本库配置及权限分组... 15

3.4、版本库的访问... 20

3.4.1、启动... 21

3.4.2、windows客户端的访问:... 21

3.4.3、Linux上客户端的访问... 23

3.4.3、重启... 26

3.5、svn服务自动启动... 27

4、svn的基本操作... 28

4.1、svn的常见术语及文件状态... 28

4.2、checkout与export的区别于使用... 33

4.3、add、ci、up、del 33

4.4、客户端diff、mkdir、cat. 34

4.5、工作副本还原revert. 35

4.6、二进制冲突与树冲突... 35

4.7、锁定lock与解锁unlock. 36

5、svn的进阶应用... 37

5.1、ls、st、log、info. 37

5.2、多版本库解决方案... 37

5.1.1、不同端口启动多个版本库... 38

5.1.2、一个端口启动多个版本库... 39

5.3、svn的copy命令... 40

5.4、主干版本与分支版本... 41

6、svn的高级应用... 42

6.1、hooks钩子应用... 42

6.2、版本库精简... 47

6.3、版本库的迁移与重定向... 49

6.3.1、版本库的迁移... 49

6.3.2、版本库的重定向... 50

7、svn常见的坑... 51

 

 

 

1、Linux上subversion下载

Linux上运行的SVN 是将服务端和客户端绑定在subversion里面的,所以下载的时候只需要下载一个subversiontar包。

Windows上SVN客户端官网:https://tortoisesvn.net/

Linux上SVN官网:http://subversion.apache.org/

进入SVN客户端TortoiseSVN官网(也可以直接进入Linux上SVN官网)

点击Apache™ Subversion (SVN)® 进入Apache的版本控制页

http://subversion.apache.org/

点击Source Download 进入下载页

或者在该下载页的下面有当前最新版和当前上一个版本,以及发布存档库

点击archive download site进入旧版本仓库

选择需要的版本直接点击下载,或者复制链接保存,再到Linux上进行下载。

复制subversion-1.10.2.tar.gz版本链接

http://mirrors.hust.edu.cn/apache/subversion/subversion-1.10.2.tar.gz

复制subversion-1.9.9.tar.gzz版本链接

http://mirrors.hust.edu.cn/apache/subversion/subversion-1.9.9.tar.gz

2、Linux上subversion的安装

2.1、查询系统之前安装的旧版本

svn --version

自己决定是否卸载

卸载命令

yum remove subversion

查看是否卸载完成

[root@localhost ~]# svn --version

卸载完成

2.2、yum安装yum源默认版本

查看yum源中subversion的版本

[root@localhost ~]# yum list subversion

执行yum源安装subversion

[root@localhost ~]# yum -y install subversion

查询安装是否完成

[root@localhost ~]# svn --version

安装完成。

2.3、yum安装自定义版本

在yum源配置文件中配置自己需要的软件版本yum源。

http://opensource.wandisco.com/这个网址是wandisco整理的rpm包,在这个网址下有各种版本的subversion。

subversion1.10版本的rpm包地址:

http://opensource.wandisco.com/centos/7/svn-1.10/RPMS/

在该路径下是subversion通过yum源安装的配置文件和rpm包以及当前版本的依赖。

卸载旧版本

[root@localhost ~]# yum remove subversion

清除yum缓存

yum 会把下载的软件包和header存储在cache中,而不自动删除。如果觉得占用磁盘空间,可以使用yum clean指令进行清除,更精确 的用法是yum clean headers清除headeryum clean packages清除下载的rpm包,yum clean all一全部清除。

[root@localhost ~]# yum clean all

在yum配置文件中添加设置subversion1.10的yum源

查看系统yum源配置文件

[root@localhost ~]# cd /etc/yum.repos.d/

备份系统默认的yum配置文件(复制一份并添加文件后缀名为.back)

[root@localhost yum.repos.d]# cp CentOS-Base.repo CentOS-Base.repo.back

备份完成

用编辑器打开该配置文件

[root@localhost yum.repos.d]# vi CentOS-Base.repo

在文件中追加配置

[WandiscoSVN]

		<p style="margin-left:0cm;">name=Wandisco SVN Repo</p>

		<p style="margin-left:0cm;">baseurl=http://opensource.wandisco.com/centos/$releasever/svn-1.10/RPMS/$basearch/</p>

		<p style="margin-left:0cm;">enabled=1</p>

		<p style="margin-left:0cm;">gpgcheck=0</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="232" src="https://img-blog.csdnimg.cn/2019040722440981.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2OTM4NjE3,size_16,color_FFFFFF,t_70" width="751"></p>

保存退出

查看添加配置后yum源中可以安装的subversion的版本

[root@localhost yum.repos.d]# yum list subversion

安装subversion

[root@localhost ~]# yum -y install subversion

查看安装

[root@localhost ~]# svn --version

安装高版本替换低版本成功

3、Linux上SVN服务端和客户端环境搭建

3.1、服务端命令与客户端命令

在subversion中包含有服务端和客户端,在执行命令时需要分清服务端命令和客户端命令。

服务端命令:

svnserver                    #控制svn系统服务的启动等

svnadmin                    #svn版本库的创建/导入/导出/删除等

svnlook                        #查看版本库的信息

客户端命令:

svn                               #版本库的检出/更新/提交/重定向等

3.2、版本库的创建与删除

创建保存版本库的目录

例:

在/usr/local/创建svn的保存版本库的目录SvnRepository

[root@localhost ~]# mkdir /usr/local/SvnRepository

创建svn版本库

svnadmin create 路径

版本库没有指定一定需要创建在某个目录下

[root@localhost ~]# svnadmin create /usr/local/SvnRepository/testrpo

		<p style="margin-left:0cm;">#在/usr/local/SvnRepository/目录下创建testrpo版本库</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="83" src="https://img-blog.csdnimg.cn/2019040722440891.png" width="526"></p>

在创建的这个版本库下会自动创建svn相关的配置文件

创建版本库时可以配置的参数:

--fs-type             #用来指定版本库数据保存类型,该参数的类型有fsfs和dbd,推荐使用fsfs数据类型。

例如:在/usr/local/SvnRepository/目录下创建testrpo1版本库并指定版本库保存数据的类型为fsfs。

删除版本库:

rm -rvf 版本库路径

直接使用Linux的删除命令将版本库删除即可

例:删除/usr/local/SvnRepository/目录下的testrpo2版本库

[root@localhost SvnRepository]# rm -rvf testrpo2

3.3、版本库配置及权限分组

版本库的配置:
版本库的配置文件位于创建的版本库的目录下的conf目录下

该目录下文件保存的信息分别为:

authz:配置用户组合用户组的权限

passwd:配置用户名和用户密码

svnserve.conf:配置默认权限、权限配置文件及密码配置文件

svnserve.conf配置文件

使用编辑器打开svnserve.conf文件

[root@localhost conf]# vi svnserve.conf

将注释掉的重要配置信息解注释,更改未通过验证的用户权限为none,其他配置为默认

更改完成保存退出。

passwd配置文件:

使用编辑器打开passwd文件

[root@localhost conf]# vi passwd

添加用户zxr密码为123456

添加完成保存退出。

authz配置文件:

使用编辑器打开authz文件

[root@localhost conf]# vi authz

用户组(group)配置,该配置的格式为组名等于用户名列表,每个用户需要用逗号隔开,每一行表示一个用户组。

配置组的权限时需要在组的前面加上@符号

例:

用户组配置:

配置用户组pm,组员为zxr

配置用户组dev,组员为zxr0,zxr1,zxr2

配置用户组rookie,组员为zxr3

pm = zxr

		<p style="margin-left:0cm;">dev = zxr0,zxr1,zxr2</p>

		<p style="margin-left:0cm;">rookie = zxr3</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="108" src="https://img-blog.csdnimg.cn/2019040722440868.png" width="341"></p>

指定根目录配置用户组权限:

pm组具有读写权限(rw),dev组只有读权限(r),rookie组只有读权限(r),

此处的读(r)表示:在客户端可以跟新服务器上的代码到本地

此处的写(w)表示:在客户端可以提交代码到服务器

[/]

		<p style="margin-left:0cm;">@pm = rw</p>

		<p style="margin-left:0cm;">@dev = r</p>

		<p style="margin-left:0cm;">@rookie = r</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="145" src="https://img-blog.csdnimg.cn/2019040722440867.png" width="246"></p>

指定版本库配置权限:

配置testrpo版本库权限为pm组可读写(rw),用户zxr1可读写(rw),用户zxr2只能读(r),用户zxr3无权限

[testrpo:/]

		<p style="margin-left:0cm;">@pm = rw</p>

		<p style="margin-left:0cm;">zxr1 = rw</p>

		<p style="margin-left:0cm;">zxr2 = r</p>

		<p style="margin-left:0cm;">zxr3 =</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="90" src="https://img-blog.csdnimg.cn/20190407224407900.png" width="225"></p>

指定版本库下的某个目录或文件权限配置:

配置testrpo版本库下的test01目录的权限为所有人可读写(rw)

[testrpo:/test01]

		<p style="margin-left:0cm;">* = rw</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;">*表示所有用户</p>

全部配置如图

配置完成保存退出。

3.4、版本库的访问

svn是属于集中式的版本库解决方案,访问拓扑图:

SVN是跨平台的,可以在任何系统上访问SVN服务器上的内容。

3.4.1、启动

指定启动运行创建的版本库testrpo

[root@localhost ~]# svnserve -d -r /usr/local/SvnRepository/testrpo

3.4.2、windows客户端的访问:

在Windows上安装与服务端相同版本的svn的客户端(TortoiseSVN)。安装完成之后创建一个文件夹存放从服务器检出的svn版本库。

创建版本库为SVNRepo

进入SVNRepo目录,点击鼠标右键,点击SVN Checkout(检出),填写URL,点击确定。

弹出用户认证信息

填写完成用户信息点击确定。弹出检出过程。

检出完成,点击确定。此时该目录下会出现一个隐藏文件.svn

此时链接svn的服务器端成功

注意:在此链接过程中,如果出现链接不上,首先需要先telnet一下当前svn服务器的3690端口号,看端口是否开通,如果端口是通的,可能是svn服务器与客户端的版本不兼容,如果端口不通,需要开通svn服务器上的3690端口。

centos7使用的防火墙为firewalld开放端口方法是:

[root@localhost ~]# firewall-cmd --zone=public --add-port=3690/tcp --permanent

#开通防火墙3690端口号

[root@localhost ~]# systemctl restart firewalld.service

#重启防火墙服务

[root@localhost ~]#  firewall-cmd --zone=public --list-ports

#查看所有打开的端口

1、firewalld的基本使用

启动: systemctl start firewalld

关闭: systemctl stop firewalld

查看状态: systemctl status firewalld

开机禁用  : systemctl disable firewalld

开机启用  : systemctl enable firewalld

3.4.3、Linux上客户端的访问

在Linux上svn服务器上保存的是二进制文件,所以在svn服务器的版本库中看不到提交到svn服务器上的文件,只有通过Linux上的客户端才能看到svn版本库中的文件。

在/usr/local/目录下创建svn工作副本文件svnwork

[root@localhost local]# mkdir /usr/local/svnwork

进入创建的工作副本svnwork

[root@localhost local]# cd svnwork/

检出svn版本库

[root@localhost svnwork]# svn checkout svn://192.168.244.128

查看工作副本中的文件

[root@localhost svnwork]# ls

更新版本库(必须先进入到检出的目录下执行该更新命令,否则会报错没有找到工作副本)

[root@localhost svnwork]# svn update

提交文件

[root@localhost svnwork]# touch cl.txt          #在当前svn工作副本中创建文件cl.txt

编辑cl.txt文件

[root@localhost svnwork]# vi cl.txt

编辑完毕保存退出

添加文件cl.txt文件到当前工作副本的svn库中

[root@localhost svnwork]# svn add cl.txt

向svn服务器提交cl.txt文件

提交命令; svn commit -m "注释" 需要提交的文件

[root@localhost svnwork]# svn commit -m "commit create file cl.txt" cl.txt

-m "commit create file cl.txt"表示注释

提交成功,在Windows上的客户端中检测是否提交成功

进入Windows上的svn检出工作副本,右键鼠标,点击svn checkout

更新成功会,会看到在Linux上的客户端提交的文件。

3.4.3、重启

首先查看svn的进程:

查看进程命令:ps -ef(查看所有进程);要筛选的话用grep

筛选svn的进程命令:ps -ef|grep svn

[root@localhost SvnRepository]# ps -ef|grep svn

杀死主进程:

杀死进程的命令用kill -9 进程id

[root@localhost SvnRepository]# kill -9 12444                #杀死进程ID12444

启动svn

启动svn的命令用svnserve -d -r创建的版本库路径

-d表示svnserve.exe作为服务程序运行在后台;-r表示将创建的版本库的目录当作根目录。

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/testrpo

#启动运行版本库/usr/local/SvnRepository/testrpo

在此查看svn进程

重启成功。

3.5、svn服务自动启动

只需要在系统文件/etc/rc.local文件中添加启动软件的命令,就可以实现开机自动启动,因为系统启动以后会加载这个文件。

启动运行指定版本库的命令:

svnserve -d -r /usr/local/SvnRepository/testrpo

使用编辑器打开/etc/rc.local文件进行编辑

[root@localhost ~]# vi /etc/rc.local

添加启动命令

svnserve -d -r /usr/local/SvnRepository/testrpo

保存退出。

查看/etc/rc.local这个文件是否拥有执行权限,这个文件在centos7中默认是没有执行权限的,如果没有执行权限,开机是不能够执行该文件的,因此需要赋予执行权限(x)

[root@localhost ~]# chmod +x /etc/rc.d/rc.local         #授予/etc/rc.d/rc.local文件写的权限,/etc/rc.local这个文件只是/etc/rc.d/rc.local的快捷方式。

[root@localhost ~]# reboot            #重启系统

[root@localhost ~]# ps -ef|grep svn               #查看svn的进程

开机自动启动成功

4、svn的基本操作

4.1、svn的常见术语及文件状态

常见术语:

版本库、检出、工作副本、更新、提交、版本、版本号

文件状态:

无版本控制、增加、修改、常规、冲突、删除、锁定

研发A在客户端的工作副本中新建文件或文件夹后的状态为:无版本控制

此时该文件并未加入版本控制中

要对“无版本控制”的文件加入到版本控制中需要执行“增加(add)”操作

此时该文件状态称为“增加”

要对“增加”的文件加入到版本控制中需要执行“提交(commit)”操作,

执行提交操作以后服务器收到该文件以后进行保存操作,完成后将版本号加1,并向工作副本发送一个反馈信号,客户端收到该信号以后,也将自己的工作副本加1,同时将提交的文件又变成“常规”状态

当研发B进行了更新操作

研发B对文件进行了修改,此时文件的状态变为“修改”状态

此时研发B向服务端提交了这些文件

以后,服务端保存后,版本号加1,变为了2,并且客户端二的版本也变成了2,此时它的文件也变成“常规”状态

当研发三执行更新操作,默认更新得到的数据就是最新版本的数据,因此更新到了版本2,直接跳过了版本1,如果在更新的时候指定参数版本号,可以指定更新到指定的版本。

4.2、checkout与export的区别于使用

checkout           表示检出

export                表示导出

checkout检出的工作副本目录中包含.svn文件夹,也就是checkout检出的工作副本中存在.svn的文件,检出后的文件是在版本控制之下的

export导出的工作副本目录中没有.svn文件夹,也就是单存的项目文件,没有.svn的文件夹,并且导出后的文件不在版本控制之下,所以export导出的文件不能称之为工作副本,因为.svn文件标记着工作副本的一切变化,如果是需要导出项目给客户演示的话,直接导出就可以了,就不需要用到版本控制。

例:

svn checkout -r 2                       #检出版本2

svn export -r 3                            #导出版本3

4.3、add、ci、up、del

add:添加文件到版本控制

svn add 文件目录名 --non-recursive              #只增加指定的目录,不增加文件目录下的文件

svn add *          #增加当前目录下的所有文件到版本控制中,如果是目录增加了,目录下的文件没有增加,那该命令不会扫描已增加的目录下未增加的文件

svn add * --force #强制执行添加所有没有添加到版本控制中的文件或文件目录

commit(ci):提交修改到服务端(创建一个新版本号)

svn commit -m “备注” 文件名       #提交指定文件到svn服务器(-m参数是必须要加的参数)

svn commit -m “备注” *          #提交当前目录下所有修改过的文件

update(up):更新工作副本

svn update       #更新工作副本(默认情况下,每个文件只会从服务端更新一次最新版本)

svn update * #强制更新所有文件为最新版本

svn update -r 版本号 文件名                 #指定更新到某个版本号

delete(del):从版本库中删除文件或目录

svn delete 文件名           #从版本库中删除文件或目录

svn delete -m “备注” 文件名                   #删除文件时添加备注

4.4、客户端diff、mkdir、cat

diff:版本差异比较

svn diff 文件名       #比较本地操作过的工作副本和本地最后一次从服务器更新的副本

svn diff -r 版本号 文件名     #比较当前修改过的文件和指定的历史版本

svn diff -r 版本号1:版本号2    文件名     #比较两个历史版本中文件的差异

svn diff               #扫描所有修改过的文件和本地最后一次从服务器更新的副本比较

mkdir:创建目录并增加到版本控制

svn mkdir test.txt              #创建文件test.txt文件并添加到版本控制中

cat:不检出工作副本,直接查看指定文件(可以脱离工作副本)

svn cat svn://192.168.244.128/index                #在Linux系统上,不在svn的工作副本中,查看指定文件。

4.5、工作副本还原revert

将修改过的文件还原为与最后一次跟新副本的文件一致(在未添加到版本控制之前),修改的内容是不保存的,也就是将本次的修改不生效,还原到最后一次更新的工作副本

svn revert 文件名           #指定还原文件

svn revert *               #还原当前目录下的所有文件或目录

svn revert --resursive *  #递归还原当前目录下的所有文件或目录

4.6、二进制冲突与树冲突

二进制冲突:一些代码文件中具体到某个文件的具体行数

如果开发B在09:20进行一次更新,那就是说,服务器已经默认开发B已经知道了开发A的修改,也就不会报冲突。

树冲突:发生冲突的文件都不是二进制文本文件

树冲突无法精确到行,并且处理树冲突必须处理整个文件,就比如两个开发人员在不同时间提交了相同图片名的不同图片。

处理冲突:

在协商之后处理完成冲突后需要告诉svn冲突已解决,

svn resolved 文件名                #告诉服务器冲突解决完毕,可以正常提交

4.7、锁定lock与解锁unlock

锁定与解锁就是为了防止冲突的解决方案

svn lock 文件名      #锁定文件,防止其他成员对文件进行修改,如果进行提交操作之后,会将该文件自动解锁

svn commit -m “注释” --no-unlock 文件名   #对锁定的该文件提交后,依旧不解锁。

svn unlock 文件名 #解锁文件

5、svn的进阶应用

5.1、ls、st、log、info

svn list               #列出当前目录下处于版本控制的所有文件

svn status         #列出工作副本中的文件(夹)的状态

文件的状态的含义:

?              #无版本控制

D                #已被标记从版本库中删除

M               #已被编辑过

A                #已被标记增加到版本控制中

R                #文件被替换

C                #文件存在冲突

!              #文件缺失

svn log               #查看提交日志(来自svn commit -m “注释”)

svn info              #工作副本及文件(夹)的详细信息

5.2、多版本库解决方案

TCP/IP协议的标准:

TCP/IP协议规定端口号范围为0-65535号

0-1023号为公认端口

1024-49151号为注册端口

49152-65535号为私有端口

5.1.1、不同端口启动多个版本库

在创建完版本库后,启动多个版本库需要指定监听的端口号

创建版本库:

进入到svn版本库的保存目录下,创建多个版本库

[root@localhost ~]# cd /usr/local/SvnRepository/ 

#进入到svn版本库的保存目录下

[root@localhost SvnRepository]# svnadmin create test01              #创建版本库test01

[root@localhost SvnRepository]# svnadmin create test02              #创建版本库test02

[root@localhost SvnRepository]# svnadmin create test03              #创建版本库test03

[root@localhost SvnRepository]# ls                  #查看创建的版本库

分别修改版本库下面的配置文件

authz:配置用户组合用户组的权限

passwd:配置用户名和用户密码

svnserve.conf:配置默认权限、权限配置文件及密码配置文件

指定端口监听启动版本库:

指定端口启动运行版本库

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/test01 --listen-port 3691  #指定监听端口为3691,启动版本库test01

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/test02 --listen-port 3692  #指定监听端口为3692,启动版本库test02

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/test03 --listen-port 3693  #指定监听端口为3693,启动版本库test03

[root@localhost SvnRepository]# ps -ef|grep svn       #查看svn的进程端口

这样,三个新添加的svn版本库都运行起来了

如果需要停止所得版本库运行,执行kill svnserve

检出多个版本库

svn checkout svn://192.168.244.128:3691 /usr/local/svnwork/test013691

#检出指定端口监听的版本库到指定工作副本中

5.1.2、一个端口启动多个版本库

多个版本库放在同一个目录下

在启动运行版本库时指定运行版本库的父级目录,这样一次就可以运行启动多个版本库

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/

检出的时候需要哪个检出哪个版本库就在IP后面加上版本库的名称

[root@localhost svnwork]# svn checkout svn://192.168.244.128/testrpo

#指定检出版本库testrpo

[root@localhost svnwork]# svn checkout svn://192.168.244.128/testrpo1

#指定检出版本库testrpo1

5.3、svn的copy命令

功能:

工作副本à工作副本

svn cp 源文件名称 目标文件名称

如果在工作副本中使用svn的copy命令复制的文件,如果复制的源文件有版本控制,则复制完成的目标文件也是有版本控制的,如果是复制的源文件是没有版本控制的,那么复制完成的目标文件也是没有版本控制的,此时需要使用svn的增加和提交命令才能有版本控制。

svn cp -r 版本号 源文件名 目标文件名

指定复制版本号的文件

工作副本à版本库

svn cp 源文件名 版本库服务器地址(目标文件地址) -m “提交注释”

复制一个工作副本直接提交到版本库,不支持夸库操作

此时服务器上的版本库中有了这个新的文件,版本号会自动加1

版本库à工作副本

svn cp 版本库服务器地址(源文件地址) 本地工作副本目标地址

将服务器上版本库中的文件复制到本地的工作副本中,该操作可以夸库操作

版本库à版本库

svn cp 服务器上源文件地址 服务器上目标地址 -m “提交注释”

不可夸库操作,本地的工作副本,直接提交的。

5.4、主干版本与分支版本

创建分支版本的过程是完全脱离工作副本进行的,使用版本库到版本库之间的copy操作,实现主干和分支。

#复制服务器上的imooc版本库到服务器上imooc版本库中的trunk(主干)目录下,该目录下存放的就是原来的所有文件。

#在imooc版本库中复制一份主干版本(trunk)到imooc版本库中作为分支版本(branch)。

6、svn的高级应用

6.1、hooks钩子应用

钩子:当执行某些特定操作时触发执行预先设定好的任务。

在svn的版本库中存在文件目录hooks,里面有很多的.tmp格式的模板文件,如果需要让钩子生效,只需要将对应的文件复制一份,把.tmp这个拓展名去掉,重启svn服务,就可以启动这个钩子了,而钩子文件就是一个shell脚本,这里的执行对应任务,就是执行对应的shell脚本,可以在该脚本里面编写自己需要执行的任何脚本。这些钩子的前缀有start(数据传输开始之前),pre(数据传输之后,写入版本库之前),post(写入版本库之后),后半部分才是对应的操作名,比如commit、lock、unlock等

例:在svn中每次提交完成以后,调用钩子函数,利用Apache需要将版本库的最新信息通过网页可以直接访问。

第一步:复制钩子文件

进入到svn服务器的版本库中找到hooks目录

进入hooks目录

复制一份提交完成后执行的钩子函数模板在当前hooks文件目录下,只需要将文件名的拓展名去掉。

查看钩子文件post-commit的权限,如果没有权限需要赋予执行权限

[root@localhost hooks]# ll

没有执行权限需要加上执行权限

[root@localhost hooks]# chmod +x post-commit

#添加文件的执行权限

第二步、编写钩子函数脚本

使用编辑器打开该钩子脚本post-commit进行编辑

[root@localhost hooks]# vi post-commit

写入shell脚本函数

如果使自己写的shell脚本,可以去掉该钩子文件的最后几行后

编写需要执行的脚本

在每次提交完成后,每次需要将最新的版本库的详细信息保存成一个xml文件,放到Apache的目录下,用户可以通过网页浏览版本库的详细信息。

svn info svn://192.168.244.128 --xml >> /var/www/html/repo.xml

编辑完成,保存退出

第三步、重启svn服务

[root@localhost hooks]# ps -ef|grep svn                 #查看svn的进程

[root@localhost hooks]# kill -9 2155                #杀死进程

[root@localhost hooks]# svnserve -d -r /usr/local/SvnRepository/testrpo              #启动svn服务

第四步、测试

在工作副本中进行一次提交操作

配置Apache默认访问地址

[root@localhost ~]# cd /etc/httpd/conf.d/

[root@localhost conf.d]# ls

[root@localhost conf.d]# vi welcome.conf

配置完成,保存退出,重启Apache

[root@localhost conf.d]# service httpd stop            #停止Apache服务

[root@localhost conf.d]# service httpd start           #启动Apache服务

打开浏览器访问svn钩子生成的xml文件

http://192.168.244.128/repo.xml

6.2、版本库精简

版本库的精简也就是说把之前的老旧的一些版本号丢掉,达到精简的目的。

[root@localhost svnwork]# svn info                 #查看当前的最大版本号

现在需要丢弃版本1到版本3,只留版本4到版本6

首先停止svn的服务

[root@localhost svnwork]# ps -ef|grep svn

[root@localhost svnwork]# kill -9 2487

把需要保留的版本数据备份出来

[root@localhost svnwork]# svnadmin dump /usr/local/SvnRepository/testrpo -r 4:6 > ~/testrpo.repo

#将版本库/usr/local/SvnRepository/testrpo的4到6的版本备份到用户目录下的testrpo.repo

这里的版本库一定要写版本库文件系统的路径

备份成功

创建新的版本库,将备份的版本库加载进去

[root@localhost SvnRepository]# svnadmin create /usr/local/SvnRepository/newrepo

#创建新的版本库

将备份的版本库加载到新创建的版本库中

[root@localhost SvnRepository]# svnadmin load /usr/local/SvnRepository/newrepo/ < ~/testrpo.repo

#将备份的版本库~/testrpo.repo加载到新创建的版本库/usr/local/SvnRepository/newrepo/

版本库精简过后,它的版本号依然是从1开始的,它会将丢弃的版本号一次填充进来,但不填充数据。原来的版本4,现在变成了1,原来的版本号6,变为现在的版本号3.

将原来的配置文件复制到新的版本库的目录下

[root@localhost SvnRepository]# cp -av /usr/local/SvnRepository/testrpo/conf/* /usr/local/SvnRepository/newrepo/conf/

现在局可以将原来的版本库删掉了。

svn启动运行新的版本库

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/newrepo/

在做了版本精简操作后原来的工作副本不能够正常使用,因为版本号已经对应不上了,所以需要重新检出一份才能够进行操作。

6.3、版本库的迁移与重定向

6.3.1、版本库的迁移

通常是服务器更换了,我们需要把数据迁移到新的服务器上。

第一种方法:

可以用版本库精简的方法,需要备份的文件充0到最新的版本号,再将备份文件复制到新的服务骑上,创建版本库后,在加载到新建的版本库。

第二种方法:

①停止svn版本库的服务

ps -ef|grep svn         #查询svn的进程

kill -9 进程ID          #关闭svn的服务

②把版本库压缩成.zip文件

③复制压缩文件到新的服务器上解压

④在新的服务器上启动运行解压的这个版本库

6.3.2、版本库的重定向

迁移了数据以后,需要在工作副本中将原来的服务器地址切换成新的服务器地址(也就是版本库的重定向)

重定向的命令:

svn switch --relocat 原来的URL 新的URL

这样就能够重定向工作副本的地址

7、svn常见的坑

1、创建完版本库之后忘记修改svnserve.conf文件

svnserve.conf文件,路径为创建的版本库的目录下的conf目录下,需要在这个文件中指定每个配置文件的位置。

2、运行版本库的路径问题

在启动运行svn服务的时候,如果没有写版本库的名称,在检出时的URL后面一定需要跟上版本库的名称,也就是说运行的时候没有写,检出的时候就必须写,运行时写了,检出时就不用写

3、svnadmin dump/load 管道符号的问题

备份的时候是大于号(>),加载的时候是小于号(<),如果在加载的时候写错了管道符号,数据会被覆盖,相当于备份的数据被覆盖删除了,只要写错一次备份的数据就没了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章