Как перенести кодовую базу из одного хранилища SVN в другое, сохраняя историю? - PullRequest
6 голосов
/ 29 марта 2010

У меня есть ветка в плохо структурированном репозитории svn, которую нужно удалить и перенести в другой репозиторий svn. (Я пытаюсь кое-что почистить).

Если я сделаю svn log, а не , остановлюсь на копировании / переименовании , я смогу увидеть все 3427 коммитов, которые меня интересуют. Есть ли какой-нибудь способ выкинуть ревизии, кроме написания основных скриптов?

Я бы следовал совету в этом вопросе , но эта ветвь была перемещена повсюду, и я хотел бы также сохранить ходы.

Ответы [ 4 ]

2 голосов
/ 30 марта 2010

Полагаю, это может быть похоже на значение @ZacThompson (и @Pekka): я думаю, svndumpfilter ваш друг.

От вашего вопроса, я думаю, у вас есть идея, что она должна делать, но бороться с копированием / перемещением ветки повсюду? Ответ на этот вопрос можно найти в упомянутой выше документации SVN , я полагаю:

Кроме того, скопированные пути могут дать вам некоторые беда. Subversion поддерживает копирование операции в хранилище, где новый путь создается путем копирования некоторых уже существующий путь. Это возможно что в какой-то момент в жизни ваш репозиторий, вы могли бы скопировать файл или каталог из какого-то места что svndumpfilter исключает местоположение, которое это включает. Делать данные дампа самодостаточны, svndumpfilter должен все еще показать добавление нового пути, включая содержимое любых файлов, созданных копировать - и не представлять это дополнение как копия из источника, который не будет существуют в ваших отфильтрованных данных дампа поток. Но потому что Subversion формат дампа репозитория показывает только то, что был изменен в каждой ревизии, содержимое источника копии может не быть легко доступным. Если вы подозреваете что у вас есть какие-либо копии такого рода в вашем хранилище, вы можете захотеть переосмыслить свой набор включенных / исключенных пути, возможно, включая пути что послужило источником вашего хлопотные операции копирования тоже.

Значение: make svndumpfilter включает все пути, в которых когда-либо существовала ветка. Или я что-то упустил?

Другой возможностью может быть svndumpfilter2, упомянутый @compie в теме, которую вы связали, хотя я полагаю, что в этом нет необходимости (и я не знаю ни @compie, ни svndumpfilter2).

1 голос
/ 30 марта 2010

Вы можете использовать некоторую комбинацию из:

  1. svnadmin dump
  2. svndumpfilter
  3. svnadmin load

Если вы хотитечтобы выполнить всю ветку, вам может даже не понадобиться svndumpfilter.Но если вы это сделаете:

http://svnbook.red -bean.com / nightly / en / svn.reposadmin.maint.html # svn.reposadmin.maint.filtering

0 голосов
/ 05 декабря 2012

Существует еще одно довольно простое решение, которое решает проблему "сохранить ходы" . См. Последний абзац записи часто задаваемых вопросов Apache Subversion «Как полностью удалить файл из истории репозитория?» . Решение не зависит от svndumpfilter.

Вы можете выполнить следующие шаги:

  1. Настройка авторизации на основе пути правила для запрета доступа на чтение для ИМЯ ПОЛЬЗОВАТЕЛЯ к ПУТИ файла или папку, которую вы хотите удалить из истории хранилища.

    Обратите внимание на существительное во множественном числе paths . Файл или папка, от которых вы хотите избавиться, могут иметь разные имена или могут находиться в разных местах в истории репозитория. Пожалуйста, учтите это при настройке запрещающих правил.

  2. Создать пустой репозиторий,

  3. Скопируйте исходный репозиторий с помощью инструмента svnsync в целевой репозиторий под учетной записью ИМЯ ПОЛЬЗОВАТЕЛЯ . Подробнее о синхронизации репозитория с svnsync см. Главу SVNBook «Репликация репозитория» .

В отличие от svndumpfilter, svnsync автоматически переводит операции svn copy с нечитаемым исходным путем в обычные дополнения, что полезно, если история включает операции копирования и все еще нуждается в фильтрации. :)

0 голосов
/ 29 марта 2010

Вам необходимо использовать HotCopy для резервного копирования каталога репозитория.Тогда нужно просто восстановить хранилище.

...