Удалить все следы коммита SVN - PullRequest
24 голосов
/ 06 апреля 2011

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

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

Ответы [ 2 ]

27 голосов
/ 06 апреля 2011

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

7 голосов
/ 06 апреля 2011

См. Ответ в FAQ

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

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

Между тем, единственным выходом для вас является svnadmin сделать дамп хранилища, а затем передать дамп-файл через svndumpfilter (исключая неверный путь) в команду загрузки svnadmin.Подробнее об этом см. Главу 5 книги Subversion.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...