我正在使用以下命令将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]也可以进行存储库转换。但我对此并不感兴趣;我想了解这个具体问题。
为什么同一个存储库的转换在不同的机器上失败,有哪些策略可以进一步调试呢?
答案 0 :(得分:0)
事实证明,Ubuntu机器已经存在该存储库的结帐,最初使用指定为<cvsroot>
的{{1}}进行检出。我使用的命令将其指定为<server>:/<path>/
,没有冒号。
CVS接受两种形式 - 有和没有冒号 - 但是在hg convert的cvsps.py中有一个特定的函数,它假设前者。如果最初在没有冒号的情况下检出存储库,则hg convert不能正确地从文件名中删除前缀。这最终会导致它使用错误的路径,正如我在错误消息中注意到的那样,当它试图下拉文件修订时。
所以它在Ubuntu机器上工作,因为它最初是用冒号检出的,随后使用非冒号形式的检出只是更新它而不改变/ CVS / Root的内容,hg转换读取的文件找到根。
我需要做的就是让其他机器正常运行,然后使用包含服务器和路径之间冒号的cvsroot来检查存储库。