需求1:现有SVN下分别有A和B两个仓库,需要将这两个仓库合并到C仓库下并保留各自的版本信息。
实现:先将两个仓库单独dump到文件,然后再将这两个dump文件load到同一个C仓库中
svnadmin dump /data/resources/svndata/svn/a/ > /tmp/a.dump
svnadmin dump /data/resources/svndata/svn/b/ > /tmp/b.dump
在c仓库下分别创建a和b两个文件夹,再分别两个dump文件导入到各自的文件夹中:
svnadmin load /data/resources/svndata/svn/c/ --parent-dir a < /tmp/a.dump
svnadmin load /data/resources/svndata/svn/c/ --parent-dir b < /tmp/b.dump
--parent-dir 表示指定导入到仓库下的哪个子目录,如上表示将a.dump导入到c仓库下的a目录中
需求2:将版本库A目录下的abc 即 /A/abc 移动到新的版本库B下并保留版本信息。
实现:先将整个版本库A dump出来,再利用svndumpfilter过滤出要导出的abc文件夹,最后将过滤出的abc导入到版本库B中
如下:
# svnadmin dump /data/resources/svndata/svn/A/ > /tmp/A.dump
# cat /tmp/A.dump | svndumpfilter include abc > /tmp/abc.dump
# svnadmin create /data/resources/svndata/svn/B
# svnadmin load /data/resources/svndata/svn/B/ < /tmp/abc.dump
错误处理:
当执行svndumpfilter 时可能会出现:
svndumpfilter: Invalid copy source path '/Alex'
它需要包含 /Alex 目录,此时不管你在导入新的版本库时是否需要包含Alex目录,在命令里都给加上,命令如下:
# cat /tmp/A.dump | svndumpfilter include abc “/Alex” > /tmp/abc.dump
此解决方案来自:http://stackoverflow.com/questions/9261625/svndumpfilter-fails-with-invalid-copy-source-path-error
需求3:将版本库A目录下的abc的子目录ddd 即 /A/abc/ddd 移动到新的版本库B下并保留版本信息。
实现:实现方式和需求2一致。
# svnadmin dump /data/resources/svndata/svn/A/ > /tmp/A.dump
# cat /tmp/A.dump | svndumpfilter include '/abc/ddd' > /tmp/ddd.dump
# svnadmin create /data/resources/svndata/svn/B
# svnadmin load /data/resources/svndata/svn/B/ < /tmp/ddd.dump
可能遇到的错误:
当执行最后一步svnadmin load的时候出现以下错误:
svnadmin: File not found: transaction '335-9b', path 'abc/ddd'
解决办法:
先将B checkout出来,然后再创建abc目录进行提交,然后再次执行svnadmin load
# svn chekcout http://192.168.1.9/svn/B /tmp/B
# mkdir /tmp/B/abc
# svn add /tmp/B/abc
# svn ci -m "temp dir" /tmp/B/abc
# svnadmin load /data/resources/svndata/svn/B/ < /tmp/ddd.dump
解决方案参考:
http://witcher42.me/blog/2012/06/01/svn/