Восстановление поврежденного хранилища SVN - PullRequest
8 голосов
/ 13 января 2012

Я использую svnX (0.9.13) в Mac OS X Lion (10.7.2 11C74) и, похоже, у меня поврежденный SVN-репозиторий. Я искал на сайте похожие вопросы и нашел найдено a пара , но никто не описывает, как восстановить, когда вы не можете завершить извлечение из хранилища. У меня также нет обновленного рабочего каталога.

Конкретная ошибка:

svn: Несоответствие контрольной суммы при чтении представления:
ожидается: [хеш]
факт: [другой хеш]

Если оповещение отклонено (единственный вариант), оформление заказа будет продолжаться до конца. На первый взгляд, кажется, что большинство файлов там, но когда я запускаю приложение, становится ясно, что существует путаница версий. Репозиторий находится на USB-накопителе, который может быть источником повреждения. Я единственный пользователь, который имеет доступ к этим файлам, и они не были затронуты более недели и находились в рабочем состоянии.

Буду признателен за любые предложения о том, как поступить.

Ответы [ 2 ]

16 голосов
/ 16 января 2012

Если у вас есть поврежденный репозиторий, ваш единственный реальный шанс сохранить информацию - сделать дамп и загрузить.Если вам повезет, выполнение дампа и загрузки иногда исправит повреждение.

Если нет, вы можете использовать параметр -r <from>:<to> в дампе, чтобы пропустить неверные ревизии.Вы можете создать несколько файлов дампа и объединить их в один репозиторий, чтобы пропустить неверные номера ревизий.Я заметил, что каждый файл дампа начинается с полной ревизии хранилища с этой ревизией, и процесс дамп / загрузка обычно достаточно умен, чтобы не удваивать изменения.

На самом деле, я считаю, что вы даже можете поместить несколько дампов в один файл дампа без особых проблем.Далее следует пропустить ревизии 1001 и 1204, которые являются недействительными ревизиями:

$ svnadmin dump -r1:1000 my_repos > dumpfile.txt
$ svnadmin dump --incremental -r1002:1203 my_repos >> dumpfile.txt
$ svnadmin dump --incremental -r1205:HEAD my_repos >> dumpfile.txt
$ svnadmin load my_repos2 < dumpfile.txt

Существует несколько сценариев резервного копирования Subversion, которые выполняют резервное копирование репозитория путем получения дампов последних ревизий.Например, при первом запуске он выгружает все, начиная с первой ревизии и заканчивая последней версией (скажем, ревизия 1000).Затем, на следующий день, дамп ревизии 1001 до последней ревизии (скажем, 1003), а на следующий день, ревизии 1004 до последней ревизии.

Для восстановления необходимо восстановить все дампы, кроме резервной копиивремя должно быть короче, чем делать полный дамп каждый раз.

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

4 голосов
/ 11 марта 2017

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

Повреждение обычно происходит в отдельных файлах на некоторых ревизиях.Нам не нужно сбрасывать всю ревизию только потому, что в каком-то файле было несоответствие контрольной суммы.

Сначала мы попытаемся отключить вычисление контрольной суммы, удалив строки, совпадающие с Text-content-md5

svnadmin dump my_repo | sed '/^Text-content-md5/d' | svnadmin load second_repo

Инкрементальный подход позволяет нам исправлять ошибки и продолжать наш прогресс.Если во время дампа и загрузки произошла ошибка, найдите последнее сообщение --- Committed revision X >>> --- и укажите X + 1 в качестве начальной ревизии в качестве параметра -r и повторите попытку.Это экономит значительное время.

svnadmin dump --incremental -r1:100000 my_repo | sed '/^Text-content-md5/d' | svnadmin load second_repo

Или просто загрузите из файла дампа:

sed '/^Text-content-md5/d' dumpfile.txt | svnadmin load second_repo

Если этого было недостаточно, вы получаете сообщение об ошибке «Преждевременное завершение данных содержимого в дампстриме» или что-то подобное,Вы должны полностью исключить этот файл из дампа с помощью svndumpfilter:

svnadmin dump --incremental -r1:100000 my_repo | svndumpfilter exclude myproject/lib/thirdparty-all.jar | sed '/^Text-content-md5/d' | svnadmin load second_repo

Приведенная выше команда исключает файл myproject/lib/thirdparty-all.jar из дампа.

Дополнительная информация:

  • Вы можете добавить --bypass-prop-validation к команде svnadmin load.Это работает, если повреждение незначительное.
  • Исправлена ​​ошибка Dump stream contains a malformed header (with no ':') с добавлением
    | grep --binary-files=text -v '^* Dumped revision'
    к цепочке труб (до svnadmin load).

Надеюсь, этот пост будет полезен для некоторых людей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...