cvs2svn завершается с ошибкой: «xxx не является допустимым файлом v»

StackOverflow https://stackoverflow.com/questions/773958

  •  13-09-2019
  •  | 
  •  

Вопрос

Наконец-то я нашла ответ на свой вопрос, когда хотела его опубликовать!Однако я все равно опубликую это, включая свой ответ, на случай, если это поможет кому-то еще:

При преобразовании из 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)

Дополнительная печать добавляет к выводу довольно много шума, поэтому, возможно, было бы лучше печатать только в случае возникновения исключения, но для моих нужд этого было достаточно.


Я также нашел эту ссылку, которая оказалась не моей проблемой, но может помочь кому-то другому.Спасибо Кристиану Хаарманну за документирование этого.

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 файл и его редактор заменили 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, добавил версию, на которую нет ссылок.

Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top