среда, 24 марта 2010 г.

Перенос проектов между SVN хранилищами

Так исторически сложилось, что многие мои проекты, в том числе и рабочие , раскиданы по нескольким разным svn хранилищам. Вчера было решено это всё дело сложить в один репозиторий, сохранив всю историю работы. Немного погуглив, нашел решение для переноса единичного проекта.
  1. делаем дамп репозитория, из которого будем переносить проект.
    svnadmin dump /var/svn/repositories/repoA > repoA.dump
  2. затем нужно выделить из дампа нужный нам проект с именем project2
    cat ./repoA.dump | svndumpfilter include project2 > project2.dump
  3. теперь заливаем дамп нашего проекта в новый репозиторий
    svnadmin load /var/svn/repositories/repoB < project2.dump 

И вот вроде все прекрасно. Но, если открыть журнал репозитория, то там будет много пустых ревизий с комментарием "This is an empty revision for padding.". Т.е. из-за не совпадения номеров ревизий в новом репозитории и в старом, идет выравнивание за счет создание таких ревизий. Это меня очень не устраивало. Столько мусора в журнале. Гугл что то ничего внятного сказать не мог, кроме как сделать дамп нового репозитория, в текстовом редакторе убрать эти пустышки. Справка на офф сайте Subversion по svndumpfilter совсем никакая.
Как оказалось все есть в встроенной справке в svndumpfilter. Исправив команду из пункта 2 на
cat ./repoA.dump | svndumpfilter include project2 --renumber-revs --drop-empty-revs > project2.dump
мы получим требуемый результат. Чистота, чисто дамп....

Кстати, особенность svnadmin dump в том, что её нужно запускать локально. А если вы хотите сделать дамп чужого репозитория, или просто удаленно, не заходя на сервер, то в этом вам поможет rsvndump . Только вот он распространяется только в исходниках. Пробовал вчера его собрать на mingw . Началось все мирно rsvndump, apr, subversion, apr-util. Но когда затем потребовался sqllite (или что то еще) я плюнул. Ну его нафиг.

1 комментарий:

  1. Для дампа удаленного репозитория можно сделать его зеркало утилитой svnsync.
    Cначала говорим
    svnsync init _локальный_репозиторий_ _удаленный_репозиторий_
    затем
    svnsync sync _локальный_репозиторий_

    ОтветитьУдалить