2

上下文

我正在将旧的 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 上,它是空的;在 T-1 上,导入项目 1 后,它包含trunk,由于trunk 已经存在,它不能进化到 T-2。

问题

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

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

4

1 回答 1

3

svnadmin load 总是重新创建整个树,存储在转储中,在存储库中。--parent-dir只允许在加载时更改此树的根的“安装点”。Fe - 转储/trunk/,加载--parent-dir somedir,将/somedir/trunk/...在新存储库中生成

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

  • 使用 将每个转储恢复到另一个干净的位置--parent-dir,稍后将子树移动到/trunk/component*其他修订版中(在所有加载之后,您可以重复加载-转储循环,跳过“移动”修订版以获得抛光历史)
  • 如果/trunk在单独的修订版中执行创建(仅 mkdir,未添加文件),您可以在加载时跳过此修订版,使用-r参数 on svnadmin load:尝试阅读和理解转储文件的文本
于 2014-09-17T12:58:45.430 回答