На моем домашнем сервере произошел сбой жесткого диска.
Как только я понял, что диск уходит, я вошел в систему и сделал прямую копию своего репозитория, который содержит несколько проектов.
Однако, поскольку диск вышел из строя, одна из ревизий сломана:
$ 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
, но я не уверен, что на это можно положиться. Обратите внимание, что он не записывает, что он успешно сбросил любую ревизию.
Обновление: у меня возникла другая идея: скопировать файлы более новой ревизии из копии аварийного диска в 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
Теперь у меня закончились идеи.