在两个版本库之间复制带有历史记录的 SVN

70

我的队友之一询问是否可以将一个SVN仓库导出到另一个仓库,并保留历史记录。

在我看来,这好像是一个常见的请求。

因此:是否有可能在保留历史记录的同时在SVN仓库之间迁移?

需要注意的是,我们没有源仓库的svnadmin访问权限,但在目标仓库上有该权限。

如果这只涉及从源仓库检出每个版本,并将其检入到目标仓库中,那么只要有自动化的过程,我们就可以接受这种方法。

编辑:我忘了提到目标仓库在Windows上。


你可以询问拥有svnadmin权限的人为你执行导出操作。 - Glen
5个回答

42

[编辑:以下原始回复是针对早期版本的 SVN 1.7 之前,这是解决问题的最佳方法(尽管它不是 svnsync 的主要用例)。在 SVN 1.7 客户端或更高版本中,有一个工具 svnrdump 直接实现您正在尝试完成的功能。]


使用 svnsync 将源同步到目标(需要管理员访问目标存储库,或者至少有一种添加挂钩的方式,但对源存储库没有特殊访问权限)。如果目标已经存在版本,则将源同步到临时存储库,然后使用 svn-merge-repos.pl 合并两个本地存储库。


1
我阅读文档的方式是 svnsync 用于只读镜像。 - MarkHu
嘿,那个问题已经过时了。现在有svnrdump,所以你不再需要svnsync来完成那个任务了... - mihi
我能否使用它与已经失效的 SVN 存储库?我在备份中有检出代码...但主要存储库现在已关闭。请查看 http://stackoverflow.com/questions/25861512/create-new-svn-repository-from-checkout-code-from-dead-svn-repo - Krunal
从结帐中,您只能恢复您最后一次签出的版本。没有更多历史记录。如果您有足够多的备份,可以使用它们手动构建“新历史记录”。另外,请不要劫持无关的问题... - mihi
如果是本地仓库,使用svnadmin load命令;如果是远程仓库,则使用svnrdump load命令。如果要将其加载到非空仓库中,可能需要先运行svndumpfilter命令,因为如果其他仓库中已经存在文件,则会出现错误(或者先删除/重命名它们,然后在导入后进行修复)。 - mihi
显示剩余5条评论

9
通常实现这一点的方法是使用svnadmin dump命令。如果您没有svnadmin访问权限,则应向拥有该权限的人请求提供转储。这将使导入过程更加容易。
您目前是否在共享存储库上?这可能会让拥有存储库的人不愿意给您提供转储,因为它将是整个存储库的副本,而不仅仅是您的部分。

是的,这将是一个共享的代码库。这就是为什么我们无法获取转储的原因。 - John Gietzen
也许你可以说服所有者使用svndumpfilter为你提供一个过滤后的转储文件?请参阅http://svnbook.red-bean.com/en/1.5/svn.reposadmin.maint.html#svn.reposadmin.maint.tk.svndumpfilter获取更多信息。 - markusk
看起来svnsync几乎是最好的选择。 - John Gietzen

9
我有一个类似的需求(因此访问了这个页面),最终编写了自己的程序来完成这项工作。认为这个工具可能对仍在寻找解决方案的其他人有用:
  • 该工具不需要访问源代码库的管理员权限。
  • 它支持添加/删除/复制/移动操作,保留节点属性(例如svn:ignore、svn:external)和修订版本属性(即您可以获取正确的作者和日期/时间)。
  • 还可以增量复制新的修订版本。
  • 拥有GUI和命令行实用程序。

如果有人感兴趣,请查看这里


看起来非常有趣! - Jean-Francois T.

8
你可以使用git-svn(或其他SCM系统)来完成此任务。
步骤如下:
1. Get a git svn clone of each repository:
    git svn clone <SVN-REPOSITORY-FROM> source-repo
    git svn clone <SVN-REPOSITORY-TO> dest-repo

 2. Create patches to be imported:
    cd source-repo/
    export commitFrom=`git log --pretty=%H | tail -1`
    git format-patch -o /tmp/mergepatchs ${commitFrom}..HEAD .

 3. Import the patches
    cd dest-repo/
    git am /tmp/mergepatchs/*.patch

参考来源:http://blog.neutrino.es/2012/git-copy-a-file-or-directory-from-another-repository-preserving-history/

该文介绍了如何从另一个仓库复制文件或目录并保留历史记录。这对于IT技术人员非常有用。

2
对我来说,它的工作不完美。现在我是所有更改的作者 - 今天所有更改都有日期。请注意,上面示例中的“dest-repo”现在是一个GIT存储库,而您的SVN-REPOSITORY-TO仍然在SVN中。 - MarkHu
工作得很好,但是正如所提到的,你最终会得到一个本地的git存储库,因此我不得不在目标存储库中运行“git svn dcommit”来将所有内容提交到目标SVN存储库。 - Johan Falk

0

如果您只需要一个带有完整更改集的版本控制存储库,则可以使用带有bzr-svn插件的bzr。

当您检出svn存储库时,所有内容都将同步。


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