当我想发布它时,我终于找到了我的问题的答案!但是,我仍然会发布它,包括我的答案,以防它帮助其他人:
从 CVS 转换到 Subversion 时,某些文件 cvs2svn 失败并显示消息
"xxx is not a valid ,v file"
有什么问题?
事实证明,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);
}
}
}
}
就我而言,文件symbols
部分存在损坏。xxx,v
预期的格式是,但有以下情况:tag_name:tag_rev
:tag_rev
tag_name
tag_name
tag_name1:tag_name2:tag_rev
z
之间只有 1 位差异)。例如,通过将替换为 来修复。:
z
tag_nameztag_rev
z
:
为了在我的调查过程中提供帮助,我print
在cvs2svn_rcsparse\common.py
. 如果解析符号失败,则打印的最后一个标签就是原因。
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 记录它。
如果链接失效,总结是有人编辑了xxx,v
文件并且他们的编辑器用 0x0D/0x0A (CR/LF) 替换了 0x0A (LF),并且附加字符导致解析器认为文件已损坏。
我也有这样的错误。当我使用 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
解决此问题的一种方法是运行rcs log *file,v*
,这可能会为您提供一些见解。
就我而言,我有一些文件缺少@'s,一些文件缺少分号,并且我用来将旧存储库导入到 cvspserver 的工具抛出了一个未引用的版本。
祝你好运!