文章转载来自:http://blog.sina.com.cn/s/blog_5eb1a2670100l24i.html ;http://lailife.blog.163.com/blog/static/1994901612011102271552283/
前段时间对项目SVN库做整理, 顺带再次研究了下SVN迁移的方式,借鉴网友作品,整理如下:
SVN数据库迁移方法一(SVN全库操作,或称SVN全局备份并恢复):
导出:
$svnadmin dump repos > dumpfile //将指定的版本库导出成文件dumpfile
新建:
$svnadmin create newrepos
导入:
$svnadmin load newrepos < dumpfile
需要重新设置权限
SVN数据库迁移方法二(增量备份或批次备份,批次恢复)
特定reversion导出:
$svnadmin dump repos –r 23 >rev-23.dumpfile
$svnadmin dump repos –r 100:200 >rev-100-200.dumpfile
批次导出:对比较大的库可以批次导出,便于备份
$svnadmin dump repos –r 0:1000 >0-1000.dumpfile
$svnadmin dump repos –r 1001:2000 --incremental >1001-2000.dumpfile
$svnadmin dump repos –r 2001:3000 --incremental >2001:3000.dumpfile
特别需要注意这个红色的,我找这个方法主要就是用这种方法,但是因为不仔细没有输入红色的,所以就失败了,对于上一篇日志中提到的错误:
* 已转存版本 740。
警告: 版本 535 的参考数据比最旧的转存数据版本 (700)还旧。
警告: 装载这个转存到空的版本库会失败。
* 已转存版本 741。
我没有太在意,结果从dump恢复版本库时出现错误,屏幕显示:svnadmin: 当前版本库不存在相对源版本 -164,并终止运行。导致我使用备份库进行dump。
跳过这段,直接说正确的方法。输入:
svnadmin dump c:/SVNRepository -r 745:755 > d:/repo_dump_745_755.dmp
个人无法证实,有待验证!
批次导入,将这几个备份文件装载到一个新的版本库中
$svnadmin load newrepos < 0-1000.dumpfile
$svnadmin load newrepos < 1001-2000.dumpfile
$svnadmin load newrepos < 2001:3000.dumpfile
SVN数据库迁移方法三(导出后,在导入时对库做分库整理或其它整理操作)
假设有一个包含三个项目的版本库: calc,calendar,和 spreadsheet。
它们在版本库中的布局如下:
/
现在要把这三个项目转移到三个独立的版本库中。首先,转储整个版本库:
$ svnadmin dump /path/to/repos > repos-dumpfile * Dumped revision 0. * Dumped revision 1. * Dumped revision 2. * Dumped revision 3. … $
然后,将转储文件三次送入过滤器,每次仅保留一个顶级目录,就可以得到三个转储文件:
$ cat repos-dumpfile | svndumpfilter include calc > calc-dumpfile … $ cat repos-dumpfile | svndumpfilter include calendar > cal-dumpfile … $ cat repos-dumpfile | svndumpfilter include spreadsheet > ss-dumpfile … $
现在你必须要作出一个决定了。这三个转储文件中,每个都可以用来创建一个可用的版本库,不过它们保留了原版本库的精确路径结构。也就是说,虽然项目
calc
现在独占了一个版本库,但版本库中还保留着名为
calc
的顶级目录。如果希望
trunk
、
tags
和
branches
这三个目录直接位于版本库的根路径下,你可能需要编辑转储文件,调整
Node-path
和
Copyfrom-path
头参数,将路径
calc/
删除。同时,你还要删除转储数据中创建
calc
目录的部分。一般来说,就是如下的一些内容:
Node-path: calc Node-action: add Node-kind: dir Content-length: 0警告:
如果你打算通过手工编辑转储文件来移除一个顶级目录,注意不要让你的编辑器将换行符转换为本地格式(比如将\r\n转换为\n)。否则文件的内容就与所需的格式不相符,这个转储文件也就失效了。
剩下的工作就是创建三个新的版本库,然后将三个转储文件分别导入:
$ svnadmin create calc; svnadmin load calc < calc-dumpfile $ svnadmin create calendar; svnadmin load calendar < cal-dumpfile $ svnadmin create spreadsheet; svnadmin load spreadsheet < ss-dumpfile
svndumpfilter的两个子命令都可以通过选项设定如何处理“空”修订版本。如果某个指定的修订版本仅包含路径的更改,过滤器就会将它删除,因为当前为空的修订版本通常是无用的甚至是让人讨厌的。为了让用户有选择的处理这些修订版本,svndumpfilter提供了以下命令行选项:
-
不生成任何空修订版本,忽略它们。
-
如果空修订版本被剔除(通过使用
--drop-empty-revs
选项),依次修改其它修订版本的编号,确保编号序列是连续的。 -
如果空修订版本被保留,保持这些空修订版本的属性(日志信息,作者,日期,自定义属性,等等)。如果不设定这个选项,空修订版本将仅保留初始时间戳,以及一个自动生成的日志信息,表明此修订版本由svndumpfilter处理过。
--drop-empty-revs
--renumber-revs
--preserve-revprops
尽管svndumpfilter十分有用,能节省大量的时间,但它却是把不折不扣的双刃剑。首先,这个工具对路径语义极为敏感。仔细检查转储文件中的路径是不是以斜线开头。也许
Node-path
和
Copyfrom-path
这两个头参数对你有些帮助。
… Node-path: spreadsheet/Makefile …
如果这些路径以斜线开头,那么你传递给svndumpfilter include和svndumpfilter exclude的路径也必须以斜线开头(反之亦然)。如果因为某些原因转储文件中的路径没有统一使用或不使用斜线开头,也许需要修正这些路径,统一使用斜线开头或不使用斜线开头。
此外,复制操作生成的路径也会带来麻烦。Subversion支持在版本库中进行复制操作,也就是复制一个存在的路径,生成一个新的路径。问题是,svndumpfilter保留的某个文件或目录可能是由某个svndumpfilter排除的文件或目录复制而来的。也就是说,为了确保转储数据的完整性,svndumpfilter需要切断这些复制自被排除路径的文件与源文件的关系,还要将这些文件的内容以新建的方式添加到转储数据中。但是由于Subversion版本库转储文件格式中仅包含了修订版本的更改信息,因此源文件的内容基本上无法获得。如果你不能确定版本库中是否存在类似的情况,最好重新考虑一下到底保留/排除哪些路径。
****备份环境注意点: