SVN服务器备份_svn服务器迁移

SVN服务器备份_svn服务器迁移SVN数据备份、还原、适用情况、部分异常处理等介绍。介绍三种主要备份方式:hotcopy、dump以及svnsync。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用


前言

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.4.1 未创建钩子脚本

A. 异常提示

svnsync: E165006: 此版本库不允许修改版本属性;请管理员创建 pre-revprop-change 钩子

B. 解决方法

造成该异常原因就是未创建钩子脚本,具体方法草考 3.2.2 创建钩子脚本即可

3.4.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 为备份服务器


4 参考资料

https://blog.csdn.net/u011078141/article/details/94718649
https://blog.imdst.com/svn-bei-fen-he-huan-yuan/
https://jingyan.baidu.com/article/fd8044fa7fc3245030137a49.html
https://www.cnblogs.com/hengli123/p/13700923.html
https://wenku.baidu.com/view/89f648fc6c1aff00bed5b9f3f90f76c660374c5a.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/186647.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Python小白的数学建模课-04.整数规划「建议收藏」

    Python小白的数学建模课-04.整数规划「建议收藏」整数规划与线性规划的差别只是变量的整数约束。问题区别一点点,难度相差千万里。选择简单通用的编程方案,让求解器去处理吧。『Python小白的数学建模课@Youcans』带你从数模小白成为国赛达人。1.从线性规划到整数规划1.1为什么会有整数规划?线性规划问题的最优解可能是分数或小数。整数规划是指变量的取值只能是整数的规划。这在实际问题中很常见,例如车间人数、设备台数、行驶次数,这些变量显然必须取整数解。整数规划并不一定是线性规划问题的变量取整限制,对于二次规划、非线性规划问题也有.

  • C# CultureInfo中常用的InvariantCulture

    C# CultureInfo中常用的InvariantCulture本文参考自CultureInfo中重要的InvariantCulture,纯属读书笔记,加深记忆1、CultureInfo的InvariantCulture的作用(1)、CultureInfo使整个.NETFramework更加人性化,因为这可以使同一个数据适应不同地区和文化,这样当然满足处于不同地区和文化的用户。但前提是数据给“人”看,如果这些数据用于计算机之间的传输,即给“…

  • AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用「建议收藏」

    一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的。因此就要对需要传输的数据进行在客户端进行加密,然后在服务器进行解密! 加密和解密的算法有很多,主流有对称加密和非对称加密!两者的区别就不在这里做介绍,有不懂的朋友可以去查Google。 (精读阅读本篇可能花费您10…

  • java mediatype属性_Java MediaType.MULTIPART_FORM_DATA属性代码示例[通俗易懂]

    java mediatype属性_Java MediaType.MULTIPART_FORM_DATA属性代码示例[通俗易懂]/***Triestodeterminethecontent/mediatypeofthisHTTPrequestifftheHTTP”Content-Type”*headerwasnotexplicitlysetbytheuser,otherwisetheuserprovidedvalueisused.Ifthe*”Content-…

  • Python批量修改文件名,文件再多也只要一秒,省时又不闹心

    Python批量修改文件名,文件再多也只要一秒,省时又不闹心前言嗨喽!大家好,这里是魔王对于电脑中的文件夹啊,我们那是新建一个又一个啊,有时候,我们整理资料的时候就会发现,文件夹那是一个杂乱无章,一个一个的去修改太浪费时间,咋今天就来分享一个小技巧:批量修改文件名一、在原有的名字前中后批量加字随意一点,这是我刚刚新建的文件夹和我存放的路径。我们来看看代码,我都详细注释了。importos#导入模块filename=’C:\\Users\\Administrator\\Desktop\\123’#文件地址list_path=os.l

    2022年10月28日
  • 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解[通俗易懂]

    详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解[通俗易懂]声明:本文为原创文章,发表于nebulaf91的csdn博客。欢迎转载,但请务必保留本信息,注明文章出处。本文作者:nebulaf91本文原始地址:最大似然估计(Maximumlikelihoodestimation,简称MLE)和最大后验概率估计(Maximumaposterioriestimation,简称MAP)是很常用的两种参数估计方法,如果不理解这两种方法的思路,很

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号