Svn 如何将项目从一个Subversion存储库移动到另一个?

Svn 如何将项目从一个Subversion存储库移动到另一个?,svn,repository,Svn,Repository,我正试图编写一个脚本,将大量项目从一个(内部)Subversion存储库复制到另一个(外部)Subversion存储库。我尝试过将svnadmin dump与svndumpfilter结合使用,但失败了。我不断遇到有关已移动且原始位置不再存在的文件的问题。我曾尝试使用svndumpfilter2和svndumpfilter3,但由于各种错误,我无法继续使用此路径 因为保存这些变化的历史是不必要的,我想一个简单的脚本就足够了。我只需从旧存储库中签出一个项目,使用switch更新存储库,然后执行更新

我正试图编写一个脚本,将大量项目从一个(内部)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 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