2009-08-19 5 views
4

Независимо от того, как я сюда попал, я могу восстановить репозиторий SVN из резервной копии. К сожалению, резервная копия была слегка повреждена, и из более чем 19000 исправлений примерно 80 потеряны. Резервная копия была файлом bzip2, и я смог использовать bzip2recover для восстановления около 99% блоков. Это «хорошо известно», так как они успешно распаковываются.svn recovery - восстановление отдельных версий

Поэтому я смог создать список известных хороших коммитов и потерянных коммитов.

Исходный репозиторий был также поврежден, но многие из файлов сохранились. К сожалению, репозиторий в целом сломан.

Так что мне посчастливилось иметь файлы из исходных каталогов db/revs и db/revprops для этих отсутствующих ревизий. Скорее всего, повреждение резервного файла bz2 не выравнивается с повреждением файлов db/revs.

Я перестроил все до r13892, но я знаю, что r13893 поврежден, поэтому у меня нет дампа для r13893. У меня есть файлы db/revs/13893 и db/revprops/13893 из исходного репозитория.

Я создал и восстановил репозиторий с помощью svn-1.4, но я обновил его до svn-1.6, чтобы использовать команду selective svnadmin verify (по одному или целому ряду коммитов).

Я подумал, что, возможно, я мог бы занести эти два файла в новый репозиторий, обновить db/current [1], а затем продолжить. Однако, когда я пытаюсь проверить, я получаю эту ошибку:

$ svnadmin verify new-svn 
* Verified revision 1. 
... 
* Verified revision 13889. 
* Verified revision 13890. 
* Verified revision 13891. 
* Verified revision 13892. 
svnadmin: Can't read file 'svn/db/revs/13214': End of file found 

Так что это явно не сработало. Не знаю, что здесь 13214.

Я отказался от возврата в svn-1.4.6 на всякий случай с чем-то необычным с 1.6. К сожалению, я получаю тот же результат - пересмотр 13893 не проверки:

... 
* Verified revision 13891. 
* Verified revision 13892. svnadmin: Can't read file 'svn/db/revs/13214': 
End of file found 

Так вот что я знаю:

  • Я знаю, что изменения 1 к 13892 являются 100% правильно (если не по какой-то крайне маловероятно шанс блок bz2 неправильно распакован, но передал контрольную сумму).
  • Я не знаю, являются ли файлы r13893 из оригинального репозитория SVN в порядке - они могут быть повреждены, но количество коррупции было настолько маленьким, что маловероятно (но возможно).

Есть ли у кого-нибудь идеи, как я мог бы заполнить это отверстие? Обратите внимание, что у меня есть 100% -ый уверенный в себе r13894, поэтому, если я смогу подключить r13893, я могу продолжить работу с остальной частью восстановления.

[1] Я обновил дб/тока с помощью этого сценария: http://svn.haxx.se/users/archive-2005-12/att-0630/make-current-fix.py

Я испытал это на некоторых других репозиториев SVN (! После отключения записи в дБ/ток), чтобы убедиться, что она производила то же значение как это уже есть. Оно делает.

ответ

2

По этому поводу:

svnadmin: Can't read file 'svn/db/revs/13214': End of file found 

Я подозреваю, что оборот 13893 ссылается что-то из оборотов 13214 (например, копирование файлов, или пропуском оборотов вещи, или что-то).

При выполнении загрузки svn новые версии соответствовали оригинальным версиям? Я помню, что я столкнулся с ситуацией, когда мой дамп ссылался на rev 0, и он загрузился как rev 1. Если что-то подобное происходит здесь, обратная ссылка на rev 13214 будет отключена на единицу.

Вы можете попробовать использовать файлы из резервной базы данных, чтобы создать недостающий оборот в формате дампа. К сожалению, я не знаю инструмента, который это сделает. Но я бы рекомендовал посмотреть на SvnDumpTool; он может манипулировать свалками svn множеством полезных способов.

Раскрытие: Я способствовал svndumptool в прошлом

+0

Да, в верхней части r13893 он говорит: DELTA 13214 0 12567271 Так что это треугольник на вершине 13214, который объясняет, где что приходит из. Одна вещь, которую я замечаю, что мой восстановленная двоичная совершает (в дБ/оборотах) начать с этого: СВН^A^@^@<86>^@ Но мои оригинальные r13893 фиксации выглядит так: СВН^@^@<86> ^@ Обратите внимание на первый байт после того, как «SVN» есть^@ (00) в старой фиксации, но^A (01) в новых коммитах. Это номер версии xdelta? Возможно, мне нужно перестроить 1 до 13892 с версией subversion, которая использует тот же формат xdelta? – meowsqueak

+0

Я не знаю о^@ vs^A. Но при загрузке дампа он должен рассказать вам, что такое исходный номер rev, и каков был новый номер rev. Соответствуют ли эти два номера? – retracile

+1

Да, эти числа соответствуют. Я решил эту проблему на самом деле - это было потому, что я создал новое репо с 1.4, но старые файлы были созданы с 1.3, поэтому формат xdelta был другим. Я снова начал с svn-1.3, и эта проблема теперь решена. К сожалению, svnadmin segfaults позже, так что все не очень хорошо ... – meowsqueak

Смежные вопросы