Удалить содержимое файла из истории SVN

У меня есть локальный svn-репозиторий на моем ПК, я использовал его для хобби-проекта, и он не должен был быть доступен никому, поэтому я отправлял файлы с паролями в них.

Сейчас я думаю о том, чтобы сделать хранилище доступным для других людей, и я не хочу, чтобы эти данные были там.

Есть ли способ сканировать репозиторий и заменить все пароли и данные учетной записи текстом, например "xxxxxxxxxx"?

5 ответов

Если вы делаете

svnadmin dump > mysvn

вы получите плоский файл всех данных всех ревизий в вашем хранилище. Оттуда вы сможете редактировать файл вручную (если ваш репо был значительного размера, вам может понадобиться редактор строк, например, pico, nano, vi и т. Д.).

Наконец, вы бы затем перезагрузили этот дамп в новый репозиторий. Это сохранит вашу историю вашего проекта.

svnadmin load /path/to/new/repo < mysvn

Эта практика будет считаться нет-нет в любой корпоративной среде, где вы проходите аудит и т. Д., Но для хобби-проекта это может помочь вам.

РЕДАКТИРОВАТЬ: мне пришлось сделать это, прежде чем пытаться объединить два разных хранилища вместе, поэтому потребовалось добавить новый "узел каталога" плоский файл. Я не уверен, что SVN хэширует файлы или изменения, чтобы определить, был ли он подделан.

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

То, что я сделал, - это то, что предложил Мэтт, сбросьте хранилище и отредактируйте его.

Для этого я использовал шестнадцатеричный редактор (khexedit) и заменил строку пароля строкой той же длины. Таким образом, мне не нужно обновлять поля размера.

Далее мне нужно обновить поля md5 с помощью хэша содержимого файла. Для этого я написал скрипт, который использовал вывод "svnadmin load", чтобы сгенерировать ошибку и получить старый и новый md5 из этой ошибки. Затем замените старый хеш на sed, а затем повторяйте до тех пор, пока ошибок не будет.

У меня была та же проблема, но не на code.google.com: я зарегистрировал некоторые файлы, которые не должны быть доступны через историю на googlecode, но я не хотел отбрасывать всю историю, после некоторого поиска, попытки, повторения и повторения мне это удалось. Ниже приведен рецепт, который работал для моего маленького проекта (6,5 МБ, 90 ревизий). Большая часть знаний пришла от googlecode, остальные - от svn redbook

Сначала создайте локальное репо, в которое вы загрузите репозиторий GoogleCode:

svnadmin create /tmp/your_local_repo

создать файл / tmp / isd_gc / hooks / pre-revprop-change с содержимым

#!/bin/bash
exit 0

сделать его исполняемым:

chmod +x /tmp/isd_gc/hooks/pre-revprop-change

если вы потерпите неудачу в этом разделе, вы, скорее всего, увидите ошибку: изменение Revprop заблокировано ловушкой pre-revprop-change (код выхода 255) без вывода.

Теперь вы можете запустить синхронизацию SVN с code.google.com.

svnsync init --username yourname@youremail file:///tmp/your_local_repo https://yourproject.googlecode.com/svn 

и начать загрузку всей истории:

svnsync sync --username  yourname@youremail file:///tmp/your_local_repo

Совершенная редакция 1.

Скопированные свойства для ревизии 1.

Передача файловых данных.......................

Скопированные свойства для ревизии 87.

Теперь мы создадим дамп-файл, который будет подан в svndumpfilter для удаления ненужных файлов.

svnadmin dump . > /tmp/tst_dump_gc.dmp

используйте svndumpfilter, чтобы удалить из него первый ненужный файл.

svndumpfilter exclude /trunk/unwanted file_1.jsvg < /tmp/tst_dump_gc.dmp > /tmp/tst_dump_clean1.dmp

Отбросил 1 узел:

'/ trunk / unwanted file_new.jsvg'

удалить второй нежелательный файл:

svndumpfilter exclude /trunk/unwanted file_2.jsvg < /tmp/tst_dump_clean1.dmp > /tmp/tst_dump_clean2.dmp

воссоздать "старый темп репо"

rm -rf /tmp/your_local_repo

svnadmin create /tmp/your_local_repo

загрузить отфильтрованный дамп в репо

[/tmp]$svnadmin load --ignore-uuid your_local_repo < /tmp/tst_dump_clean2.dmp

Убедитесь, что в клиенте svn все в порядке (проверка истории транка показывает только 25 первых результатов в моем клиенте svn).

svnsync sync --username yourname@youremail https://yourproject.googlecode.com/svn

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

Другие вопросы по тегам