Удалить содержимое файла из истории SVN
У меня есть локальный svn-репозиторий на моем ПК, я использовал его для хобби-проекта, и он не должен был быть доступен никому, поэтому я отправлял файлы с паролями в них.
Сейчас я думаю о том, чтобы сделать хранилище доступным для других людей, и я не хочу, чтобы эти данные были там.
Есть ли способ сканировать репозиторий и заменить все пароли и данные учетной записи текстом, например "xxxxxxxxxx"?
5 ответов
Проверьте Subversion FAQ: Как мне полностью удалить файл из истории репозитория?
Если вы делаете
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
Проще всего было бы проверить содержимое репозитория, удалить всю конфиденциальную информацию, импортировать рабочий каталог в новый репозиторий и сделать его общедоступным. Весьма вероятно, что тот, кто будет использовать ваш проект, будет заинтересован в его текущем состоянии, а не в истории изменений.