我将旧的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
下创建所有内容,这就是我在上面显示的第一个布局中想要的内容。
您能提供有关执行此迁移的建议吗?
答案 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的文本