Как мне исправить репозиторий с одной сломанной ревизией?

На моем домашнем сервере произошел сбой жесткого диска.

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

Однако, поскольку диск вышел из строя, одна из ревизий сломана:

$ svnadmin verify master/
[...]
* Verified revision 820.
* Verified revision 821.
* Verified revision 822.
svnadmin: No such revision 823

Каталоги master / db / revs / и master / db / revprops / действительно работают. , не содержат файлов с именем 823 , поэтому эта версия отсутствует (повреждена). В репозитории master / есть последующие версии (которые я действительно хочу сохранить!), Которые будут обновлены до версии №947.

Сегодня я загрузил свою последнюю резервную копию (!), Которая, к счастью, включает эту версию. Я хотел бы «исцелить» сломанный репозиторий в master / , исправив отсутствующую ревизию, поскольку она более свежая, чем резервная.

Я обязательно загрузил файл дампа во вновь созданный репозиторий. с той же версией, что и скопированный в master / , так что это весь старый "линейный" формат 3.

Я попробовал очевидное, просто скопировал файл 823 из резервные каталоги db / revs / и db / revprops / :

$ cp repos/db/revs/0/823 master/db/revs/
$ cp repos/db/revprops/0/823 master/db/revprops/

Каталог repos / содержит репозиторий, который был загружен из резервной копии. Теперь я получаю:

$ svnadmin verify master/
[...]
* Verified revision 821.
* Verified revision 822.
svnadmin: /build/buildd/subversion-1.6.12dfsg/subversion/libsvn_delta/compose_delta.c:165: search_offset_index: Assertion `offset < ndx->offs[ndx->length]' failed.
Aborted

Что не очень обнадеживает. Я пробовал различные другие команды svnadmin , но ни одна из них не порадовала проверяющего.

Моя следующая идея заключалась в том, чтобы отказаться от копирования и начать с «новой» копии сломанного репозитория, а затем сделать дамп из ревизий после 823 и объединить с резервной копией. Но это кажется невозможным, я не могу выгрузить ревизии после отсутствующей:

$ svnadmin dump -r 824 master/ >r824.dmp
svnadmin: No such revision 823

Обратите внимание, что это не помогает сделать дамп «инкрементным» в надежде, что это должно сделать вид, что мир начался с ревизии 824 и просто идите оттуда:

$ svnadmin dump --incremental -r 824:947 master/ > dump.txt
svnadmin: No such revision 823

Это действительно записывает вывод в dump.txt , но я не уверен, что на это можно положиться. Обратите внимание, что это не t log, что он успешно сбросил любую ревизию.

Обновление : У меня была другая идея: скопировать файлы более новой ревизии из копии сбойного диска в master / в резервную копию, чтобы обеспечить «недостающий хвост»:

$ for a in $(seq 910 947) ; do cp  master/db/revs/$a repos/db/revs ; cp master/db/revprops/$a repos/db/revprops/ ; echo $a ; done

Однако это, похоже, только повреждает целевой репозиторий:

$ svnadmin verify repos/
[...]
* Verified revision 907.
* Verified revision 908.
* Verified revision 909.
svnadmin: Corrupt representation '907 21815 45 30922 158d3e72732f45bf6f02919b22fc899a'
svnadmin: Malformed representation header

Теперь у меня кончились идеи.

37
задан unwind 8 April 2011 в 19:40
поделиться