多项目布局中的逐步 cvs2svn 迁移

Posted

技术标签:

【中文标题】多项目布局中的逐步 cvs2svn 迁移【英文标题】:Gradual cvs2svn migration in multiproject layout 【发布时间】:2014-02-11 11:59:07 【问题描述】:

我的公司目前为其所有项目使用两个独立的 CVS 存储库。

我的老板选择在一个条件下迁移到 SVN:迁移必须是渐进的,并且必须至少造成停机时间。

鉴于我将保留多存储库结构(因此客户软件转到 repo1,内部软件转到 repo2,即使这种区别不是严格必要的),我想问是否可以定期提名 一个用于从 CVS 迁移到 SVN 并将其迁移到现有存储库的项目。

让我解释得更好。为简单起见,举一个仅涉及一个 repo 的示例。

第 0 天:SVN 存储库初始化 第 1 天:新项目(称为 P)启动,开发人员提交到 SVN 存储库 第 2 天:不再开发的旧项目 A 是迁移的候选对象。所有开发人员都同意提交对 CVS 的最新修改,并在迁移后使用 SVN(如果他们需要) 第 3 天:循环从第 1 步或第 2 步开始重复

通常,cvs2svn 可以生成一个转储文件(我已经做了几次成功的尝试),可以使用svnadmin load 将其导入到一个空的存储库中。通常cvs2svn 可用于为一个或多个选定项目生成转储(有一些关于它的教程,都运行成功)。

把它们放在一起

因为我可以随时为任何选定的 CVS 项目集生成转储,比如 A、B、C,我可以(以及如何)使用这些转储将这些修订追加到 SVN 存储库项目,比如 P 和 Q,是否已经存在?

澄清:我希望文件系统布局看起来像

/svnroot
    /projectA
        /branches
        /tags
        /trunk
    /projectX
        /branches
        /tags
        /trunk

【问题讨论】:

【参考方案1】:

我打算给你一个稍微简短的回答,指出你想要的内容记录在 cvs2svn 常见问题解答中。但后来我意识到我在几年前删除了常见问题解答条目的那部分(我的错误,对不起!)。所以我只是added it back to the FAQ,为了你和后代。

想法是将每个项目转换为转储文件,将其主干、分支和标签目录放置在您希望它们结束的位置:

cvs2svn --dumpfile=/tmp/projectA.dump \
        --trunk=projectA/trunk \
        --branches=projectA/branches \
        --tags=projectA/tags \

然后将转储文件加载到现有的 Subversion 存储库中:

svnadmin load /svnroot </tmp/projectA.dump

使用转储文件进行后续迁移的优势在于,Subversion 存储库只需在 svnadmin load 期间脱机,而不是在 cvs2svn 运行的整个时间内脱机。

【讨论】:

【参考方案2】:

由于我可以随时为任何选定的 CVS 项目集生成转储,比如 A、B、C,我可以(以及如何)使用这些转储将这些修订附加到项目所在的 SVN 存储库,比如 P 和 Q,已经存在?

是的,因为

a) 创建转储只是执行 cvs2svn 的可能结果之一(其他是直接导入转换后的 repo)

b) 导入额外的不相交转储不会覆盖存储库中的旧数据

c)cvs2svn docs 明确指出:

--existing-svnrepos 将转换后的 CVS 存储库加载到现有的 Subversion 存储库中,而不是创建新的存储库。 (这 选项应与 -s/--svnrepos 结合使用。) 存储库必须为空或不包含与 那些将由转换产生的。请注意,您需要 存储库文件的写入权限。

(即您不能从主干中从转储到现有主干进行修订,但可以 - 到分支,如果它们之前不存在)

【讨论】:

... 因为我确信项目有不同的名称,所以它们的路径永远不会重叠!几天后我会在测试机上进行空运行时接受它

以上是关于多项目布局中的逐步 cvs2svn 迁移的主要内容,如果未能解决你的问题,请参考以下文章

maven 多模块项目如何包含 gradle 子项目?

使用 svn 和 maven 的多产品项目布局

Flyway 在 Maven 多模块项目中找不到迁移

如何使用 cvs2svn 工具从 CVS 迁移到 SVN?

cvs2svn迁移后的svn合并问题

多模块 Gradle 项目 - 从 Spring-Boot 1.5 迁移到 2.1