Svn 如何将项目从一个Subversion存储库移动到另一个?
我正试图编写一个脚本,将大量项目从一个(内部)Subversion存储库复制到另一个(外部)Subversion存储库。我尝试过将svnadmin dump与svndumpfilter结合使用,但失败了。我不断遇到有关已移动且原始位置不再存在的文件的问题。我曾尝试使用svndumpfilter2和svndumpfilter3,但由于各种错误,我无法继续使用此路径 因为保存这些变化的历史是不必要的,我想一个简单的脚本就足够了。我只需从旧存储库中签出一个项目,使用switch更新存储库,然后执行更新。但是,我只是得到一个错误,说明新存储库的UUID无效: *svn:存储库位于'file:///home/developer/svn/NEW_REPO/java/jar/FOO“具有uuid”c315c701-d367-47aa-a473-87f95147eb5f“,但WC具有“8ce3ae18-f586-4a38-8bf8-e0fc691799fb”* 这是我的剧本:Svn 如何将项目从一个Subversion存储库移动到另一个?,svn,repository,Svn,Repository,我正试图编写一个脚本,将大量项目从一个(内部)Subversion存储库复制到另一个(外部)Subversion存储库。我尝试过将svnadmin dump与svndumpfilter结合使用,但失败了。我不断遇到有关已移动且原始位置不再存在的文件的问题。我曾尝试使用svndumpfilter2和svndumpfilter3,但由于各种错误,我无法继续使用此路径 因为保存这些变化的历史是不必要的,我想一个简单的脚本就足够了。我只需从旧存储库中签出一个项目,使用switch更新存储库,然后执行更新
svn checkout file:////home/developer/svn/OLD_REPO/java/jar/FOO
cd FOO
svn switch --relocate file:////home/developer/svn/OLD_REPO/java/jar/FOO file:////home/developer/svn/NEW_REPO/java/jar/FOO .
svn update
有人能看出我做错了什么,或者switch不适合这个任务吗
更新
我已将此向前推进。UUID问题在于我如何创建目标存储库。从那以后我一直在跑步
svnadmin setuuid file:////home/developer/svn/NEW_REPO <old_repo_id>
如果您只想将项目的HEAD修订版(我假设它包含在一个目录中)从一个svn存储库移动到另一个svn存储库,那么最简单的方法可能是将其从原始位置(到本地目录)移动到新位置。如果使用
svn export
,您不必删除.svn
目录
我已经做过很多次了。程序本身相当简单,但它确实需要几个过程:
首次通过:find$from-type d
- 如果您在
中发现一个目录不在$from
中,请执行$to
svn add
- 如果
和$from
都有该目录,请转到下一个目录$to
查找$to
- 如果
的$to
中不存在目录或文件,请对该文件或目录执行$from
svn delete
从中查找$d类型
:
- 如果文件同时存在于
和$from
中,请将文件从$to
复制到$from
$to
- 如果文件存在于
中,而不是$from
中,请将文件$to
复制到$from
,然后对该文件执行$to
svn添加
find `$to` -type -d | while read $directory
do
blah, blah, blah
done
有了Mercurial+HGSubversion(中间还有一些黑魔法),您的过程将非常简单
hg pull OLD_REPO
hg push NEW_REPO
斯图尔特,我已经按照你的建议做了,现在有了一个脚本,可以将初始副本复制到一个空的新存储库中。万岁!然而,它只有一种效果。如果目标已存在,则导入无法提交。我将用我最新的脚本更新我的问题。你能帮我让它运行不止一次吗?我不明白你的意思。当然,脚本不会在同一个“项目”上工作两次,因为您将尝试导入已经导入的内容。如果要导入其他项目,则需要确保将其导入到新svn存储库中的其他位置(文件夹)。如果我遗漏了什么,请告诉我。你是说你不能多次运行整个脚本吗?这是意料之中的。还是说它只对第一个${project}有效?我想我对svn导入(第一次向存储库中添加了一些东西)和svn提交感到困惑???(只是更新一些东西)。我的脚本可以导入每个项目,但当然不会更新更改(对不起,我的svn foo很弱-我以前一直使用GUI。)正确--svn导入用于将文件从工作副本外部推送到新的存储库目录。如果存储库目录已经存在,它将不会执行任何操作。您需要使用svn commit将更改从工作副本推送到其已存在的“备份”存储库位置。1。导出的树是未版本化的数据,它在.svn dir(和.svn)2中不包含任何元数据。导入(AFAICR)是空存储的一次性操作为什么不使用ol'good svnsync?Lazy Badger,我们决定不使用svnsync,因为我们想决定何时将版本推送到新存储库。我们也不关心原始存储库中的注释/历史记录。天哪,这比我想象的要复杂。我想从我的旧存储库中签出(一些)项目,修改它们的SVN信息,使其指向新存储库和提交。我会按照你的建议,尝试按照你的逻辑构建一个脚本。我会把结果贴在这里,没那么复杂。只需要几次传球。您希望确保在文件之前存在目录(第一次),然后添加新的或修改的文件(第二次),然后确保删除的内容不再在存储库中。
hg pull OLD_REPO
hg push NEW_REPO