SVN版本库的迁移

【版本控制之类】SVN版本库的迁移

 【1.业务需求】
经过前面的SVN搭建,权限配置和强制写日志的工作之后,今天的任务是把原来其它分散的各个版本库统一迁移到新的版本库,集中统一管理。要求不改变原有的版本库的内容和版本号。

【2.基本思路】


要实现版本库的无缝迁移,必须通过以下3个步骤:

①导出旧的版本库

②导入新的版本库

③通知客户端切换版本库分支

首先来看第一步:导出旧的版本库。我们知道SVN提供了checkout命令和export命令签出,导出版本库中的内容。对于版本库内容比较少的情况这种方法可以采用。但是如果版本库中内容比较多,那么这种方法就显得很笨重了,而且还涉及到版本号改变的问题。所以首先摈弃这种做法。

我们知道Oracle提供了export/import命令来将数据库导出成一个二进制文件,然后导入。同样的SVN也提供了一对命令:dump和load。不同的是这两个命令导出的是文本内容(肉眼可以读懂)。而且还有一次性导出和增量导出,单版本导出与多版本导出等多种选择操作,就是这个了。

其次我们来看“通知客户端切换版本库分支”。在我们完成服务器端的版本迁移之后,必须通知客户端运行切换分支的命令,否则客户端的提交还是提交到旧的版本库去。SVN也为我们准备了这样的命令:svnswitch。

【3.相关命令】


首先我们来看一下SVN的dump和load命令

①svnadmindump命令语法

SVN版本库的迁移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出来做备份用。

②svnadmin load命令语法
SVN版本库的迁移svnadmin load REPOS_PATH

svnadminload命令用于从标准输入流/其它流中导入版本库,REPOS_PATH是要导入的目标版本库。

③dump和load的输出/入重定向
SVN版本库的迁移svnadmin dump myrepos > dumpfile

svnadminloadnewrepos<dumpfile

默认情况下dump和load命令分别输出到默认输出设备(屏幕)和从默认输入设备(键盘)导入。但我们也可以把输出流/输入流重定向。例如上面的第一个命令,使用重定向符>把屏幕的输出定向当前目录下的dumpfile,而第二个命令从当前目录下的dumpfile文件导入。

上面的命令使用起来已经很方便了,那么还有没有更加方便的用法呢?当然有!就是使用管道命令把两个命令合二为一。
SVN版本库的迁移svnadmin dump myrepos | svnadmin load newrepos
④svn switch命令语法
SVN版本库的迁移svn switch URL [PATH]

switch--relocateFROMTO[PATH]

svnswitch命令用于更新工作副本的URL。意即指向新的版本库位置。首先要注意的一点是我们即可以将整个工作副本指向新的URL,也可将工作副本下的某个目录指向新的URL。

另外一个重要的参数就是--relocate。这个参数是否使用对于结果如何有很大影响,使用不当甚至可能会造成版本库不可用。其中有两条重要的规则:

A.假如工作副本只是映射到同一个版本库内的不同位置,那么使用svnswitch即可

B.假如工作副本已是映射到不同的版本库,那么必须使用svnswitch--relocate

上面第二条规则通常发生在我们需要将整个版本库迁移到另外一台机,或者同一台机的不同版本库时。这个时候使用--relocate会刷新原有工作副本中每个文件的URL头部。

【4.示例操作】


好了,下面我们来看如何执行版本库的迁移工作。①查看当前旧版本库最新的版本号是多少
SVN版本库的迁移C:\peng\Other>svnlook youngest newRepo

161

②分批增量导出版本库内容
SVN版本库的迁移C:\peng\Other>svnadmin dump newRepo -r 0:50 > dumpfile1

*Dumpedrevision0.

*Dumpedrevision1.

*Dumpedrevision2.

*Dumpedrevision3.

导出第一个文件,版本号从0到50的修订版本
SVN版本库的迁移C:\peng\Other>svnadmin dump newRepo -r 51:100 --incremental > dumpfile2

*Dumpedrevision51.

*Dumpedrevision52.

*Dumpedrevision53.

*Dumpedrevision54.

*Dumpedrevision55.

导出第二个文件,版本号从51到100的修订版本
SVN版本库的迁移C:\peng\Other>svnadmin dump newRepo -r 101:161 --incremental > dumpfile3

*Dumpedrevision101.

*Dumpedrevision102.

*Dumpedrevision103.

*Dumpedrevision104.

*Dumpedrevision105.

