从 CVS 重新导入到 Subversion
Posted
技术标签:
【中文标题】从 CVS 重新导入到 Subversion【英文标题】:Re-importing from CVS into Subversion 【发布时间】:2010-10-21 08:17:02 【问题描述】:我要解决的问题与Subversion out of sync with production code, easiest way to update subversion 没有什么不同,但有些不同。
我将一个 (Java) 项目从 CVS 转换为 SVN(使用 cvs2svn,保留完整的历史记录) - 比如版本 1.00
2.00 版的开发继续使用 SVN 中的代码。
同时,在 CVS 中进行了一些修复(因为开发工具设置不同。)
现在,我需要做的是有效地从 CVS 重新导入项目的一部分。
如果我有
cvs:project/module1 (version 1.00)
/module2 (version 1.10)
和
svn:project/trunk/module1 (version 2.xx)
/module2 (Version 1.00)
有没有办法从 CVS 重新导入 module2 并保留完整的历史记录?
我在 CVS 存储库上再次运行 cvs2svn,并将其作为另一个项目加载到 SVN,然后进行毫无根据的合并 - 但我不确定这是否是个好主意。
我将继续在 SVN 中维护 1.xx 版本。
【问题讨论】:
【参考方案1】:您可以将当前的 CVS 存储库转换为新的虚拟 SVN 存储库。使用它,您可以挑选修订版以转储并将这些转储重播回真正的 SVN 存储库。 (我不知道这将如何处理在真实 SVN 和 CVS/虚拟 SVN 中更改相同文件的情况。您可能希望通过将精选的转储重播到特定的转储来避免发现这一点分支。)
不过,可能有更好的方法,但这可能根本行不通。我只将一个 CVS 存储库转换为 SVN 存储库,这是一项一次性完成的任务。因此,请先将其与大量盐混合,然后先在副本上空运行。
【讨论】:
这听起来很痛苦,我担心导入转储的可追溯性。 @exception:“可追溯”是什么意思? 保留历史记录。我目前正在尝试考虑合并 V1.x 中在原始迁移到 SVN 之后所做的特定更改列表,或者我实际上可能只是简单地复制整个模块。 @exception:我现在记得,在 CVS 到 SVN 的转换完成之前,一些测试项目是在一个临时 SVN 存储库中启动的。与此类玩具项目通常的情况一样,它超出了其初衷,并显示出一切成为真实事物的迹象。由于我们不想丢失它的历史,而不是仅仅将它的导出版本添加到 SVN 存储库,我们从玩具存储库创建了一个转储,并将其导入到真实 SVN 存储库的特定文件夹下。我记得第一次尝试在沙盒中。不确定是否一切都很好,但它一定很容易解决...... ...因为我不记得有任何问题。它真的成长为一个成熟的项目,现在已安装在几个客户处。历史就在那里,直到第一次签入,最初发生在不同的仓库中。【参考方案2】:由于我还将在 SVN 中维护 1.xx 版本,并且我知道代码在什么时候出现分歧,所以我应该只能合并迁移到 SVN 后创建的变更列表。 这看起来会让事情保持最整洁。
我现在正在试验。
【讨论】:
这会导致太多的冲突,除非我非常小心地选择变更列表的范围。【参考方案3】:从您引用的版本号看来,module1 上的所有转换后提交都在 Subversion 中,而 module2 上的所有转换后提交都在 CVS 中。如果是这种情况,您可以尝试以下方法:
再次转换整个 CVS 项目,使用与以前相同的 cvs2svn 选项。如果幸运的话,生成的 Subversion 存储库的 r0:rN(其中 N 是某个数字)将与第一次转换产生的 Subversion 存储库的重叠部分一致。在这种情况下,您应该能够从新的 Subversion 存储库中“svnadmin dump --incremental -rN:HEAD”并在旧的 Subversion 存储库上“svnadmin load”它。组合存储库中的提交不会按时间顺序排列,但这是一个小麻烦(可能会使用其他一些工具来修复,但代价是重新编号 Subversion 提交)。
(Subversion 存储库的重叠部分不一定相同;cvs2svn 使用一些启发式方法来推断变更集,并且它们的推断可能因其他更改而不同。但只要有可识别的“1.00”修订版在具有相同内容的每个存储库中,那么我认为该过程应该可以工作。)
在您尝试之前进行备份!
【讨论】:
以上是关于从 CVS 重新导入到 Subversion的主要内容,如果未能解决你的问题,请参考以下文章
phpmyadmin 导入 cvs文件,出现中文乱码,如何解决?