cvs2svn 失败并显示“xxx 不是有效的 .v 文件”

Posted

技术标签:

【中文标题】cvs2svn 失败并显示“xxx 不是有效的 .v 文件”【英文标题】:cvs2svn fails with "xxx is not a valid ,v file" 【发布时间】:2009-04-21 18:30:04 【问题描述】:

当我想发布问题时,我终于找到了答案!但是我仍然会发布它,包括我的答案,以防它帮助其他人:

从 CVS 转换到 Subversion 时,某些文件 cvs2svn 失败并显示消息

"xxx is not a valid ,v file"

有什么问题?

【问题讨论】:

【参考方案1】:

事实证明,CVSNT 忽略了 cvs2svn 需要它们的某些文件中的最后一个 0xa。这可以通过以下 c# 代码轻松解决:

static void Main(string[] args)

  foreach (string file in Directory.GetFiles(args[0], "*,v", SearchOption.AllDirectories))
  
    using (FileStream sin=File.Open(file, FileMode.Open, FileAccess.ReadWrite))
    
      sin.Position=sin.Length-1;
      if (sin.ReadByte()==0x40)
      
        Console.WriteLine("fixed "+file);
        sin.WriteByte(0xa);
      
    
  

【讨论】:

【参考方案2】:

就我而言,xxx,v 文件的symbols 部分存在损坏。预期格式为<i>tag_name</i>:<i>tag_rev</i>,但有以下实例:

缺少:<i>tag_rev</i>例如<i>tag_name</i>已通过删除该行修复。 多个<i>tag_name</i>例如<i>tag_name1</i>:<i>tag_name2</i>:<i>tag_rev</i>已通过删除第二个标签名称修复(您删除的可能取决于它们的名称)。 名称/修订分隔符无效。在我的情况下,无效字符始终为 z(ASCII :z 之间只有 1 位差异)。例如<i>tag_name</i>z<i>tag_rev</i>已通过将 z 替换为 : 进行修复。

为了在我的调查过程中提供帮助,我在cvs2svn_rcsparse\common.py 中添加了print 行。如果解析符号失败,最后打印的标签就是原因。

def _parse_admin_symbols(self, token):
while 1:
  tag_name = self.ts.get()
  # WileCau print the token and tag_name
  print 'token=|%s| tag_name=|%s|' % (token, tag_name)
  if tag_name == ';':
    break
  self.ts.match(':')
  tag_rev = self.ts.get()
  self.sink.define_tag(tag_name, tag_rev)

额外的打印给输出增加了很多噪音,所以只在发生异常时打印可能会更好,但这已经足够满足我的需要了。


我还发现这个链接原来不是我的问题,但可能对其他人有帮助。感谢 Christian Haarmann 记录它。

http://tigris-scm.10930.n7.nabble.com/suggestions-for-cvs2svn-fix-for-error-quot-myfile-txt-v-is-not-a-valid-v-file-quot-td54240.html

万一链接失效,总结是有人编辑了xxx,v文件,他们的编辑器用0x0D/0x0A(CR/LF)替换了0x0A(LF),额外的字符导致解析器认为文件已损坏。

【讨论】:

【参考方案3】:

我也有这样的错误。当我使用 cvs2git 将 cvs 存储库迁移到 git 时,多个文件会出现此错误。我检测到文件末尾缺少结束 0x40 (@)

所以我的解决方案是:

1. Open the corrupted cvs-history-file e.g. with vim (maybe in binary mode)
2. Add the missing @

如果这不能解决问题,则将损坏文件的内容与 RCS 文件格式进行比较:rcs_man_page

【讨论】:

【参考方案4】:

解决此问题的一种方法是运行rcs log *file,v*,这可能会为您提供一些见解。

在我的例子中,我有一些文件缺少 @'s,一些文件缺少分号,并且我用来将旧存储库导入 cvspserver 的工具抛出了一个未引用的版本。

祝你好运!

【讨论】:

以上是关于cvs2svn 失败并显示“xxx 不是有效的 .v 文件”的主要内容,如果未能解决你的问题,请参考以下文章

使用cvs2svn迁移cvs至svn

cvs2svn:将存储库转换并放置到现有 SVN 存储库的子目录中

格式字符串 XXX 不是有效的格式字符串,因此不应将其传递给 String.format

问:Symfony2 - Doctrine - Class xxx 不是有效的实体或映射的超类

cvs2svn 迁移

cvs2svn 2.3.0 在第 16 阶段崩溃