9个回答

80
最简单的方法是使用:

svnadmin dump path/to/repos > repos.out

这将在文件repos.out中为您的存储库(包括历史记录)创建一个可移植格式。然后,您可以使用

svnadmin load path/to/newrepos < repos.out

要将您“dumped”(转储)的代码库加载到新代码库或现有代码库中,可以使用第5章。仓库维护->迁移存储库数据 中关于版本1.7中使用svnadmin dump的注意事项:

Subversion仓库转储格式仅描述具有版本号的仓库更改。它不会携带任何有关未提交的事务、用户锁定文件系统路径、仓库或服务器配置自定义(包括钩子脚本)等信息。


23
注意,我刚刚通过艰难的方式学到,svnadmin dump 命令不包括 hooks/ 或 conf/ 目录。 - delimiter
6
以防万一今天有人犯了我犯的错误,你需要确切地在svn机器上执行此操作。你不能从远程工作副本检出repo并进行转储。这是一个适用于远程位置的解决方案。(注意:原文中的“repo”是指“repository”,“svn”是指“Subversion”,“dump”是指“svn dump”。) - Chang Hyun Park
5
svnrdump dump 和 svnrdump load 可以让您通过网络转储和加载存储库。 - Tobias Kremer
2
一种相对安全的合并方式是先通过Tortoise进行检出,然后添加+提交一个新文件夹。接着,我使用svnadmin load --parent-dir newRootFolder < dump.out命令来完成合并。另外,也可以参考将多个仓库合并为一个 - domih
@delimiter 这个问题有解决方案吗?还是现在的解决方案是每次进行转储时手动复制文件夹?看起来这是一件很容易被忽视的事情... - JohannesB
显示剩余5条评论

36

Subversion book所建议:

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

24

如果您不需要历史记录,您可以使用svn export命令获取一个干净的文件夹,其中不包含.svn文件夹,然后将其导入到其他存储库中,使用svn import命令。

如果需要保留历史记录,则需要使用svnadmin dump命令进行备份。之后,您需要使用svndumpfilter来筛选出您想要使用的部分或路径,最后再使用svnadmin load命令进行导入。

相关主题:


9
使用 svnsync — Subversion Repository Mirroring 命令:

svnsync 是 Subversion 远程库镜像工具。简单来说,它允许您将一个仓库的修订记录重放到另一个仓库中。

Subversion 的 svnsync 命令文档(截至版本 1.7)发出了以下警告,暗示一旦使用其他 SVN 命令修改了镜像仓库,则不应再次使用该特定镜像的 svnsync

svnsync 非常敏感,会对在其它过程中对镜像仓库所做的更改作出反应。为防止这种情况发生,最好只允许 svnsync 进程修改镜像仓库。


6
在Subversion版本1.7中,有一个新命令svnrdump,可以用于访问远程存储库,并生成与svnadmin dump命令生成的相同转储格式输出。这使您可以使用svnrdumpsvnadmin load来传输Subversion存储库。
请参见svnrdump-远程Subversion存储库数据迁移,其中对新命令进行了解释。
在红皮书的第5章中,部分将存储库数据迁移到其他位置有一个子部分使用svnrdump进行存储库数据迁移提到:

[svnrdumpsvnadmin dump]的主要区别在于,svnrdump不需要直接访问存储库,而是远程操作,使用与Subversion客户端相同的存储库访问(RA)协议。因此,您可能需要提供身份验证凭据。此外,您的远程交互受制于配置在Subversion服务器上的任何授权限制。

我还假设svnadmin dump的限制,例如挂钩之类的服务器配置自定义可能不适用于svnrdump

4
您可以使用svnadmin dump创建转储文件,然后使用svnadmin load导入到新存储库中。

3

我认为需要说明的是,利用工具创建的转储文件

    svnadmin dump path/to/repos > dumpfile

可以使用以下命令(从svn 1.7开始)创建:

   svnrdump dump url_to_repos > dumpfile

当需要在远程计算机上执行操作而不是在服务器上执行时,这将非常有用。


0

将存储库从一个服务器迁移到另一个版本,您需要遵循以下步骤。

第一步:将所有存储库版本转储到转储文件中。您可能在现有存储库中拥有数千个版本。因此,您可以使用以下脚本创建转储文件。

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是否开放防火墙。如果没有开放,请请求管理员提供权限。

步骤4:现在使用以下命令将从旧 SVN 存储库生成的所有转储文件复制到新服务器。

$ sftp xxxx@<new_server>
Connecting to <new_server>…
Password:
sftp> mput *.dump <new_server>/dump_location

在上述命令中,xxxx 是执行操作的用户。在进行sftp时,您正在将转储文件从旧服务器复制到新服务器。
步骤5:在新服务器上创建一个新的存储库。
$ 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

只需按照以上六个简单步骤,您就能将现有的存储库迁移到新存储库。通过此过程,您无需担心现有存储库的损坏修订版。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接