Как исправить репозиторий с одной неработающей ревизией?

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

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

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

$ 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

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


person unwind    schedule 04.04.2011    source источник
comment
Начинаю думать, что, возможно, это было лучше обслужить на одном из других сайтов StackExchange, но, похоже, здесь было много похожих вопросов.   -  person unwind    schedule 07.04.2011
comment
Ничего страшного, вопросы об инструментах контроля версий здесь - честная игра. В FAQ упоминаются программные инструменты, обычно используемые программистами, а контроль версий редко используется в других областях (по крайней мере, непрограммистами).   -  person R. Martinho Fernandes    schedule 09.04.2011
comment
О восстановлении поврежденных репозиториев я только что нашел очень интересную статью: spin .atomicobject.com / 2015/10/06 / svn-коррупция-восстановление   -  person AFract    schedule 25.08.2016


Ответы (1)


Я решил это.

Решение было (конечно) очевидным, как только я его осознал.

У меня было такое:

  • master/: Копия поврежденного репозитория с ревизией 0..947 с физически отсутствующими файлами ревизии 823.
  • repos/: Репозиторий, загруженный из резервной копии (файл дампа), относящийся к ревизии 0..910.

Решением было просто сделать дамп с master/, с ревизии 911 и далее. Это было возможно без каких-либо ошибок, что, как я понимаю, означает, что ни одна из ревизий в диапазоне 911..947 напрямую не зависела от состояния в ревизии 823 или чего-то еще:

$ svnadmin dump --incremental -r 911:947 master/ > tail.txt
* Dumped revision 911.
* Dumped revision 912.
* Dumped revision 913.
[...]
* Dumped revision 947.

В любом случае, тогда просто примените дамп к репозиторию из резервной копии:

$ cat tail.txt | svnadmin load repos/
[lots of commits]

И теперь у меня восстановлена ​​полная история, без проблем:

$ svnadmin verify repos/
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
[...]
* Verified revision 945.
* Verified revision 946.
* Verified revision 947.

Ура!

person unwind    schedule 08.04.2011