Да, но это не для слабонервных. Вы должны использовать svnadmin dump
и svnadmin load
для воссоздания вашего хранилища.
Если вы решите сделать это, первым шагом будет , чтобы остановить пользователей от фиксации и сделать резервную копию вашего хранилища. Я также рекомендую пройтись по шагам на копии вашего хранилища; Вы можете использовать rsync
, чтобы скопировать весь каталог репозитория во временный каталог и работать оттуда.
Для этих инструкций я собираюсь создать новый репозиторий во временном каталоге:
tmp, 502> svnadmin create example.repo
tmp, 503> svn co file://`pwd`/example.repo example
Checked out revision 0.
Я создал файл, содержащий четыре ревизии, третью из которых необходимо удалить:
example, 536> svn log test.txt
------------------------------------------------------------------------
r4 | kgregory | 2011-04-06 08:46:59 -0400 (Wed, 06 Apr 2011) | 1 line
post-bad commit
------------------------------------------------------------------------
r3 | kgregory | 2011-04-06 08:46:42 -0400 (Wed, 06 Apr 2011) | 1 line
bad revision
------------------------------------------------------------------------
r2 | kgregory | 2011-04-06 08:46:28 -0400 (Wed, 06 Apr 2011) | 1 line
good revision
------------------------------------------------------------------------
r1 | kgregory | 2011-04-06 08:46:02 -0400 (Wed, 06 Apr 2011) | 1 line
initial revision
------------------------------------------------------------------------
Итак, нам нужно вывести ревизии как до, так и после плохой версии, используя флаг -r
для указания диапазонов ревизий. Флаг --incremental
на втором дампе важен, потому что он скажет команде загрузки не создавать новый файл.
Обратите внимание, что я запускаю эти команды из того же каталога, в котором находится хранилище.
svnadmin dump -r 1:2 example.repo/ > pred.svndump
* Dumped revision 1.
* Dumped revision 2.
tmp, 552> svnadmin dump -r 4:4 --incremental example.repo/ > succ.svndump
* Dumped revision 4.
Теперь удалите исходный репозиторий и создайте пустой репозиторий с тем же именем:
tmp, 540> mv example.repo example.repo.bak
tmp, 541> svnadmin create example.repo
И импортировать содержимое файлов дампа.
tmp, 569> svnadmin --quiet load example.repo < pred.svndump
tmp, 570> svnadmin --quiet --ignore-uuid load example.repo < succ.svndump
Теперь скажите всем удалить их рабочие каталоги и проверить свежие. И вы должны увидеть следующий журнал:
example, 574> svn log test.txt
------------------------------------------------------------------------
r3 | kgregory | 2011-04-06 08:46:59 -0400 (Wed, 06 Apr 2011) | 1 line
post-bad commit
------------------------------------------------------------------------
r2 | kgregory | 2011-04-06 08:46:28 -0400 (Wed, 06 Apr 2011) | 1 line
good revision
------------------------------------------------------------------------
r1 | kgregory | 2011-04-06 08:46:02 -0400 (Wed, 06 Apr 2011) | 1 line
initial revision
------------------------------------------------------------------------
Существует одно ОГРОМНОЕ предостережение: этот процесс предполагает, что не было никаких изменений в файле с момента плохого принятия (т. Е. Дамп-преемник содержит только изменения в других файлах).
Если это не так, вы все равно можете удалить ревизию, но это намного больше работы. Вам необходимо создать новую регистрацию, содержащую чистую копию файла вместе с любыми другими файлами, которые были изменены с ним, когда он плохой. Затем создайте несколько дамп-файлов, исключая любые ревизии, содержащие неверный файл.
Наконец: я настоятельно рекомендую несколько пробных прогонов. Как видно из исторических номеров в моих примерах, я несколько раз облажался. Как я уже говорил в начале, хранилище Subversion легко скопировать во временный каталог. И когда вы делаете это, вы можете продолжать пытаться, пока не сделаете все правильно, а затем просто скопируйте исправленный репозиторий на место.