Как перенести кодовую базу из одного хранилища SVN в другое, сохраняя историю?
У меня есть ветка в плохо структурированном репозитории SVN, которую нужно удалить и перенести в другой репозиторий SVN. (Я пытаюсь почистить).
Если я сделаю svn log
и не останавливаясь на копировании / переименовании, я вижу все 3427 коммитов, которые меня волнуют. Есть ли какой-нибудь способ выкинуть ревизии, кроме написания некоторых основных скриптов?
Я бы последовал совету в этом вопросе, но эта ветвь была перемещена повсюду, и я хотел бы также сохранить ходы.
4 ответа
Я думаю, это может быть похоже на то, что означают @ZacThompson (и @Pekka): я думаю, svndumpfilter
твой друг.
От вашего вопроса, я думаю, у вас есть идея, что это значит, но бороться с копированием / перемещением ветки повсюду? Ответ на это можно найти в вышеупомянутой документации SVN, я считаю:
Кроме того, скопированные пути могут вызвать некоторые проблемы. Subversion поддерживает операции копирования в хранилище, где создается новый путь путем копирования уже существующего пути. Возможно, что в какой-то момент времени существования вашего репозитория вы могли скопировать файл или каталог из некоторого местоположения, которое исключает svndumpfilter, в местоположение, которое оно включает. Чтобы сделать данные дампа самодостаточными, svndumpfilter должен по-прежнему показывать добавление нового пути, включая содержимое любых файлов, созданных копией, и не представлять это дополнение как копию из источника, которого не будет в вашем файле. поток данных отфильтрованного дампа. Но поскольку формат дампа хранилища Subversion показывает только то, что было изменено в каждой ревизии, содержимое источника копирования может быть недоступно. Если вы подозреваете, что у вас есть какие-либо копии такого рода в вашем хранилище, вы, возможно, захотите переосмыслить свой набор включенных / исключенных путей, возможно, включая пути, которые также служили источниками ваших проблемных операций копирования.
Значение: сделать svndumpfilter
включите все пути, в которых когда-либо жил филиал. Или я что-то упустил?
Другая возможность может быть svndumpfilter2
упоминается @compie в теме, которую вы связали, хотя я считаю, что это даже не нужно (и я не знаю ни @compie, ни svndumpfilter2
).
Вы хотите использовать некоторую комбинацию:
- свадмин свалка
- svndumpfilter
- свнадмин нагрузка
Если вы хотите выполнить всю ветку, вам может даже не понадобиться svndumpfilter. Но если вы делаете:
http://svnbook.red-bean.com/nightly/en/svn.reposadmin.maint.html
Есть еще одно решение, которое довольно просто и решает проблему "сохранить ходы". См. Последний абзац записи FAQ по Apache Subversion: "Как полностью удалить файл из истории репозитория?", Решение не опирается на svndumpfilter
,
Вы можете выполнить следующие шаги:
Настройте правила авторизации на основе пути, чтобы запретить доступ на чтение для учетной записи USERNAME к PATHS файла или папки, которую вы хотите удалить из истории репозитория.
Пожалуйста, обратите внимание на множественные существительные пути. Файл или папка, от которых вы хотите избавиться, могут иметь разные имена или могут находиться в разных местах в истории репозитория. Пожалуйста, учтите это при настройке запрещающих правил.
Создать пустой репозиторий,
Скопируйте исходный репозиторий с
svnsync
Инструмент для целевого хранилища под учетной записью USERNAME. Для получения подробной информации о синхронизации хранилища сsvnsync
пожалуйста, обратитесь к главе SVNBook "Репликация репозитория".
В отличие от svndumpfilter
, svnsync
автоматически переводит svn copy
операции с нечитаемым исходным путем в обычные дополнения, что полезно, если история включает операции копирования и все еще нуждается в фильтрации.:)
Вам необходимо использовать HotCopy для резервного копирования каталога репозитория. Тогда нужно просто восстановить хранилище.