70

我的一位队友询问是否可以从一个 SVN 导出到另一个,同时保持历史记录。

对我来说,这似乎是一个普遍的要求。

那么:是否可以在保持历史记录的同时在 SVN 存储库之间迁移?

需要注意的是,我们在 Source 上没有 svnadmin 访问权限,但在 Destination 上却有。

如果这归结为仅从源中签出每个修订版,并将其签入到目的地,那么只要有一个自动化的流程,我们就可以接受。

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

4

5 回答 5

42

[编辑:下面的原始回复来自 SVN 1.7 之前的版本,这是解决问题的最佳方法(尽管它不是 的主要用例svnsync)。在 SVN 1.7 客户端或更高版本中,有一个svnrdump工具可以更直接地完成您想要实现的目标)]


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

于 2009-06-10T16:54:25.453 回答
9

通常实现这一点的方法是svnadmin dump命令。如果您没有 svnadmin 访问权限,那么我会问这样做的人是否可以为您提供转储。这也将使导入过程更加容易。

您目前在共享存储库中吗?这可能会使拥有存储库的人很容易给你一个转储,因为它将是整个存储库的副本,而不仅仅是你的一部分。

于 2009-06-10T17:01:10.697 回答
9

我有类似的需求(因此访问了这个页面)并最终编写了自己的程序来完成这项工作。认为该工具可能对仍在寻找解决方案的其他人有用:

  • 该工具不需要对源存储库进行管理员访问。
  • 它支持添加/删除/复制/移动,保留节点属性(例如 svn:ignore, svn:external)和修订属性(即,您获得正确的作者和日期/时间)。
  • 也可以增量复制新的修订。
  • 同时具有 GUI 和命令行实用程序。

如果有人有兴趣,看看这里

于 2012-02-14T16:02:37.473 回答
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/

于 2012-11-14T01:04:11.687 回答
0

如果您只需要带有完整变更集的版本控制存储库,则可以将 bzr 与 bzr-svn 插件一起使用。当您签出 svn 存储库时,所有内容都将被同步。

于 2012-02-21T22:33:59.800 回答