【1.业务需求】
作为开发人员,最大的噩梦莫过于自己辛辛苦苦开发的程序由于各种原因而丢失了。所以定期备份资料乃是开发人员的一大美德(我自己重要的资料备份了4份,分别放在不同的地方)。SVN作为代码和文档汇聚之地,定期备份的重要性更是不容置疑。
【2.基本思路】
通常我们备份的方式无非有:完全备份和增量备份两种。完全备份适用于版本库的大小比较小的情况,对于版本库比较大或者已经存在版本库的情况下,则没有必要也不可能使用完全备份了。这时增量备份就是一个很好的选择。
除了完全备份和增量备份,我们还有另外一种方式:版本库同步。这种方法可以在源版本库和目标版本库之间做同步(通常是单向的)。一旦源版本库发生了改变则可以马上通知目标版本库做出相同的改变。
注意:版本库的备份不能简单地使用copy-paste的方法来拷贝复杂版本库的db目录,否则有可能出现数据不完全的情况。
所以我们的备份策略是:
①首次备份采用完全备份,后续备份采用增量备份和版本库同步
②完全备份在晚上定时进行,增量备份和版本库同步在用户提交时进行
注意:这个策略实际上是有较大问题的(包括备份的方式,频度,时间):通常完全备份会在每周,月进行一次。而增量备份会,版本库同步会在每天晚上定时执行,而不是在每次用户提交后执行,以缩短请求响应。但这里因为本着简单的原则,只是抽取了最简单的策略
【3.相关命令】
SVN用于备份的命令有以下三个,分别对应于完全备份,增量备份,版本库同步。
①svnadmin hotcopy
②svnadmin dump [--incremental]
③svnsync init|sync
关于这三个命令的具体用法,请大家自行参考SVN的用户手册以获得更多资讯。
【4.示例操作】
注:本示例代码均为网上下载,非本人原创。
Example 1:完全备份
fullbackup.bat
@echo off
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
@echo 不同的系统平台和时间格式设置会影响目录的创建,请先用echo命令输出日期格式并做相应调整
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
rem
Subversion的安装目录
set
SVN_HOME
=
C:
/
Develop
/
Subversion
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
rem
所有版本库的父目录
set
SVN_ROOT
=
C:
/
Develop
/
svntest
/
testRepos
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
rem
备份的根目录
set
BACKUP_SVN_ROOT
=
C:
/
Develop
/
svntest
/
svnbackup
/
full
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
rem
每次备份的子目录
set
BACKUP_DIRECTORY
=
%BACKUP_SVN_ROOT%
/
%
date
:~
4
,
14
%
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
rem
如果备份的子目录不存在则先创建
if
exist %BACKUP_DIRECTORY%
goto
checkBack
echo 建立备份目录%BACKUP_DIRECTORY%
>>
%BACKUP_SVN_ROOT%
/
backup.log
mkdir %BACKUP_DIRECTORY%
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
rem
验证目录是否为版本库,如果是则取出名称备份
for
/
r %SVN_ROOT% %%I in (.)
do
@
if
exist
"
%%I/conf/svnserve.conf
"
%SVN_ROOT%
/
dofullBackup.bat
"
%%~fI
"
%%~nI
goto
end
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
:checkBack
echo 备份目录%BACKUP_DIRECTORY%已经存在,请清空。
goto
end
:
end
dofullbackup.bat
@echo 正在备份版本库%
1
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
@%SVN_HOME%
/
bin
/
svnadmin hotcopy %
1
%BACKUP_DIRECTORY%
/
%
2
@echo 版本库%1成功备份到了%
2
!
将这两个文件放在repository的同级目录下,执行之则可以。读者可以自行修改上面的环境变量设置
Example 2:增量备份
post-commit.bat
echo off
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
set
SVN_HOME
=
C:
/
Develop
/
Subversion
set
SVN_ROOT
=
C:
/
Develop
/
svntest
/
testRepos
set
UNIX_SVN_ROOT
=
C:
/
Develop
/
svntest
/
testRepos
set
DELTA_BACKUP_SVN_ROOT
=
C:
/
Develop
/
svntest
/
svnbackup
/
delta
set
LOG_FILE
=
%DELTA_BACKUP_SVN_ROOT%
/
backup.log
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
@echo 不同的系统平台和时间格式设置会影响目录的创建,请先用echo命令输出日期格式并做相应调整
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
rem
版本库增量导出
for
/
r %SVN_ROOT% %%I in (.)
do
if
%UNIX_SVN_ROOT%
/
%%~nI
==
%
1
echo 备份开始 版本路径:%SVN_ROOT%
/
%%~nI 版本号:%
2
>>
%LOG_FILE% | %SVN_ROOT%
/
%%~nI
/
hooks
/
deltaBackup.bat %%~nI %
2
goto
end
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
:
end
deltaBackup.bat
@echo 正在备份版本库%
2
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
@%SVN_HOME%
/
bin
/
svnadmin dump %SVN_ROOT%
/
%
1
--
incremental
--
revision %
2
>>
%DELTA_BACKUP_SVN_ROOT%
/
%
1
-
%
date
:~
4
,
14
%.dump
@echo 版本库%2成功备份到了%
3
!
将以上两个文件放置在repository的hooks目录下即可。
Example 3:版本库同步
首先创建一个版本库用于同步(目标版本库),其次要在源版本库和目标版本库之间建立联系。这是通过svnsync init来达到的。
svnsync init 目标库URL 源库URL
这个命令执行过程中可能需要增加两个参数--username和--password用于指明目标版本库的用户名和密码。
其次在目标版本库的hooks目录下建立一个空的文件并命名为pre-revprop-change.bat。这一步很重要,否则会出现鉴权失败的错误。最后就是在源版本库的hooks目录下建立一个名为post-commit.bat的文件,如下所示:
echo off
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
rem
版本库同步
%SVN_HOME%
/
bin
/
svnsync sync
--
non
-
interactive svn:
//
localhost
/
newRepo_backup
但用户在源版本库执行了相应的修改动作之后,你会发现目标版本库也出现了同样的修改!
作为开发人员,最大的噩梦莫过于自己辛辛苦苦开发的程序由于各种原因而丢失了。所以定期备份资料乃是开发人员的一大美德(我自己重要的资料备份了4份,分别放在不同的地方)。SVN作为代码和文档汇聚之地,定期备份的重要性更是不容置疑。
【2.基本思路】
通常我们备份的方式无非有:完全备份和增量备份两种。完全备份适用于版本库的大小比较小的情况,对于版本库比较大或者已经存在版本库的情况下,则没有必要也不可能使用完全备份了。这时增量备份就是一个很好的选择。
除了完全备份和增量备份,我们还有另外一种方式:版本库同步。这种方法可以在源版本库和目标版本库之间做同步(通常是单向的)。一旦源版本库发生了改变则可以马上通知目标版本库做出相同的改变。
注意:版本库的备份不能简单地使用copy-paste的方法来拷贝复杂版本库的db目录,否则有可能出现数据不完全的情况。
所以我们的备份策略是:
①首次备份采用完全备份,后续备份采用增量备份和版本库同步
②完全备份在晚上定时进行,增量备份和版本库同步在用户提交时进行
注意:这个策略实际上是有较大问题的(包括备份的方式,频度,时间):通常完全备份会在每周,月进行一次。而增量备份会,版本库同步会在每天晚上定时执行,而不是在每次用户提交后执行,以缩短请求响应。但这里因为本着简单的原则,只是抽取了最简单的策略
【3.相关命令】
SVN用于备份的命令有以下三个,分别对应于完全备份,增量备份,版本库同步。
①svnadmin hotcopy
②svnadmin dump [--incremental]
③svnsync init|sync
关于这三个命令的具体用法,请大家自行参考SVN的用户手册以获得更多资讯。
【4.示例操作】
注:本示例代码均为网上下载,非本人原创。
Example 1:完全备份
fullbackup.bat
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
dofullbackup.bat
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
将这两个文件放在repository的同级目录下,执行之则可以。读者可以自行修改上面的环境变量设置
Example 2:增量备份
post-commit.bat
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
deltaBackup.bat
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
将以上两个文件放置在repository的hooks目录下即可。
Example 3:版本库同步
首先创建一个版本库用于同步(目标版本库),其次要在源版本库和目标版本库之间建立联系。这是通过svnsync init来达到的。
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
这个命令执行过程中可能需要增加两个参数--username和--password用于指明目标版本库的用户名和密码。
其次在目标版本库的hooks目录下建立一个空的文件并命名为pre-revprop-change.bat。这一步很重要,否则会出现鉴权失败的错误。最后就是在源版本库的hooks目录下建立一个名为post-commit.bat的文件,如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
但用户在源版本库执行了相应的修改动作之后,你会发现目标版本库也出现了同样的修改!