具有历史记录的存储库之间的SVN复制


69

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

在我看来,这似乎是一个普遍的要求。

因此:是否可以在所有历史记录之间迁移SVN存储库?

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

如果只是归结为从源中签出每个修订,然后将其签入到目的地,只要有一个自动化的流程,我们就可以了。

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


您可以询问谁拥有svnadmin权限来为您执行导出。
格伦(Glen)

Answers:


41

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


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


这看起来很接近我的要求。
John Gietzen 2009年

不可能做简单svnsync TOURL FROMURL吗?
约翰·吉森

命令行选项不同,请参见linux.die.net/man/1/svnsync。而且,您必须首先创建一个(可能为空)pre-revprop-change钩子(如果是Windows,则为pre-revprop-change.bat)。
mihi

@mihi response新的svnsync文档链接现在为svn.apache.org/repos/asf/subversion/trunk/notes/svnsync.txt
Carlosfocker 2010年

1
我阅读文档的方式svnsync是用于只读镜像。
MarkHu

9

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

您当前在共享存储库上吗?这可能会使拥有存储库的人感到沮丧,因为它将是整个存储库的副本,而不仅仅是您的一部分。


是的,这将是一个共享的存储库源。这就是为什么我们无法转储的原因。
John Gietzen 2009年

也许您可以说服所有者使用svndumpfilter向您提供经过过滤的转储?有关更多信息,请参见svnbook.red-bean.com/en/1.5/…
markusk

看起来svnsync几乎是最好的方法。
John Gietzen 2009年

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/


2
为我工作不完美。我现在是所有更改的作者-以及所有已过时的日期。请注意,上面示例中的“目标存储库”现在是GIT存储库,并且您的SVN-REPOSITORY-TO仍在SVN中。
MarkHu

效果很好,但是如上所述,您最终得到一个本地git存储库,因此我必须在dest-repo中运行“ git svn dcommit”,以将其全部提交到目标SVN存储库。
约翰·福克

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.