svn服务器备份svnsync命令怎么用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了svn服务器备份svnsync命令怎么用相关的知识,希望对你有一定的参考价值。
有较多参数命令,可在命令行输入 svnsync help来查看;网上相关实例蛮多,可百度下。使用svnsync备份很简单,只有四个步骤,在这里和大家简单介绍一下,希望通过本节的学习大家能够掌握使用svnsync命令对SVN库进行备份的方法。
下面是具体的备份步骤:
一、在备份机上创建一个空库:svnadmincreateSMP
二、更改该库的钩子脚本pre-revprop-change(因为svnsync要改这个库的属性,也就是要将源库的属性备份到这个库,所以要启用这个脚本):
cdSMP/hooks;
cppre-revprop-change.tmplpre-revprop-change;
chmod755pre-revprop-change;
vipre-revprop-change;
将该脚本后面的三句注释掉,或者干脆将它弄成一个空文件。
三、初始化,此时还没有备份任何数据:
svnsyncinitfile:///home/backup/svn/svnsync/SMP/http://svntest.subversion.com/repos/SMP
语法是:svnsyncinit你刚创建的库url源库url
注意本地url是三个斜杠的:///
四、开始备份SVN库:
svnsyncsyncfile:///home/backup/svn/svnsync/SMP
这是就一个个版本进行备份了。我们来看一下SVN库备份过程中可能出现的错误。
附录:
可能的报错一:
Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' Failedtogetlockondestinationrepos,currentlyheldby'bug1.corp.scmbbs.com:0c424c20-2e3b-0410-bd34-7fdd53c25d02' svnsync:Couldn'tgetlockondestinationreposafter10attempts
这个时候可能属性被锁了,删掉属性:svnpropdelsvn:sync-lock--revprop-r0file:///home/backup/svn/svnsync/SMP
删除成功后,再试一遍基本就可以了。如果反复操作都是同样错误的话,有可能是你的svn安装的有问题,重新安装一遍就好了,俺就是这样。
可能报错二、
svnsync:REPORTrequestfailedon'http://svn1.subversion.com/repos/Relevance'
svnsync:Therequestedreportisunknown.这是因为你源库的版本太低了,svnsync所需要的函数Report是svn1.4后加入的。没办法,对你的SVN库进行升级后才能备份。 参考技术A 剪贴一下我看看
SVN服务器备份
目录
前言
SVN数据备份、还原、适用情况、部分异常处理等介绍。备份方式主要有hotcopy、dump以及svnsync三种方式。三类备份方式各有优劣,根据自身情况及需求选择即可。
此外,特别说明,备份还原或者同步后数据原权限分配在特殊情况下可能失效,导致客户端无法正常访问情况。因此还原后最好检查各仓库权限配置是否正常并调整。权限分配方法可参根据需要参考 SVN服务器安装 - Linux系统 或者 SVN服务器安装 - Windows系统。
1 hotcopy备份
1.1 方法说明
hotcopy备份本质上就是仓库完整拷贝。
优点 - 备份过程较快,灾难恢复也快。
缺点 - 无法分段备份,因此单次备份时,硬盘消耗相对较大 。
整体上对比来说,hotcopy的灵活度比不过dump,即时同步方面比不上过svnsync;而相对的,他的备份跟恢复方法简单便捷,备份跟恢复的速度也比dump快。特别是当仓库大,版本数量级达到数万之后,hotcopy在这方面的优势会远远大于dump。
1.2 手动备份
如果当前SVN服务器处于未使用状态,直接使用对应系统的复制黏贴功能,最终结果是一样的;若处于使用中,当某些文件处于锁定状态,直接用复制黏贴功能可能出现文件损坏等不可预计问题,此时建议使用官方指令。
备份指令:
svnadmin hotcopy /svn/project /backup/project 或者
svnadmin hotcopy /svn/project /backup/project --clean-logs
注:/svn/project为原库,/backup/project为备份库
1.3 自动备份
自动备份一般是通过编写备份脚本,再通过系统定时任务功能调用该脚本实现。
1.3.1 备份脚本
备份脚本在不同系统下略有差异。如下提供Linuxs与Windows两个系统的脚本示例。
A. Linux系统
a) 执行指令:
vi hotcopy.sh
b) 编辑内容:
#!/bin/sh
#仓库根目录
home=/svn/store
#备份根目录
backup=/back
#备份根目录不存在则创建
if [ ! -d "$backup" ]; then
mkdir -p $backup
fi
#备份仓库名
store1=project
#备份仓库目录存在则删除, 做个赋值动作保证删除动作完成后再备份
if [ -d "$backup/$store1" ]; then
result=`rm -rf $backup/$store1`
fi
#执行备份指令
/usr/bin/svnadmin hotcopy $home/$store1 $backup/back_$store1 --clean-logs
c) 编辑完成后,按键盘Esc
键后输入 :wq
按回车键保存退出
d) 设置文件操作权限,执行指令:
chmod 777 hotcopy.sh
B. Windows系统
a) 新建TXT文档
b) 编辑文档内容
echo off
rem SVN安装路径
set svn="C:\\Program Files (x86)\\VisualSVN Server\\bin"
rem 仓库根目录
set home=E:\\SVN
rem 备份根目录
set back=D:\\backup
rem 仓库
set store=Report
rem 备份根目录是否存在
if exist %back% goto check1
md %back%
:check1
rem 若备份仓库目录存在,删除备份仓库目录,否则备份无法正常执行
if not exist %back%\\%store% goto check2
rd /s/q %back%\\%store%
:check2
rem 进入SVN安装路径
cd %svn%
rem 执行备份
svnadmin hotcopy %home%\\%store% %back%\\%store% --clean-logs
c) 保存文件为hotcopy.bat
。
记得在“保存类型”中“所有文件(.)”,否则最终输出文件会变成
hotcopy.bat.txt
1.3.2 定时任务
不同系统定时任务设置方式也有差异,这里主要介绍Linux系统及Windows系统定时任务设置。
A. Linux系统
a) 编辑定时任务
执行指令:
vi /etc/crontab
在文档最后添加内容:
0 0 * * * root /home/script/hotcopy.sh
格式为:分 时 日 月 周 用户 脚本路径
b) 查看定时器当前状态
指令:
service crond status
若定时器未启动,可执行启动指令:
systemctl start crond.service
结果输出类似如下表示已启动:
Redirecting to /bin/systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2022-04-10 07:19:22 CST; 1 weeks 5 days ago
Main PID: 1263 (crond)
CGroup: /system.slice/crond.service
└─1263 /usr/sbin/crond -n
4月 10 07:19:22 localhost.localdomain systemd[1]: Started Command Scheduler.
4月 10 07:19:22 localhost.localdomain systemd[1]: Starting Command Scheduler...
4月 10 07:19:22 localhost.localdomain crond[1263]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 27% if used.)
4月 10 07:19:22 localhost.localdomain crond[1263]: (CRON) INFO (running with inotify support)
4月 22 17:13:01 localhost.localdomain crond[1263]: (*system*) RELOAD (/etc/crontab)
c) 查看执行记录
指令:
cat /var/spool/mail/root
说明:指令中最后的root为用户名
B. Windows系统
a) 右键“计算机”,在菜单中选择“管理”。
注:“计算机”示例是在Windows程序菜单选择的。实际也可以在文件夹左侧目录或者桌面图标中选择
b) 在“计算机管理”界面中,选择左侧“任务计划程序”,后,点击右侧“创建基本任务”。
注:也可以选择右侧第二个“创建任务”进行更复杂的设置,不过一般来说基本任务就可以满足相关操作了。
c) 设置任务名称及描述
d) 设置触发器,即任务周期时间
注:这部分可以根据自身需求执行设置相关内容,示例为每天零时备份
e) 设置操作,选择“启动程序”并设置好需要执行的脚本,进入“下一步”
f) 完成,该部分会展示整个设置结果,检查设置是否正确。点击“完成”完成任务设置
g) 最后可通过左侧“任务计划程序库”查看定时任务设置是否成功
1.4 还原方法
整体仓库还原方法相对简单。根据实际情况,主要有两种还原方法
A. 修改仓库根目录
该方法主要使用在原系统未安装SVN服务器的情况下,直接将仓库根目录指定到备份仓库所在父级目录。
B. 复制备份仓库到仓库根目录
该方法适用于原系统已经安装SVN服务器。
注:其实,若参考根目录下无任何仓库,或者其中仓库数据明显小于备份仓库的情况下,也可以使用A方法,然后将原有的仓库移到新的根目录下。
1.4.1 VisualSVN 还原
A. 修改仓库根目录
修改仓库根目录有两种方式
a) 在软件安装过程中,到如下步骤时,将Respositories路径设置为备份仓库所在父级目录
b) 软件安装完成后,运行VisualSVN。点击操作“Properties”,打开“VisualSVN Server Properties”对话框,并选中“Storage”选项卡,修改其中“Repositores Root”选项,点击“确认”保存即可。
B. 复制备份仓库到仓库根目录
通过A方法中的b) 方法找到仓库根目录,将备份仓库直接复制黏贴到该路径下即可。
1.4.2 SubVersion 还原
A. 修改仓库根目录
a) 停止已运行的svn服务,若未运行过,直接忽略即可
指令:
killall svnserve
b) 启动svn服务
指令:
svnserve -d -r /backup --listen-port=3690
注:其中/svn/back为参考根目录
B. 复制备份仓库到仓库根目录
指令:cp -rf /backup/project /svn
注: /backup/project为备份仓库, /svn为仓库根目录
1.5 异常提示
A. 异常现象
expected fs format between 1 and 4 found format 6
B. 解决方法
该原因主要由于源库版本较低引起的。新库VisualSVN更新到版本2.7.1以上,Subversion更新到版本1.7.2以上,基本可以解决该问题。
2 dump备份
2.1 方法说明
dump是官方推荐的备份方式,需使用专门的版本还原机制。
优点 – 可全量备份也可增量备份,可根据需要灵活备份或还原指定版本。
缺点 – 相对还原麻烦,特别是版本量多时,还原速度较慢。
整体上对比来说,dump的主要优势就在于灵活。虽然它是官方推荐的备份方式,但是目前从使用方便度来说,个人觉得没有hotcopy跟svnsync好用,除非真有这类灵活备份还原的需求。
都说hotcopy硬盘损耗大,其实dump备份更大。hotcopy备份库也就跟原库一样大,但是用dump备份的后不管是全量还是增量备份,最后都会比原库大很多。
个人SVN仓库27.5G、1.7w+版本,采用全量备份,备份文件45G,采用增量备份,各分段备份文件总和也是45G。备份文件差不多是原库大小的1.6倍。
所以在硬盘资源方面它相对于hotcopy其实是没有优势,而还原备份速度方面的劣势就更不用说了。
可能在本章的自动备份脚本里面会发现,dump增量备份里面,可以根据是否版本有更新再确定是否进行备份操作,而hotcopy跟dump全量备份里都是直接备份的。从这个方面来说dump的增量备份貌似会有优势。但是,实际上,另外两个脚本也可以加同样的版本判断的,只是我没加上去,实际应用中,可根据需要自行添加的,方法参考增量备份的脚本即可。
2.2 手动备份
dump只能通过指令备份。
在linux系统中,可直接通过dump指令执行。但是在Windows中,必须使用DOS指令进入到软件安装路径的bin文件夹下才能进行相关操作,如下图所示。
无论是Linux系统还是Windows系统,备份指令是相同的,具体如下。
全量备份:
svnadmin dump /svn/project --revision 100> /back/project100.dump
增量备份:
svnadmin dump /svn/project --revision 101:200 --incremental > /back/project101-200.dump
注:
/svn/project为原库,
/back/project100.dump、/back/project101-200.dump为备份文件名,
100、101、200为需要备份的版本
2.3 自动备份
2.3.1 备份脚本
备份脚本在不同系统下略有差异。如下提供Linuxs与Windows两个系统的脚本示例。
A. Linux系统
a) 执行指令:
vi dump.sh
编辑内容 b)、c)二选一即可。全量备份脚本选择 b)、增量备份脚本选择 c)
b) 全量备份编辑内容
#!/bin/sh
# 仓库根目录
home=/svn/store
# 备份根目录
backup=/back
# 备份根目录不存在则创建
if [ ! -d "$backup" ]; then
mkdir -p $backup
fi
# 备份仓库名
store1=r1
# 时间字符串变量
d=$(date '+%Y%m%d')
# 备份指令
/usr/bin/svnadmin dump $home/$store1 > $backup/$store1_$d.dump
c) 增量备份编辑内容:
#!/bin/sh
# 仓库根目录
home=/svn/store
# 备份根目录
backup=/back
# 备份根目录不存在则创建
if [ ! -d "$backup" ];then
mkdir -p $backup
fi
# 备份仓库名
store1=project
# 备份根仓库目录不存在则创建
if [ ! -d "$backup/$store1" ];then
mkdir -p $backup/$store1
fi
# 获取仓库当前最新版本
svnlook youngest $home/$store1 > $backup/tmp_$store1.TMP
upper=$(cat $backup/tmp_$store1.TMP)
# 上次备份版本信息文件不存在最低版本为1,存在读取
if [ ! -f "$backup/last_$store1.txt" ];then
lower=1
else
num_lower=$(cat $backup/last_$store1.txt)
lower=`expr $num_lower + 1`
fi
# 上次备份版本小于等于最高版本时,执行备份操作,并重写上次备份版本信息文件
if [ $num_lower -le $upper ]; then
svnadmin dump $home/$store1 --revision $lower:$upper --incremental > $backup/$store1_$lower-$upper.dump
echo $upper > $backup/last_$store1.txt
fi
# 删除临时版本文件
rm -rf tmp_$store1.TMP
d) 编辑完成后,按键盘Esc键后输入:wq按回车键保存退出
e) 设置文件操作权限
指令:
chmod 777 dump.sh
B. Windows系统
a) 新建TXT文档
编辑内容 b)、c)二选一即可。全量备份脚本选择 b)、增量备份脚本选择 c)
b) 全量备份编辑内容
echo off
rem SVN安装路径
set svn="C:\\Program Files (x86)\\VisualSVN Server\\bin"
rem 仓库根目录
set home=E:\\SVN
rem 备份根目录
set back=D:\\backup
rem 仓库
set store=Report
rem 备份根目录是否存在
if exist %back% goto check1
md %back%
:check1
rem 若备份仓库目录不存在,则创建仓库
if exist %back%\\%store% goto check2
md %back%\\%store%
:check2
rem 时间字符串变量
set d=% date:~0,4%%date:~5,2%%date:~8,2%
rem 进入SVN安装路径
cd %svn%
rem 执行备份
svnadmin dump %home%/%store% > %backup%/%store%_%d%.dump
c) 增量备份编辑内容
echo off
rem SVN安装路径
set svn="C:\\Program Files (x86)\\VisualSVN Server\\bin"
rem 仓库根目录
set home=E:\\SVN
rem 备份根目录
set back=D:\\backup
rem 仓库
set store=Report
rem 备份根目录是否存在
if exist %back% goto check1
md %back%
:check1
rem 备份仓库目录是否存在
if exist %back%\\%store% goto check2
md %back%\\%store%
:check2
rem 进入SVN安装路径
cd %svn%
rem 获取指定仓库当前最新版本
svnlook youngest %home%\\%store% > %back%\\%store%\\TMP.TXT
set /p upper=<%back%\\%store%\\TMP.TXT
rem 设置最低版本为0
set lower=0
rem 是否存在上次备份版本信息,存在则读取数据更换最低版本值
if not exist %back%\\%store%\\last.txt goto check3
set /p lower=<%back%\\%store%\\last.txt
:check3
rem 最低版本加1
set /a lower=lower+1
rem 如果最低版本大于最高版本,不备份
if %lower% gtr %upper% goto end
rem 执行备份指令
svnadmin dump %home%\\%store% --revision %lower%:%upper% --incremental > %back%\\%store%\\%lower%-%upper%.dump
rem 更新上次备份版本信息
echo %upper% > %back%\\%store%\\last.txt
:end
rem 删除临时版本文件
del %back%\\%store%\\TMP.TXT
d) 保存文件为dump.bat
。
记得在“保存类型”中“所有文件(.)”,否则最终输出文件会变成dump.bat.txt
2.3.2 定时任务
定时任务设置方法可参考 1.3.2 定时任务,只需将对应脚本文件替换成2.3.1中的备份脚本即可。
2.4 还原方法
dump备份还原需使用load指令,全量备份情况下直接还原指定版本即可。增量备份文件需按版本顺序还原备份文件。
指令:
svnadmin load /svn/project < /back/project100.dump
/svn/project为服务器仓库路径,/back/project100.dump为待恢复备份文件
2.5 异常提示
A. 异常现象
出现异常提示,主要是在增量备份之时,可能出现如下异常提示:
* 已转存版本 7292。
WARNING 0x0000: 版本 2543 引用的数据比最旧的转存版本 (r7001) 还旧。加载这个转存到空的版本库会失败。
WARNING 0x0000: 版本 2543 引用的数据比最旧的转存版本 (r7001) 还旧。加载这个转存到空的版本库会失败。
* 已转存版本 7293。
* 已转存版本 7294。
* 已转存版本 7295。
……
WARNING 0x0000: 导出的版本范围包含的引用超出导出范围。
B. 异常原因
造成该现象原因是因为版本管理过程中出现过版本回滚。以A中示例提示为例:版本7293是版本7292之后回滚到版本2543后修改后提交所得,而这个备份范围是在版本7000-8000,因此做增量比较时,找不到其中的相对源版本2543。
C. 注意事项
如果还原是所有版本逐步还原的情况下,这种提示可忽略,不受影响。但是如果想要删除部分版本的情况下,含这类异常提示的则需要特别处理。
a) 不能删除高于或等于相对源版本的版本
计划删除较老版本,只保留新版本的情况下,基础版本就不能大于相对源版本。以A中示例提示为例,在仅有以上提示情况下,新的基础版本号(全量备份)不能大于2543,否则无法还原。以下为该类操作示例。
[root@localhost /]# svnadmin dump /svn/store/test/ --revision 7000 > /back/7000.dump
* 已转存版本 7000。
[root@localhost /]# svnadmin dump /svn/store/test/ --revision 7001:8000 --incremental > /back/7001-8000.dump
……
* 已转存版本 7292。
WARNING 0x0000: 版本 2543 引用的数据比最旧的转存版本 (r7001) 还旧。加载这个转存到空的版本库会失败。
WARNING 0x0000: 版本 2543 引用的数据比最旧的转存版本 (r7001) 还旧。加载这个转存到空的版本库会失败。
* 已转存版本 7293。
……
* 已转存版本 7999。
* 已转存版本 8000。
WARNING 0x0000: 导出的版本范围包含的引用超出导出范围。
[root@localhost /]# svnadmin load /svn/store/test < /back/7000.dump
……
* 正在修改路径: Projects/test-Monitor-DBScript/MySQL/SiteMonitor/1.0 Init.sql ...完成。
* 正在修改路径: Projects/test-Monitor-DBScript/MySQL/CenterMonitor ...完成。
* 正在修改路径: Projects/test-Monitor-DBScript/MySQL/CenterMonitor/1.0 UpdateBusiness.sql ...完成。
------- 提交新版本 1 (从原始版本 7000 装载) >>>
[root@localhost /]# svnadmin load /svn/store/test < /back/7001-8000.dump
<<< 开始新的事务,基于原始版本 7094
* 正在修改路径: Projects/test-Monitor-SMMonitor/src/com/idbk/test/sm/monitorx/alarmlogic/AlarmCatchingTask.java ...完成。
------- 提交新版本 95 (从原始版本 7094 装载) >>>
<<< 开始新的事务,基于原始版本 7095
* 正在修改路径: Projects/test-Monitor-SMMonitor/src/com/idbk/test/sm/monitorx/data/Device8583AlarmData.java ...svnadmin: E160006: 当前版本库不存在相对源版本 -90
b) 不能删除中间版本
增量版本必须按顺序逐个恢复,不能跳过中间版本。哪怕如示例中,版本7293的实际是版本是2543调整修改的,版本2544至7292看起来是可以废弃不用的,但是在备份还原中如果跳过这些版本依然无法还原。以下为该类操作示例。
[root@localhost /]# svnadmin load /svn/store/test1 < /back/2543.dump
……
* 正在修改路径: Projects/Versions/Bin/CS-网点充值/Logs/20150610.log ...完成。
* 正在修改路径: Projects/Versions/Bin/CS-网点充值/Logs/20150619.log ...完成。
* 正在修改路径: Projects/Versions/Bin/CS-网点充值/Logs/20150722.log ...完成。
* 正在修改路径: Projects/Versions/Bin/CS-网点充值/dcrf32.dll ...完成。
* 正在修改路径: Projects/Versions/Bin/ChargingStation-Web.war ...完成。
* 正在修改路径: Projects/Versions/Bin/ChargingStation-WebMgr.war ...完成。
------- 提交新版本 1 (从原始版本 2543 装载) >>>
[root@localhost /]# svnadmin load /svn/store/test1 < /back/7293-7300.dump
<<< 开始新的事务,基于原始版本 7293
* 正在修改路径: Projects/CSProject/Common/Common.csproj ...完成。
* 正在修改路径: Projects/CSProject/Common/Financial/DataInitialUserCard.cs ...完成。
* 正在修改路径: Projects/CSProject/Common/HttpClient/DataQueryResult.cs ...完成。
* 正在修改路径: Projects/CSProject/Common/HttpClient/LoginResult.cs ...完成。
* 正在修改路径: Projects/CSProject/Common/HttpClient/VehicleBrands.cs ...svnadmin: E160006: 当前版本库不存在相对源版本 -4748
3 svnsync同步
3.1 方法说明
svnsync需SVN1.4版本以上才支持。svnsync实际上是类似于同时存在两个SVN服务器,只是备份服务器相当于替补的角色。
优点 – 当主服务器损坏时,备份服务器可以直接使用,无缝连接。
缺点 – 无法直接还原到指定版本,初始服务器搭建配置相对前两种方法略复杂。
svnsync是本人相对喜欢的备份方式。相对于其他两种备份方式而言,svnsync的初始配置相对要复杂很多,但是也就最开始的部署配置麻烦些,后面就很香了。
最直接的就是省掉了备份还原的动作,不同于hotcopy跟dump需要另外借助系统任务管理功能定时进行备份操作,svnsync在客户端提交版本的同时就同步到备份服务器了,备份及时且方便。在主服务损坏时,另外两类备份方法需要重新搭建服务器或者复原仓库,但是svnsync备份服务器立即就可以用上。
此外,svnsync一般是将仓库数据同步到另外一台服务器,相对来说,两边数据同时出现意外的概率相对要小。当然hotcopy跟dump也可以通过FTP等方式将数据直接备份到另一台服务器上。但是这样一来,这两种方法的初期配置就不见得比svnsync简单了。
3.2 备份方法
3.2.1 SVN服务器安装
在备份服务器中安装SVN服务器,并创建与主服务器相对应的仓库。具体方法参考SVN服务器安装 - Linux系统 或者 SVN服务器安装 - Windows系统。
3.2.2 创建钩子脚本
因为svnsync备份需要修改备份服务器仓库属性,因此会调用钩子脚本,而仓库原本的钩子脚本是不允许外部修改的,因此需要重新创建。
A 钩子脚本路径
/svn根目录/工程目录/hooks/
B 钩子脚本文件
钩子脚本文件编辑,需进入到工程目录下,创建对应钩子脚本。
最简单的钩子脚本文件如下:
exit 0;
若不想改变原本钩子脚本逻辑,仅需要在同步时允许指定用户(admin)可进行同步操作,可做如下修改。
Linux系统
a) 脚本内容:
cd /svn/store/project/hooks/
vi pre-revprop-change
#!/bin/sh
EPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
if [ "$USER" = "admin" ]; then exit 0; fi
echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1
b) 编辑完后, 按键盘Esc键后输入 :wq,回车 保存退出
c) 执行指令,修改权限。
chmod 777 pre-reprop-change
Windows系统
在钩子脚本文件路径(hooks)下新建一个TXT文档,编辑如下内容后,保存为pre-revprop-change.bat文件。
编辑内容如下:
setlocal
set REPOS=%1
set REV=%2
set USER=%3
set PROPNAME=%4
set ACTION=%5
if "%USER%"=="admin" goto OK
if not "%ACTION%"=="M" goto refuse
if not "%PROPNAME%"=="svn:log" goto refuse
goto OK
:refuse
echo Cann't set %PROPNAME%/%ACTION%, only svn:log is allowed 1>&2
endlocal
exit 1
:OK
endlocal
exit 0
3.2.3 初始化
此时仅初始化,并未同步任何数据
指令:
svnsync init svn://192.168.162.111/project file:///svn/project/
注:
a 备份服务器 - svn://192.168.162.111/project,
b 主服务器 - file:///svn/project/
c 本地文件路径前必备为 file:///
初始化过程会要求输出系统登录用户密码,工程仓库用户名/密码。按照提示输入即可
最终输出结果:
认证领域: <svn://192.168.162.111:3690> 33b7e9f6-c1de-11ec-8ff6-bd779d2ded64
“root”的密码: ****
认证领域: <svn://192.168.162.111:3690> 33b7e9f6-c1de-11ec-8ff6-bd779d2ded64
用户名: admin
“admin”的密码: ******
复制版本 0 的属性。
3.2.4 同步
svnsync可自动同步也可手动同步,一般来说初次会手动同步一次,后续会采用自动同步。
A. 手动同步
在Windows系统中可通过以下指令直接同步,但是在Linux同步过程中还会要求输入密码,根据实际要求操作即可。
同步指令: svnsync sync svn://192.168.162.224/project
输出结果:
传输文件数据...............
已提交版本 8405。
复制版本 8405 的属性。
传输文件数据...
已提交版本 8406。
复制版本 8406 的属性。
B. 自动同步
a) 初始同步之后可在/svn根目录/工程目录/hooks/ 路径下找到 post-commit.tmpl,
b) 复制脚本文件,Linux系统更名为post-commit, Windows系统中更名为pos-commit.bat。
c) 编辑新文件,Linux及Windows均是在文档最后一行加入以下内容:
svnsync sync --non-interactive svn://192.168.162.111/project --username admin --password admin
d) 保存编辑内容
Linux系统:
编辑完后,按键盘Esc键后输入 :wq保存退出
执行 chmod 777 pre-reprop-change 指令,修改权限。
Windows系统:
直接ctrl+s保存即可。
注:
a svn://192.168.162.111/project为备份服务器仓库路径, 第1/2个admin分别为备份服务器仓库用户名和密码
b 在Linux系统中记得修改post-commit脚本文件权限,否则将无法正常同步。
3.3 异常提示
3.3.1 未创建钩子脚本
A. 异常提示
svnsync: E165006: 此版本库不允许修改版本属性;请管理员创建 pre-revprop-change 钩子
B. 解决方法
造成该异常原因就是未创建钩子脚本,具体方法草考 3.2.2 创建钩子脚本即可
3.3.2 钩子脚本权限受限
A. 异常提示
svnsync: E165001: 版本属性改变 被 pre-revprop-change 钩子阻塞(退出代码 255) 没有输出。
B. 解决方法
造成该异常原因是创建钩子脚本未给予权限,进入钩子脚本所在路径,执行以下指令即可。
指令:chmod 777 pre-reprop-change
3.3.3 连接异常
A. 异常提示
无法连接主机“192.168.162.111”: 没有到主机的路
B. 原因分析
无法连接主机,有可能IP地址错误、网络异常等。若这几个方面都排出后,最大可能就是防火墙拦截。
C. 解决方法 — Linux系统
执行如下指令即可:
firewall-cmd --zone=public --add-port=3690/tcp --permanent
firewall-cmd –reload
D. 解决方法 — Window系统
a) 打开“控制面板”,找到“Windows防火墙”,选择“高级设置”。
b) 在弹出框中选择“入站规则”中的“新建规则”
c) 在弹框中选择“端口”后点击“下一步”,后续步骤根据需要逐一设置到最后点击“完成”。下图为整个过程示例。
3.3.4 无法锁定
A. 异常提示
Failed to get lock on destination repos, currently held by ‘EDGH19000803:22c497b2-67f1-e04c-b347-5e44d71d8f0b’
Failed to get lock on destination repos, currently held by ‘EDGH19000803:22c497b2-67f1-e04c-b347-5e44d71d8f0b’
svnsync: E000022: Couldn’t get lock on destination repos after 10 attempts
B. 解决方法
出现该异常主要是因为上一次同步过程中,因为某些原因而异常终止,导致下一次同步时无法正常同步。执行以下指令,清除锁即可。
指令:svn propdel svn:sync-lock –revprop –r0 svn://192.168.162.111/project
注: svn://192.168.162.111/project 为备份服务器
以上是关于svn服务器备份svnsync命令怎么用的主要内容,如果未能解决你的问题,请参考以下文章