【一.引言】
看了很多的关于svn版本库迁移的博客,写的都挺好的。但在自己实践的过程中还是没有那一篇能让我不查别的东西的。也就是说网上什么都有但是自己用的时候还需要查好多的东西。算是做笔记吧。方便我也方便其他将要使用svn版本迁移的人,我对这里涉及到的一些知识点再做一点总结。
首先是说一下svn中常用的一些命令。当然下面的命令都可以在命令窗口敲上svn help或svnadminhelp看到,这里只不过是一些对这些命令的一些解释。
如题说的主要是svn版本库迁移,当然也主要的介绍关于迁移所用的一些命令。
【二.基本思路】
要实现版本库的无缝迁移,必须通过以下3个步骤:
①导出旧的版本库
②导入新的版本库
③通知客户端切换版本库分支
首先来看第一步:导出旧的版本库。我们知道SVN提供了checkout命令和export命令签出,导出版本库中的内容。对于版本库内容比较少的情况这种方法可以采用。但是如果版本库中内容比较多,那么这种方法就显得很笨重了,而且还涉及到版本号改变的问题。所以首先摈弃这种做法。
我们知道Oracle提供了export/import命令来将数据库导出成一个二进制文件,然后导入。同样的SVN也提供了一对命令:dump和load。不同的是这两个命令导出的是文本内容(肉眼可以读懂)。而且还有一次性导出和增量导出,单版本导出与多版本导出等多种选择操作,就是这个了。
其次我们来看“通知客户端切换版本库分支”。在我们完成服务器端的版本迁移之后,必须通知客户端运行切换分支的命令,否则客户端的提交还是提交到旧的版本库去。SVN也为我们准备了这样的命令:svnswitch。
【三.相关命令】
1.dump命令:
首先需要备份数据库当然是需要把svn中所有的版本信息导出来。也就是备份版本库,这时我们需要的命令是dump命令:
说明:
svnadmin dump — 将文件系统的内容转储到标准输出。
通俗语法:
svnadmin dump 版本库文件及目录 > 备份文件及目录
如在命令窗口输入:
svnadmindumpF:\Repositories\Library > E:\Library.svn_dump
这样就会到处你的library项目的版本库备份文件到E盘的library.svn_dump文件中。其中svnadmindump不会保留修改文件的所有内容,而只是记录修改的部分。这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。
官方的说法及参数:
svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental]
svnadmindump命令用于导出整个Repository或Repository下的某个范围的修订版本。REPOS_PATH是版本库的路径,[-rLOWER[:UPPER]]用于指定导出的修订版本范围,由参数-r和两个用:号隔开阿拉伯数字组成。例如:-r0:50表示导出才版本0到版本50之间的所有修订版,-r是revision的缩写。
而另一个关键参数是--incremental。它使用增量方式来导出版本,即每次都只导出自上一个版本以来的修改。这样的好处是第一:可以把一个大的文件切分成若干个小的文件。第二:在版本库已经存在的情况下,我们只需要每次导出修改的部分,不需要每次都导出整个版本库的内容。甚至可以通过hook脚本每天晚上自动将当天的修改dump出来做备份用。
实例:
导出Library版本库的0-50个版本(当然你也可以导出剩下的版本)
当然如果导出剩下的版本导出命令多了一个--incremental的参数,这就是采用了增量的方式导出,导入时只需要按顺序导入即可。
2.load命令:
导出版本库文件以后我们当然要把导出的文件再次导入才能说是完成备份。
说明:
svnadmin load — 从标准输出读取
通俗语法:
svnadmin load 新的版本库名称及目录< 备份文件及目录
如在命令窗口输入:
svnadmin load F:\Repositories\Library2 --parent-dir 项目1 < E:\Library.svn_dump
这样就会把已近备份到E盘的library.svn_dump文件重新导入到Library2版本库下的项目1文件夹。如果想直接导入到Library2中则没有中间的"--parent-dir 项目1"版本库下的目录都必须写在dir参数后。
实例:
导入Library版本库的0-50个版本(当然你也可以导入剩下的版本)
注意:
当然如果导出Library剩下的版本导出命令多了一个--incremental的参数,这就是采用了增量的方式导出,导入时只需要按顺序导入即可。
3.svnlook youngest命令和svninfo命令
导出版本库时如果是导出指定版本的版本库,那么首先是必须要知道库中一共有多少个版本的。
当我们需要进行版本迁移的时候我们必须要知道当前文件的条目信息,
说明:
svnlook youngest — 显示最年轻的修订版本号。
svninfo — 显示本地或远程条目的信息。
实例:
显示Library版本库最年轻的修订版本号(注意:首先要到库目录下)
显示check out下来的文件的远程条目信息(注意:首先要到文件的存放目录下,本文件放在E:\Library文件下。)
4.svnswitch命令语法
svnswitch命令用于更新工作副本的URL。意即指向新的版本库位置。首先要注意的一点是我们即可以将整个工作副本指向新的URL,也可将工作副本下的某个目录指向新的URL。
说明:
svn switch — 将工作转向一个其他的库地址同步
通俗语法:
svn switch --relocate旧版本库地址新版本库地址(中间有空格)
官方的说法及参数:
svn switch URL [PATH]
switch --relocate FROM TO [PATH]
svnswitch命令用于更新工作副本的URL。意即指向新的版本库位置。首先要注意的一点是我们即可以将整个工作副本指向新的URL,也可将工作副本下的某个目录指向新的URL。
另外一个重要的参数就是--relocate。这个参数是否使用对于结果如何有很大影响,使用不当甚至可能会造成版本库不可用。其中有两条重要的规则:
A.假如工作副本只是映射到同一个版本库内的不同位置,那么使用svn switch即可
B.假如工作副本已是映射到不同的版本库,那么必须使用svn switch --relocate
上面第二条规则通常发生在我们需要将整个版本库迁移到另外一台机,或者同一台机的不同版本库时。这个时候使用--relocate会刷新原有工作副本中每个文件的URL头部。
实例:
迁移前后查看工作文件的远程条目信息是不同的。
【四.扩展】
当然命令窗口操作svn的命令不止有折几个,以上列出的只是版本迁移中用到的几个基本命令,有兴趣的朋友还可以查一下相关的资料。
【五.总结】
这篇博客的技术含量其实不高,但是对于从繁杂的知识中选出自己能用的知识来说,是一种锻炼,把用过的知识总结起来,慢慢才会成为自己拿来就用的东西。