Ответ 1
Да, но это не для слабонервных. Вы должны использовать 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
на втором дампе важен, потому что он скажет команде load не создавать новый файл.
Обратите внимание, что я запускаю эти команды из того же каталога, который хранит репозиторий.
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 во временный каталог. И когда вы это сделаете, вы можете продолжать пытаться, пока не получите это правильно, а затем просто скопируйте фиксированный репозиторий на место.