今天备份svn, 能保证好用就行先, 回头再研究服务器
buerguo.batsvn
@echo off
:: 关闭回显 :: 说明:若有命令不明白,请使用帮助命令:命令/? 。如:for/? :: 设置标题
title SVN备份脚本 rem 设置变量 :: SVN_HOME svn程序的安装路径,指定到bin目录上一级。(若是路径有空格,请用""。)
set SVN_HOME=D:\Develop\VisualSVNServer :: SVN库的路径
set SVN_ROOT=D:\Repositories :: 备份SVN父目录的路径
set SVN_BACKUP_ROOT=D:\svnrootbackup :: 获取当前系统日期和时间用来建立目录,格式:年月日_时分秒毫秒。如:20131129_16275274
set TIME_DIR=%date:~,4%%date:~5,2%%date:~8,2%_%time:~,2%%time:~3,2%%time:~6,2%%time:~9,2% :: SVN备份子目录的路径
set BACKUP_DIRECTORY=%SVN_BACKUP_ROOT%\%TIME_DIR% :: 日志文件路径(将日志和备份文件放在一个目录,删除时一块儿删除了)
set LOG=%BACKUP_DIRECTORY%\backup.log :: 指定备份文件删除时间(单位:天)。0 - 32768 范围内的任何数字。
set NUM=365
rem 开始备份SVN :: 判断SVN程序是否存在
if not exist %SVN_HOME% goto error goto start
:start
:: 查询日志大小(单位:字节),超过1Mb就新建一个 (日志放入备份目录后,此语句无效。仅备份!) :: for /r %SVN_BACKUP_ROOT% %%I in (backup.log) do if %%~zI GEQ 1048576 ren %LOG% backup_%TIME%.log :: 新建目录
mkdir %BACKUP_DIRECTORY% :: 创建日志
@echo [info]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%创建备份目录:%BACKUP_DIRECTORY% >>%LOG% :: 备份SVN版本库并输出日志到文件
for /d %%i in (%SVN_ROOT%\*) do (
@echo 备份 %%~ni 库,备份文件名:%%~ni.dmp >>%LOG% :: 完整备份(增量备份在dump后面添加参数 --incremental)
%SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%%~ni >%BACKUP_DIRECTORY%\%%~ni.dmp 2>>%LOG% )
:: 输出备份命令退出码,用来判断是否备份成功。成功的退出码为0.
@echo [info]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%退出码为:%errorlevel%>>%LOG% :: 自动设置计划任务:每周六 晚上11点执行本脚本。
at 23:00 /next:S %~f0>>%LOG% :: 删除过时备份
goto delete :delete
:: 输出要删除的目录到日志文件
@echo [info]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%删除%NUM%天前的备份:>>%LOG% forfiles /P %SVN_BACKUP_ROOT% /M *_* /D -%NUM% /C "cmd /c echo 删除文件夹:@file">>%LOG% :: 使用rd命令删除超过%NUM%天的备份目录。若是不存在匹配条件的目录,将提示:错误: 用指定的搜索标准没有找到文件。若是存在匹配的文件,则提示:目录名无效
forfiles /P %SVN_BACKUP_ROOT% /M *_* /D -%NUM% /C "cmd /c rd /s/q @path" 2>>%LOG% goto end
:error
echo [error]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%程序目录不存在,请检查:%SVN_HOME%>>%LOG% goto end
:end
:: 输出一行空行分割日志
@echo. >>%LOG% exit
:: 调试脚本用的命令 :: at 16:06 %~f0 :: PAUSE :: exit
修改三个路径便可spa
:: SVN_HOME svn程序的安装路径,指定到bin目录上一级。(若是路径有空格,请用""。)
set SVN_HOME=D:\Develop\VisualSVNServer
:: SVN库的路径
set SVN_ROOT=D:\Repositories
:: 备份SVN父目录的路径
set SVN_BACKUP_ROOT=D:\svnrootbackup
=========================================================================
建立好该批处理文件放到了repository下(和路径不要紧吧), 双击执行在指定目录下生成一个备份文件以下图:
如何还原:
1.启动svnServer客户端, 新建一个repository(注意不要建立branches tags 和 trunk文件夹) , 就命名为demp吧
在磁盘中能够找到该名为demp的repository
2.打开命令行窗口, 输入如下命令:.net
svnadmin load D:\Repositories\demp < D:\svnrootbackup\20180627_12565811\buerguo.dmp
这就完事儿了,有问题在讨论吧批处理文件无非就是把手动敲的简化了一些,还有就是能够把这个文件加入到计算机定时任务中进行执行方便自动备份仓库。 命令行
==========分割(详细步骤能够看看,小项目小团队用svn,大项目团队稍微大点svn貌似显得鸡肋了。。)============调试
补充:可参考另外一篇备份还原的实践,比较细致,https://blog.csdn.net/hzfw2008/article/details/78082685。日志
【1.业务需求】code
通过前面的SVN搭建,权限配置和强制写日志的工做以后,今天的任务是把原来其它分散的各个版本库统一迁移到新的版本库,集中统一管理。要求不改变原有的版本库的内容和版本号。
【2.基本思路】blog
要实现版本库的无缝迁移,必须经过如下3个步骤:
事务
首 先来看第一步:导出旧的版本库。咱们知道SVN提供了check out命令和export命令签出,导出版本库中的内容。对于版本库内容比较少的状况这种方法能够采用。可是若是版本库中内容比较多,那么这种方法就显得 很笨重了,并且还涉及到版本号改变的问题。因此首先摈弃这种作法。
咱们知道Oracle提供了export/import命令来将数据 库导出成一个二进制文件,而后导入。一样的SVN也提供了一对命令:dump和 load。不一样的是这两个命令导出的是文本内容(肉眼能够读懂)。并且还有一次性导出和增量导出,单版本导出与多版本导出等多种选择操做,就是这个了。
其次咱们来看“通知客户端切换版本库分支”。在咱们完成服务器端的版本迁移以后,必须通知客户端运行切换分支的命令,不然客户端的提交仍是提交到旧的版本库去。SVN也为咱们准备了这样的命令:svn switch。
【3.相关命令】
首先咱们来看一下SVN的dump和load命令
svnadmin dump命令用于导出整个Repository或Repository下的某个范围的修订版本。REPOS_PATH是版本库的路径,[-r LOWER[:UPPER]]用于指定导出的修订版本范围,由参数-r和两个用:号隔开阿拉伯数字组成。例如:-r 0:50表示导出才版本0到版本50之间的全部修订版,-r是revision的缩写。
而另外一个关键参数是--incremental。 它使用增量方式来导出版本,即每次都只导出自上一个版本以来的修改。这样的好处是第一:能够把一个大的文 件切分红若干个小的文件。第二:在版本库已经存在的状况下,咱们只须要每次导出修改的部分,不须要每次都导出整个版本库的内容。甚至能够经过hook脚本 天天晚上自动将当天的修改dump出来作备份用。
svnadmin load命令用于从标准输入流/其它流中导入版本库,REPOS_PATH是要导入的目标版本库。
默认状况下dump和load命令分别输出到默认输出设备(屏幕)和从默认输入设备(键盘)导入。但咱们也能够把输出流/输入流重定向。例如上面 的第一个 命令,使用重定向符>把屏幕的输出定向当前目录下的dumpfile,而第二个命令从当前目录下的dumpfile文件导入。
上面的命令使用起来已经很方便了,那么还有没有更加方便的用法呢?固然有!就是使用管道命令把两个命令合二为一。
svn switch命令用于更新工做副本的URL。意即指向新的版本库位置。首先要注意的一点是咱们便可以将整个工做副本指向新的URL,也可将工做副本下的某个目录指向新的URL。
另一个重要的参数就是--relocate。这个参数是否使用对于结果如何有很大影响,使用不当甚至可能会形成版本库不可用。其中有两条重要的规则:
A.假如工做副本只是映射到同一个版本库内的不一样位置,那么使用svn switch便可
B.假如工做副本已经是映射到不一样的版本库,那么必须使用svn switch --relocate
上面第二条规则一般发生在咱们须要将整个版本库迁移到另一台机,或者同一台机的不一样版本库时。这个时候使用--relocate会刷新原有工做副本中每一个文件的URL头部。
【4.示例操做】
好了,下面咱们来看如何执行版本库的迁移工做。
导出第一个文件,版本号从0到50的修订版本
导出第二个文件,版本号从51到100的修订版本
请注意咱们上面三个命令中第2,3个命令多了一个--incremental的参数,这就是采用了增量的方式导出,下面咱们一次按照顺序导入
首先导入dumpfile1,而后是dumpfile2,dumpfile3
导入文件dumpfile2。依次类推dumpfile3。
若是咱们前面不使用--incremental方式导出,此处分批导入三个dump文件,则会提示错误:版本库文件已经存在。
首先咱们把SVN服务的根目录指向c:\peng\other目录,在这个目录下有两个repository,其中一个名为newRepo,另一个名为呢wRepo2。
首先咱们从newRepo这个版本库中check out出一个子目录ps
如今该工做副本已经和:svn://localhost/newRepo/ps发生了映射关系。咱们可使用svnlook info来显示这个工做副本的通常信息
输出信息中明确地指出ps目录指向了svn://localhost/newRepo/ps。下面咱们来把它指向另外一个repository下的同名位置:svn://localhost/newRepo2/ps。
通过上面的切换后,再次使用svnlook info输出通常信息,发现URL已经被成功切换过来了
咱们尝试着在ps目录下修改文件ps.txt为ps.doc,而后提交看看会提交到那个repos去?
很明显如今的提交所有都去到新的位置了!切换成功。