我有一组存储库,其结构类似于以下内容:
/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
在移动过程中必须保持历史 .
我看过以前提出过的两个看似相似的问题:
-
SVN move single directory into other repository (with history)
-
How do I move a single folder from one Subversion repository to another repository?
我对建议的解决方案没有太多运气 . 具体来说,当我运行svndumpfilter命令时出现错误,该命令指出:
svndumpfilter: Invalid copy source path `/branches/name-of-a-branch/.../File.cs`
发生了什么,我该如何解决这个问题?
Edit:
我目前正在尝试的一个解决方法是:
-
将/ 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.d.d Load加载到/ Target存储库
-
结帐/更新/目标存储库
-
使用TortoiseSVN将文件夹从/ Target / trunk / Internal / Temp / trunk / **移至/ Target / trunk / Internal(通过在Windows资源管理器中突出显示我想要的文件夹,按Control X,然后将文件夹更改为/ Target / trunk / Internal并使用TortoiseSVN发布粘贴
注意:以上假设svn维护X:\ Repositories文件夹中的所有存储库,并且使用X:\ Dumps文件夹作为工作文件夹 .
这显然会破坏修订号,但会保留历史记录 . 希望您的提交注释不包含对修订号的引用 .
其他人提到了一个svndumpfilter3 Python脚本,但我从未使用过Python,也不想学习使用Python,只是为了这个 .
3 回答
除非您还想要更改
FolderP
,FolderQ
和FolderR
的历史记录,为什么不简单svn move
将它们改为Internal
?请注意
svnadmin load
采用选项--parent-dir arg
,其中arg
是您希望导入的转储显示在其下的父文件夹 . 所以svnadmin load --parent-dir /trunk/Internal dump_of_source_repo target_repo
应该导入目标仓库中
/trunk/Internal
下的所有源仓库 .以下解决方法是针对filipenf所处的特定情况,即在Subversion服务器上无法访问svnadmin .
如果您可以在用于存储存储库的文件夹中的Subversion服务器上将文件物理移动到位,那么您很幸运 .
在执行以下任何操作之前,请进行备份,以防无意中损坏数据 . 永远不要过分强调自由使用备份 . 现在,解决方法:
停止本地存储库上的本地Subversion服务器,以便刷新存储库并且不能进行任何更改 .
停止公司Subversion服务器 .
将表示本地存储库的目录复制到公司Subversion服务器的存储库文件夹中,并与表示其他存储库的文件夹一起复制 .
重新启动公司Subversion服务器(如果需要,还可以重新启动本地服务器) .
这应该为您提供Subversion服务器中的新存储库,其中包含所有历史记录 .
然后,您可以使用svn:external属性将此新存储库中的代码引入公司Subversion服务器上的其他存储库 .
Please note that this involves the ability to physically copy files onto the company Subversion server, rather than creating a new repository or folder using the user interface published by the Subversion server.
为此,我找到了 great support within TortoiseSVN 版本1.9.4:
打开日志(
TortoiseSVN > Show log
)选择组成项目的所有修订
右键单击选择,然后
Merge revisions to...
选择目标文件夹(应该是最新的工作副本)
等待TSVN复制您的文件,文件夹和属性......
资源管理器窗口中的
:提交目标文件夹
免责声明
这个方法 strips history 并且可能只在某些情况下有效,但我的情况显然恰恰是其中之一(这就是为什么我喜欢TSVN:它really helps its users) .
背景故事:
我试图说服一所大学将一个小型("toy")项目置于版本控制之下,所以我清理了我们的SVN "playground"存储库 . 然后他承诺所有他认为这是源代码(当然远不止于此),然后我添加了相应的忽略模式,他立即开始做富有成效的工作在VC下(忘记这一切都发生在"playground" repo中) . 现在我不得不说服他移动到一个持久的存储库并搜索一个易于应用且易于教授的方法,以使他能够在新站点中进行第一次提交 .