Удалить все следы выполнения SVN

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

Есть ли способ, с полными правами администратора, удалить все следы этой фиксации? Я не говорю о возврате или удалении, что, очевидно, сохранит пароль в истории файлов.

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

Ответ 2

См. ответ на FAQ

Существуют специальные случаи, когда вы можете уничтожить все доказательства файла или совершить. (Возможно, кто-то случайно передал конфиденциальный документ.) Это не так просто, потому что Subversion намеренно предназначена для того, чтобы никогда не потерять информацию. Перемены - это неизменные деревья, которые строится друг на друге. Удаление ревизии из истории приведет к эффекту домино, создающему хаос во всех последующих версиях и, возможно, недействительным все рабочие копии.

У проекта есть планы, однако, когда-нибудь реализовать команду стирания svnadmin, которая выполнит задачу по постоянному удалению информации. (См. Вопрос 516.)

Тем временем ваш единственный ресурс заключается в том, чтобы svnadmin удалил ваш репозиторий, а затем подключил dumpfile через svndumpfilter (исключая неправильный путь) в команду загрузки svnadmin. Подробнее об этом читайте в главе 5 книги Subversion.