我如何将SVN存储库迁移到另一个SVN存储库?
有一个简单的方法来复制一个目录从一个存储库到另一个存储库复制所有的历史?
最简单的方法是使用:
svnadmin dump path/to/repos > repos.out
这将在文件repos.out
为您的存储库(包含历史logging)创build一个可移植的格式。 你可以使用
svnadmin load path/to/newrepos < repos.out
加载你的“倾销”的存储库到新的或现有的。
第5章存储库维护 – >迁移存储库数据其他地方有关于从1.7版本开始使用svnadmin dump
注意事项:
Subversion版本库转储格式仅描述版本化的版本库更改。 它不会携带关于未提交事务,文件系统path上的用户locking,存储库或服务器configuration自定义(包括挂钩脚本)等的任何信息。
正如Subversion书中的build议:
svnadmin dump path/to/repos_src \ | svndumpfilter include path/inside/svn/to/directory \ | svnadmin load path/to/repos_dst
举个例子:
svnadmin dump /var/lib/svn/old_repo \ | svndumpfilter include trunk/my_project/common_dir \ | svnadmin load /var/lib/svn/new_repo
如果你不需要历史logging,你可以使用svn export
来获得没有.svn
文件夹的干净的文件夹,然后svn import
到你的其他仓库。
有了历史logging,您将需要使用svnadmin dump
。 然后你可以在使用svnadmin load
之前使用svndumpfilter
来只过滤你想要使用的部分或path。
要阅读的主题:
- 在其他地方迁移存储库数据
- 筛选存储库历史logging
使用svnsync
– Subversion Repository Mirroring命令:
svnsync
是Subversion远程资源库镜像工具。 简而言之,它允许您将一个存储库的修订重放到另一个。
svnsync
命令的Subversion文档有以下警告(从版本1.7开始),这意味着一旦其他一些SVN命令用于修改镜像存储库, svnsync
不应再次用于特定的镜像:
svnsync
对镜像库中所做的更改非常敏感,这些更改并非作为镜像操作的一部分。 为防止发生这种情况,最好是svnsync
进程是唯一允许修改镜像库的进程。
您可以使用svnadmin dump
创build转储文件,然后使用svnadmin load
导入到新的存储库。
在Subversion版本1.7中有一个新的命令svnrdump
,它可以用来访问远程仓库,并生成与svnadmin dump
命令生成的转储格式相同的输出。 这允许你使用svnrdump
svnadmin load
来传输一个Subversion版本库。
请参阅svnrdump – 远程Subversion版本库数据迁移 ,其中有对新命令的解释。
在红皮书的第5章中, 迁移存储库数据的其他部分有一个使用svnrdump
的子数据库数据迁移子部分,其中提到:
svnrdump
和svnadmin dump
之间的主要区别在于,svnrdump
不是直接访问版本库,svnrdump
使用与Subversion客户端完全相同的Repository Access(RA)协议进行远程操作。 因此,您可能需要提供身份validation凭据。 此外,您的远程交互[原文如此]受Subversion服务器上configuration的任何授权限制的约束。
我还会假设svnadmin dump
有关服务器configuration自定义(如挂接)的限制可能不会被传递,也将适用于svnrdump
。
我认为应该说,利用创build的转储文件
svnadmin dump path/to/repos > dumpfile
可以使用该命令创build(从svn 1.7和更高版本)
svnrdump dump url_to_repos > dumpfile
这是从远程计算机而不是服务器完成的。
要将存储库从一台服务器迁移到另一个版本,请遵循以下步骤。
第1步:将所有存储库版本转储到转储文件。 您可能在现有的资源库中拥有数千个版本。 所以你可以使用下面的脚本创build一个转储文件。
dump.sh
# Here “i” is the version starting number, and “j” is the maximum version number of your existing #repository. j=4999; for ((i=0;i<=$j;i++)); do # your-unix-command-here echo $i svnadmin dump <old_server_repository_location > -r $i –incremental > <dump_location>/$i.dump done
在上面的脚本中,您可能会根据空间可用性获得旧存储库的完整转储,或者可以在很短的时间间隔内(即从0-5000,然后从5001-10000等)转储转储。
第2步:使用以下命令执行上述脚本。 根据内核版本,您需要执行以下两个查询之一。
$ bash dump.sh > stdout.sh $ ./sh dump.sh > stdout.sh
这将使用上述命令将所有必须执行的命令写入stdout.sh文件。 你可以跟踪这个文件以备将来参考。
步骤3:检查新旧服务器之间的端口号为22的防火墙是否打开。 如果没有打开,请询问您的pipe理员使其可用。
第4步:现在使用以下命令将从旧SVN存储库生成的所有转储文件复制到新服务器。
$ sftp xxxx@<new_server> Connecting to <new_server>… Password: sftp> mput *.dump <new_server>/dump_location
在上面的命令中, xxxx
是正在执行操作的用户。 在执行sftp的过程中,您将转储文件从旧服务器复制到新服务器。
第5步:为新服务器创build一个新的存储库
$ svnadmin create <new_repository>
第6步:现在使用下面的脚本来加载所有的转储文件。
load.sh
# Here “i” is the version starting number, and “j” is the maximum version number of your existing #repository. j=4999; for ((i=0;i<=$j;i++)); do # your-unix-command-here echo $i svnadmin load –bypass-prop-validation <new_repository> < dump_location /$i.dump done
只要按照以上六个简单的步骤,您就可以将现有的存储库迁移到新的存储库。 通过这个过程,您不必担心现有存储库的损坏修订。