将文件夹从一个SVN存储库移动到另一个存储库

时间:2010-06-25 00:39:13

标签: svn tortoisesvn repository

我有一组存储库,结构类似于以下结构:

/Source
  /branches
  /tags
  /trunk
    /FolderP
    /FolderQ
    /FolderR

/Target
  /branches
  /tags
  /trunk
    /External
      /Library1
      /Library2
      /Library3
    /Internal
      /FolderA
      /FolderB
      /FolderC
      /FolderX
      /FolderY
      /FolderZ

我想将文件夹/ Source / trunk / FolderP,/ Source / trunk / FolderQ和/ Source / trunk / FolderR移动到/ Target / trunk / Internal,以便:

  • / Source / trunk / FolderP成为/ Target / trunk / Internal / FolderP
  • / Source / trunk / FolderQ成为/ Target / trunk / Internal / FolderQ
  • / Source / trunk / FolderR成为/ Target / trunk / Internal / FolderR

然后我应该有以下存储库结构:

/Target
  /branches
  /tags
  /trunk
    /External
      /Library1
      /Library2
      /Library3
    /Internal
      /FolderA
      /FolderB
      /FolderC
      /FolderP
      /FolderQ
      /FolderR
      /FolderX
      /FolderY
      /FolderZ

在移动过程中必须保持历史。

我已经看过以前提出过的两个看似相似的问题:

我对建议的解决方案没有太多运气。具体来说,当我运行svndumpfilter命令时出现错误,该命令指出:

svndumpfilter: Invalid copy source path `/branches/name-of-a-branch/.../File.cs`

发生了什么,我该如何解决这个问题?

修改

我目前正在尝试的一个解决方法是:

  • 将/ Source存储库克隆到另一个名为/ Temp
  • 的存储库中
  • 从/ Temp删除我不需要的文件和文件夹,并检查所有更改
  • 通过调用“svnadmin dump X:\ Repositories \ Temp> X:\ Dumps \ Temp.dmp”转储/临时存储库
  • 通过调用“svnadmin load --parent-dir trunk \ Internal \ Temp X:\ Repositories \ Target< X:\ Dumps \ Temp.dmp”
  • 将Temp.dmp加载到/ Target存储库
  • 结帐/更新/目标存储库
  • 使用TortoiseSVN将文件夹从/ Target / trunk / Internal / Temp / trunk / **移到/ Target / trunk / Internal(通过在Windows资源管理器中突出显示我想要的文件夹,按Control + X然后更改文件夹) to / Target / trunk / Internal并使用TortoiseSVN发布粘贴

注意:上面假设svn正在维护X:\ Repositories文件夹中的所有存储库,并且正在使用X:\ Dumps文件夹作为工作文件夹。

这显然会破坏修订号,但会保留历史记录。希望您的提交注释不包含对修订号的引用。

其他人提到了一个svndumpfilter3 Python脚本,但是我从未使用过Python,也不想学习使用Python,只是为了这个。

3 个答案:

答案 0 :(得分:2)

除非您还要更改FolderPFolderQFolderR的历史记录,否则为什么不将svn move改为Internal

请注意,svnadmin load会选择--parent-dir arg,其中arg是您希望导入的转储显示在其中的父文件夹。所以
svnadmin load --parent-dir /trunk/Internal dump_of_source_repo target_repo
应该导入目标仓库中/trunk/Internal下的所有源仓库。

答案 1 :(得分:1)

以下解决方法是针对filipenf所在的特定情况,即无法访问Subversion服务器上的svnadmin。

如果您可以在用于存储存储库的文件夹中将文件物理移动到Subversion服务器上,那么您很幸运。

在执行以下任何操作之前,请进行备份,以防数据意外损坏。永远不要过分强调自由使用备份。现在,解决方法:

  1. 停止本地存储库上的本地Subversion服务器,以便刷新存储库并且不能进行任何更改。
  2. 停止公司Subversion服务器。
  3. 将代表本地存储库的目录复制到公司Subversion服务器的存储库文件夹以及代表其他存储库的文件夹中。
  4. 重新启动公司Subversion服务器(如果需要,还可以重新启动本地服务器)。
  5. 这应该会在Subversion服务器公司中为您提供新的存储库,其中包含所有历史记录。

    然后,您可以使用svn:external属性将此新存储库中的代码引入公司Subversion服务器上的其他存储库。

    请注意,这涉及物理将文件复制到公司Subversion服务器上的能力,而不是使用Subversion服务器发布的用户界面创建新的存储库或文件夹。

答案 2 :(得分:0)

为此,我在TortoiseSVN 版本1.9.4 +中找到了的大力支持:

  • 打开日志( TortoiseSVN > Show log
  • 选择构成项目的所有修订
  • 右键点击选择,然后 Merge revisions to...
  • 选择目标文件夹(应该是最新的工作副本)
  • 等待TSVN复制您的文件,文件夹和属性......
  • 资源管理器窗口中的
  • :提交目标文件夹

声明

这种方法剥离历史并且可能仅在某些情况下有效,但我的情况显然恰好是其中之一(这就是为什么我喜欢TSVN:它really helps its users)。

背景故事:

我试图说服一所大学将一个小型(“玩具”)项目置于版本控制之下,所以我清理了我们的SVN“playground”存储库。然后他承诺所有他认为这是源代码(当然远不止于此),然后我添加了适当的忽略模式,他立即开始在VC下做生产性工作(忘记这一切都发生在“游乐场”回购中)。现在我不得不说服他转移到一个持久的存储库并搜索一个易于应用且易于教授的方法,以使能够在新站点中进行第一次提交。 / p>