CVS转换为SVN并重新组织分支

6
我是从现有的CVS存储库转换到SVN存储库。CVS存储库有几个分支,我想在转换时重命名这些分支。
期望的转换如下:
CVS branch         SVN branch
HEAD       ->      branches/branchX
branchA    ->      trunk
branchB    ->      branches/branchB
branchC    ->      branches/branchC

也就是说,CVS HEAD 变成了一个普通的分支,而 CVS branchA 变成了 SVN trunk。

同时,CVS 和 SVN 存储库将位于同一台 Linux 机器上。

这个怎么做呢?

另外,将 CVS branchA 转换为 SVN trunk 并忽略所有其他 CVS 分支可能已经足够了。

7个回答

9
我特别关注保留提交历史。如果我在转换后重命名和移动SVN中的分支,历史记录会被保留吗?
是的。Subversion还跟踪目录结构的更改,并且即使文件在树中移动,所有版本历史记录也会被保留。
我建议使用cvs2svn将存储库转换,包括分支和标签。一旦存储库位于Subversion中,您可以随意移动分支和标记。这还保留了实际标记和分支重命名的历史记录,在以后的历史背景下可能很有趣。

我正在使用cvs2svn,但我只想转换特定的分支和HEAD,但是cvs2svn只有"排除"分支而没有"包括"的功能。那么我该如何转换HEAD以及另一个分支? - Oded
我猜你可以把所有的内容都倒出来,然后使用 svndumpfilter 过滤掉你不需要的部分? - Anders Sandvig
我认为svndumpfilter不会删除未提及的分支。 你知道其他的解决方案吗? - Oded
不确定您所说的“未提及的分支”是什么意思,但svndumpfilter具有--include和--exclude参数。如果您告诉cvs2svn将“/ trunk”,“/ branches”和“/ tags”用作根文件夹,则可以使用'svndumpfilter --include“/ trunk”--include“/ branches / <branch-name>”'来提取主干(CVS中的HEAD)和特定分支。 - Anders Sandvig

5

我已经有一段时间没有进行CVS -> SVN转换了,可能更长时间没有使用过非平凡分支结构的转换。由于SVN可以相当轻松地移动目录树,因此您可以先完成整个转换,然后在SVN中完全解决主干/分支结构。

如果您确实到达该点,并在SVN中移动整个目录树,则最好在每个树重命名/移动步骤之后提交。这只是要记住的一些事情。


1

在转换后移动主干和分支目录是可能的,但这将需要一个明确的后转换 SVN 提交,该提交将保留在您的 SVN 历史记录中,使历史记录探索变得更加复杂。

但是,您确实可以告诉 cvs2svn 将主干和分支存储到您想要的 SVN 路径中,方法是使用 --symbol-hints=symbol-hints.txt 命令行选项或(如果您正在为转换使用选项文件)SymbolHintsFileRule('symbol-hints.txt') 符号策略规则,其中 symbol-hints.txt 是一个包含以下行的文件:

. .trunk. trunk branches/branchX .
. branchX branch trunk .

请注意,由cvs2svn自动生成的某些提交消息(例如用于创建分支的消息)可能会提及原始分支名称。

1

尽管在转换完成后移动分支是可能的,但最好设置cvs2svn配置文件以指定您现有分支的确切名称。其中一个好处是FishEye将更好地理解输出。


1

一些额外的信息来支持被接受的答案:

cvs2svn 不允许从主干转换到分支或从分支转换到主干

因此,在转换为 svn 后移动东西是最好的方法。


1

Subversion分支是目录,因此在导入完成后,您可以将分支移动到其他位置而不会丢失任何历史记录。


0

我特别关注保留提交历史。如果我在转换后重命名和移动SVN中的分支,历史记录是否会被保留?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接