在主干上解决svnadmin错误E160020

时间:2014-09-17 11:04:50

标签: svn cvs cvs2svn

上下文

我将旧的CVS存储库迁移到SVN。我们有一个用于企业组件的存储库,另一个用于所有公司项目。对于公司项目,我们选择使用多解决方案布局,为每个项目安排迁移,我们选择使用多解决方案布局

-solution1
    -branches
        -
        -
        -
    -tags
        -
        -
        -
    -trunk
        -component1
        -component2

相反,对于核心组件,我们选择了单一解决方案 - 多项目布局

-branches
    -
    -
    -
    -
-tags
    -
    -
    -
-trunk
    -compv1
    -compv2
    -compv3
    -tools
    -utils
    -etc

(不同的主要版本被视为单独的项目并得到维护)

工具

现在,由于核心组件的迁移预计将是一次性事件,因此我准备了一个脚本来将所有内容迁移到专用的SVN存储库。基于我在其他项目中所做的,我创建了一个用project-name参数

启动的脚本
#!/bin/bash
PROJECT_NAME=$1
TARGET_REPO=$2
PROJECT_ROOT=/tmp/cvs_copy

sudo -u apache cvs2svn --dumpfile=/tmp/$PROJECT_NAME.dump --trunk=trunk/$PROJECT_NAME --branches=branches --tags=tags --tmpdir=/tmp/cvs2svn --encoding=windows-1252 --dry-run $PROJECT_ROOT/$PROJECT_NAME/

sudo -u apache cvs2svn --dumpfile=/tmp/$PROJECT_NAME.dump --trunk=trunk/$PROJECT_NAME --branches=branches --tags=tags --tmpdir=/tmp/cvs2svn --encoding=windows-1252 $PROJECT_ROOT/$PROJECT_NAME/

sudo -u apache svnadmin load /srv/svn/repos/phoenix/ < /tmp/$PROJECT_NAME.dump

问题

我可以成功迁移第一个项目,但是到了第二个项目的时候,我显然会出现以下错误

svnadmin: E160020: File already exists: filesystem '70ce675a-1390-4203-9115-015d7d1d3a47', transaction '155-4b', path '/trunk'

显然因为,考虑到它,转储包含一个创建根trunk目录的事务,它与当前的存储库布局冲突:在T-0上,它&#39;空的;在T-1上,在导入项目1之后,它包含trunk,并且它不能演变为T-2,因为trunk已经存在。

问题

我想告诉svnadmin load它可以优雅地跳过存在的trunk目录的创建。我不是parent-dir旗帜的主人,但我认为它会在 parent-dir下创建所有内容,这就是我在上面显示的第一个布局中想要的内容。

您能提供有关执行此迁移的建议吗?

1 个答案:

答案 0 :(得分:3)

svnadmin load 始终在存储库中重新创建存储在dump中的整个树。 --parent-dir只允许更改&#34;挂载点&#34;加载时这棵树的根。 F.e - 转储/trunk/,加载--parent-dir somedir,将在新存储库中生成/somedir/trunk/...

在您的情况下,您至少有两种方式:

  • 使用--parent-dir将每个转储恢复到另一个干净的位置,稍后在附加修订中将子树移动到/trunk/component*(在所有加载之后,您可以通过跳过重复加载转储循环&#34;移动&#34 ;修订历史的修订)
  • 如果在单独的修订版中创建/trunk(仅限mkdir,未添加任何文件),则可以使用-r上的svnadmin load参数在加载时跳过此修订版:尝试阅读并理解dump-file的文本