SVN版本库的迁移SVN版本库的迁移SVN版本库的迁移

请注意我们上面三个命令中第2,3个命令多了一个--incremental的参数,这就是采用了增量的方式导出,下面我们一次按照顺序导入

③分批导入版本库文件

SVN版本库的迁移C:\peng\Other>svnadmin load newRepo2 < dumpfile1

<<<开始新的事务,基于最初的修订版1

*正在添加路径:adone.

-------提交后的修订版1>>>

<<<开始新的事务,基于最初的修订版2

*正在删除路径:adone.

首先导入dumpfile1,然后是dumpfile2,dumpfile3
SVN版本库的迁移C:\peng\Other>svnadmin load newRepo2 < dumpfile2

<<<开始新的事务,基于最初的修订版50

*正在添加路径:branchesdone.

-------提交新修订版12(从原始修订版50装载)>>>

<<<开始新的事务,基于最初的修订版51

*正在删除路径:branchesdone.

-------提交新修订版13(从原始修订版51装载)>>>

导入文件dumpfile2。依次类推dumpfile3。

如果我们前面不使用--incremental方式导出,此处分批导入三个dump文件,则会提示错误:版本库文件已经存在。

④客户端切换工作副本URL

SVN版本库的迁移C:\peng\Other>svnserve -d -r c:\peng\other
首先我们把SVN服务的根目录指向c:\peng\other目录,在这个目录下有两个repository,其中一个名为newRepo,另外一个名为呢wRepo2。
SVN版本库的迁移C:\peng\Other>dir

VolumeindriveCisESOE_W2K

VolumeSerialNumberisBC1B-22E6

DirectoryofC:\peng\Other

2008-12-2615:10<DIR>.

2008-12-2615:10<DIR>..

2008-12-2310:04<DIR>Backup

2008-12-2614:2145,578dumpfile1

2008-12-2614:2239,567dumpfile2

2008-12-2614:2355,740dumpfile3

2008-12-1509:08<DIR>newRepo

2008-12-2614:20<DIR>newRepo2

2008-12-2615:25<DIR>ps

2008-12-2415:11<DIR>Toolbar

3File(s)140,885bytes

7Dir(s)2,668,414,976bytesfree

C:\peng\Other>

首先我们从newRepo这个版本库中check out出一个子目录ps
SVN版本库的迁移C:\Documents and Settings\qlinpen.E0015609D6309>svn checkout svn://localhost/newRepo/ps c:/peng/other/ps

AC:\peng\Other\ps\ps.txt

取出修订版170。

现在该工作副本已经和:svn://localhost/newRepo/ps发生了映射关系。我们可以使用svnlook info来显示这个工作副本的一般信息
SVN版本库的迁移C:\peng\Other>cd ps

C:\peng\Other\ps>svninfo

路径:.

地址(URL):svn://localhost/newRepo/ps

RepositoryRoot:svn://localhost/newRepo

档案库UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078

修订版:170

节点种类:目录

调度:正常

最后修改的作者:admin

最后修改的修订版:170

最后修改的时间:2008-12-2614:52:32+0800(星期五,26十二月2008)

输出信息中明确地指出ps目录指向了svn://localhost/newRepo/ps。下面我们来把它指向另一个repository下的同名位置:svn://localhost/newRepo2/ps。
SVN版本库的迁移C:\peng\Other\ps>svn switch --relocate svn://localhost/newRepo/ps svn://localhost/newRepo2/ps

C:\peng\Other\ps>

经过上面的切换后,再次使用svnlook info输出一般信息,发现URL已经被成功切换过来了
SVN版本库的迁移C:\peng\Other\ps>svn info

路径:.

地址(URL):svn://localhost/newRepo2/ps

RepositoryRoot:svn://localhost/newRepo2

档案库UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078

修订版:170

节点种类:目录

调度:正常

最后修改的作者:admin

最后修改的修订版:170

最后修改的时间:2008-12-2614:52:32+0800(星期五,26十二月2008)

我们尝试着在ps目录下修改文件ps.txt为ps.doc,然后提交看看会提交到那个repos去?
SVN版本库的迁移C:\peng\Other\ps>svn list svn://localhost/newRepo/ps

ps.txt

C:\peng\Other\ps>svnlistsvn://localhost/newRepo2/ps

ps.doc

C:\peng\Other\ps>

很明显现在的提交全部都去到新的位置了!切换成功。
转载地址:http://www.blogjava.net/baoyaer/articles/293079.html

相关推荐