cvs2svn завершается с ошибкой: «xxx не является допустимым файлом v»
Вопрос
Наконец-то я нашла ответ на свой вопрос, когда хотела его опубликовать!Однако я все равно опубликую это, включая свой ответ, на случай, если это поможет кому-то еще:
При преобразовании из CVS в Subversion cvs2svn не удалось выполнить некоторые файлы с сообщением
"xxx is not a valid ,v file"
В чем проблема?
Решение
Как оказалось, CVSNT пропускает последние 0xa из некоторых файлов, где они нужны cvs2svn.Это можно легко исправить с помощью следующего кода 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_rev
, но были случаи:
- Отсутствующий
:tag_rev
напримерназвание тэга
Исправляется удалением строки. - Несколько
название тэга
напримеримя_тега1:имя_тега2:tag_rev
Исправлено путем удаления второго имени тега (вероятно, какое из них удалить, зависит от того, что это такое). - Недопустимый разделитель имени/версии.В моем случае недопустимый символ всегда был
z
(разница между ASCII-кодами составляет всего 1 бит.:
иz
).
напримерназвание тэгаztag_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)
Дополнительная печать добавляет к выводу довольно много шума, поэтому, возможно, было бы лучше печатать только в случае возникновения исключения, но для моих нужд этого было достаточно.
Я также нашел эту ссылку, которая оказалась не моей проблемой, но может помочь кому-то другому.Спасибо Кристиану Хаарманну за документирование этого.
В случае, если ссылка станет недействительной, в сводке будет указано, что кто-то отредактировал ссылку. xxx,v
файл и его редактор заменили 0x0A (LF) на 0x0D/0x0A (CR/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*
, что может дать вам некоторое представление.
В моем случае в некоторых файлах отсутствовали символы @, в некоторых файлах отсутствовала точка с запятой, а инструмент, который я использовал для импорта моего старого репозитория на cvspserver, добавил версию, на которую нет ссылок.
Удачи!