浅谈 SVN 备份
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 "backupfi#备份仓库名 store1=project#备份仓库目录存在则删除, 做个赋值动作保证删除动作完成后再备份 if [ -d "store1" ]; thenresult=rm -rf $backup/$store1
fi#执行备份指令/usr/bin/svnadmin hotcopy store1 backup/back_{store1} --clean-logsc) 编辑完成后,按键盘 Esc 键后输入 :wq 按回车键保存退出 d) 设置文件操作权限,执行指令: chmod 777 hotcopy.shB. Windows 系统 a) 新建 TXT 文档 b) 编辑文档内容 echo offrem SVN 安装路径 set svn="C:\Program Files (x86)\VisualSVN Server\bin"rem 仓库根目录 set home=E:\SVNrem 备份根目录 set back=D:\backuprem 仓库 set store=Reportrem 备份根目录是否存在 if exist %back% goto check1md %back%:check1rem 若备份仓库目录存在,删除备份仓库目录,否则备份无法正常执行 if not exist %back%%store% goto check2 rd /s/q %back%%store%:check2rem 进入 SVN 安装路径 cd %svn%rem 执行备份 svnadmin hotcopy %home%%store% %back%%store% --clean-logs
c) 保存文件为 hotcopy.bat。注意:记得在“保存类型”中“所有文件(.)”,否则最终输出文件会变成 hotcopy.bat.txt1.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 -n4 月 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 svnserveb) 启动 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 "backupfi# 备份仓库名 store1=r1# 时间字符串变量 d=home/backup/${store1}{d}.dumpc) 增量备份编辑内容:#!/bin/sh# 仓库根目录home=/svn/store# 备份根目录backup=/back# 备份根目录不存在则创建if [ ! -d "backup" ];thenmkdir -p backupfi# 备份仓库名store1=project# 备份根仓库目录不存在则创建if [ ! -d "backup/backup/store1fi# 获取仓库当前最新版本svnlook youngest home/backup/tmp(cat backup/tmp_{store1}.TMP)# 上次备份版本信息文件不存在最低版本为 1,存在读取 if [ ! -f "backup/last_{store1}.txt" ];thenlower=1elsenum_lower=backup/last_${store1}.txt)lower=expr $num_lower + 1
fi# 上次备份版本小于等于最高版本时,执行备份操作,并重写上次备份版本信息文件 if [ upper ]; thensvnadmin dump store1 --revision upper --incremental > {store1}upper.dumpecho backup/last{store1}.txtfi# 删除临时版本文件rm -rf tmp_{store1}.TMP
d) 编辑完成后,按键盘 Esc 键后输入:wq 按回车键保存退出 e) 设置文件操作权限指令:chmod 777 dump.shB. Windows 系统 a) 新建 TXT 文档编辑内容 b)、c)二选一即可。全量备份脚本选择 b)、增量备份脚本选择 c)b) 全量备份编辑内容 echo offrem SVN 安装路径 set svn="C:\Program Files (x86)\VisualSVN Server\bin"rem 仓库根目录 set home=E:\SVNrem 备份根目录 set back=D:\backuprem 仓库 set store=Reportrem 备份根目录是否存在 if exist %back% goto check1md %back%:check1rem 若备份仓库目录不存在,则创建仓库 if exist %back%%store% goto check2md %back%%store%:check2rem 时间字符串变量 set d=% date:~0,4%%date:~5,2%%date:~8,2%rem 进入 SVN 安装路径 cd %svn%rem 执行备份 svnadmin dump %home%/%store% > %backup%/%store%_%d%.dumpc) 增量备份编辑内容 echo offrem SVN 安装路径 set svn="C:\Program Files (x86)\VisualSVN Server\bin"rem 仓库根目录 set home=E:\SVNrem 备份根目录 set back=D:\backuprem 仓库 set store=Reportrem 备份根目录是否存在 if exist %back% goto check1md %back%:check1rem 备份仓库目录是否存在 if exist %back%%store% goto check2md %back%%store%:check2rem 进入 SVN 安装路径 cd %svn%rem 获取指定仓库当前最新版本 svnlook youngest %home%%store% > %back%%store%\TMP.TXTset /p upper=<%back%%store%\TMP.TXTrem 设置最低版本为 0set lower=0rem 是否存在上次备份版本信息,存在则读取数据更换最低版本值 if not exist %back%%store%\last.txt goto check3set /p lower=<%back%%store%\last.txt :check3rem 最低版本加 1set /a lower=lower+1rem 如果最低版本大于最高版本,不备份 if %lower% gtr %upper% goto endrem 执行备份指令 svnadmin dump %home%%store% --revision %lower%:%upper% --incremental > %back%%store%%lower%-%upper%.dumprem 更新上次备份版本信息 echo %upper% > %back%%store%\last.txt :endrem 删除临时版本文件 del %back%%store%\TMP.TXT
d) 保存文件为 dump.bat。注意:记得在“保存类型”中“所有文件(.)”,否则最终输出文件会变成 dump.bat.txt2.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 的初始配置相对要复杂很多,但是也就最开始的部署配置麻烦些,后面就很香了。最直接的就是省掉了备份还原的动作,不同于 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/shEPOS="2"USER="4"ACTION="ACTION" = "M" -a "USER" = "admin" ]; then exit 0; fiecho "Changing revision properties other than svn:log is prohibited" >&2exit 1
b) 编辑完后, 按键盘 Esc 键后输入 :wq,回车 保存退出 c) 执行指令,修改权限。chmod 777 pre-reprop-changeWindows 系统在钩子脚本文件路径(hooks)下新建一个 TXT 文档,编辑如下内容后,保存为 pre-revprop-change.bat 文件。编辑内容如下:setlocalset REPOS=%1set REV=%2set USER=%3set PROPNAME=%4set ACTION=%5if "%USER%"=="admin" goto OKif not "%ACTION%"=="M" goto refuseif not "%PROPNAME%"=="svn:log" goto refusegoto OK:refuseecho Cann't set %PROPNAME%/%ACTION%, only svn:log is allowed 1>&2endlocalexit 1:OKendlocalexit 03.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 admind) 保存编辑内容
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-change3.3.3 连接异常 A. 异常提示无法连接主机“192.168.162.111”: 没有到主机的路 B. 原因分析无法连接主机,有可能 IP 地址错误、网络异常等。若这几个方面都排出后,最大可能就是防火墙拦截。C. 解决方法 — Linux 系统执行如下指令即可:firewall-cmd --zone=public --add-port=3690/tcp --permanentfirewall-cmd –reloadD. 解决方法 — 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 attemptsB. 解决方法出现该异常主要是因为上一次同步过程中,因为某些原因而异常终止,导致下一次同步时无法正常同步。执行以下指令,清除锁即可。svn propdel svn:sync-lock –revprop –r0 svn://192.168.162.111/project 注意: svn://192.168.162.111/project 为备份服务器
版权声明: 本文为 InfoQ 作者【剑雪封喉】的原创文章。
原文链接:【http://xie.infoq.cn/article/9a422b7ab303cda8812d620b8】。文章转载请联系作者。
评论