1

我正在使用以下命令将 CVS 存储库转换为 Mercurial:

cvs -d :pserver:<user>@<cvsroot> mymodule
hg convert mymodule

在 Ubuntu 12.04 机器上,这可以工作,并生成一个有效的 Mercurial 存储库。在 Fedora 17 机器上它花了一些时间工作,然后失败并出现以下错误:

...
38000 <commit message>
37930 changeset entries
sorting...
converting...
37929 Initial Checkin.
cvs server: cvs checkout: cannot find module `mymodule/<cvsroot>/<some file>` - ignored
abort: unknown CVS response: error

编辑:起初我忽略了这一点,但它找不到的路径有点有趣;它由模块名称后跟 CVSROOT 和实际路径组成。

两台机器都有相同的 .hgrc 文件并且都运行 CVS 1.12.13。唯一似乎相关的环境变量是 CVSROOT,它在两台机器上都是相同的,并且设置为与我<cvsroot>上面的占位符相同的值。

每次产生错误的文件都是相同的,但它是一个完全正常的文件;我无法识别任何将它与任何其他文件区分开来的东西。

为了清楚起见,我知道我可以简单地使用工作机器,并且我知道还有许多其他工具,例如 cvs2svn[hg] 也可以进行存储库转换。但我对此不感兴趣;我想了解这个具体问题。

为什么同一存储库的转换在不同的机器上会失败,有哪些进一步调试的策略?

4

1 回答 1

0

事实证明,Ubuntu 机器有一个对该存储库的现有签出,该存储库最初是使用<cvsroot>指定为<server>:/<path>/. 我使用的命令将其指定为<server>/<path>/,不带冒号。

CVS 接受这两种形式——带和不带冒号——但是在 hg convert 的 cvsps.py 中有一个特殊的函数假定前者。如果最初签出存储库时没有冒号,则 hg convert 不会正确地从文件名中去除前缀​​。这最终导致它使用错误的路径,正如我在错误消息中注意到的那样,当它尝试下拉文件修订时。

所以它可以在 Ubuntu 机器上运行,因为它最初是用冒号签出的,随后使用非冒号形式的签出只是在不更改 /CVS/Root 的内容的情况下更新它,hg convert 读取该文件以查找根。

为了让另一台机器正常工作,我所要做的就是 rm 存储库并使用在服务器和路径之间包含冒号的 cvsroot 将其检查干净。

于 2012-10-23T21:16:29.403 回答