有没有一种简单的方法可以将目录从一个存储库复制到另一个存储库并复制所有历史记录?
9 回答
最简单的方法是使用:
svnadmin dump path/to/repos > repos.out
这将为文件中的存储库(带有历史记录)创建可移植格式repos.out
。然后你可以使用
svnadmin load path/to/newrepos < repos.out
将您的“转储”存储库加载到新的或现有的存储库。
Chapter 5. Repository Maintenance -> Migrating Repository Data Elsewhere有关于使用svnadmin dump
1.7 版的说明:
Subversion 存储库转储格式仅描述版本化存储库更改。它不会携带有关未提交事务、文件系统路径上的用户锁定、存储库或服务器配置自定义(包括挂钩脚本)等的任何信息。
正如Subversion 书中所建议的:
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
如果您不想要历史记录,您可以使用svn export
获取一个没有文件夹的干净文件.svn
夹,然后svn import
进入您的其他存储库。
有了历史,您将需要使用svnadmin dump
. 然后,您将svndumpfilter
在使用svnadmin load
.
阅读主题:
使用svnsync
— Subversion Repository Mirroring命令:
svnsync
是 Subversion 远程仓库镜像工具。简而言之,它允许您将一个存储库的修订重播到另一个存储库中。
该svnsync
命令的 Subversion 文档有以下警告(从 1.7 版开始),暗示一旦使用其他一些 SVN 命令修改镜像存储库,svnsync
不应再次与该特定镜像一起使用:
svnsync
对镜像存储库中所做的更改非常敏感,这些更改不是作为镜像操作的一部分进行的。为防止这种情况发生,最好该svnsync
进程是允许修改镜像存储库的唯一进程。
在 Subversion 1.7 版中有一个新命令,svnrdump
可用于访问远程存储库并生成与该svnadmin dump
命令生成的相同的转储格式输出。这允许您使用svnrdump
withsvnadmin load
来传输 Subversion 存储库。
请参阅svnrdump — 远程 Subversion 存储库数据迁移,其中包含对新命令的说明。
在红皮书的第 5 章中,Migrating Repository Data Elsewhere部分有一个使用 Repository 数据迁移svnrdump
的子部分,其中提到:
svnrdump
[和]的主要区别在于svnadmin dump
不需要直接访问存储库,而是svnrdump
使用与 Subversion 客户端完全相同的存储库访问 (RA) 协议进行远程操作。因此,您可能需要提供身份验证凭据。此外,您的远程交互 [原文如此] 受 Subversion 服务器上配置的任何授权限制的约束。
我还假设svnadmin dump
有关服务器配置自定义的限制(例如挂钩可能无法转移)也适用于svnrdump
.
您可以使用 创建转储文件svnadmin dump
,然后使用 导入到新存储库svnadmin load
。
我认为应该说明通过利用创建的转储文件
svnadmin dump path/to/repos > dumpfile
可以使用命令创建(从 svn 1.7 及以后)
svnrdump dump url_to_repos > dumpfile
当从远程计算机而不是服务器完成时,这很有用。
要将存储库从一台服务器迁移到另一个版本,您需要遵循以下步骤。
第 1 步:将所有存储库版本转储到转储文件中。您可能在现有存储库中有数千个版本。因此,您可以使用以下脚本创建转储文件。
转储文件
# 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 步:现在使用以下脚本加载所有转储文件。
加载.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
只需按照上述六个简单步骤,您就可以将现有存储库迁移到新存储库。通过此过程,您无需担心现有存储库的损坏修订。
如果这对其他人有帮助,可以使用 svn2svn 将变更集从一个 Subversion 存储库重播到另一个: