Как стать автором
Обновить

Разделение Subversion репозитория на части

Время на прочтение3 мин
Количество просмотров1.7K
Когда я узнал в первые про систему контроля версий, я решил, что обязательно надо попробовать этот инструмент для разработки. В то время я себе мало представлял что это такое. Поэтому просмотрев доступные предложения выбрал Subversion.
Почитав немного мануалы решил создать свой первый репозиторий. И вдруг я на минуту задумался, а как организовать структуру, если у меня будет несколько проектов… и для себя решил, что создам дерево, которое разделяется на проекты, а в каждом проекте будут всем до боли знакомые trunk, tags, branches. Шло время кол-во проектов увеличивалось (правда не особо много, но все же) и как-то грустно стало наблюдать сквозную нумерацию ревизий в проекте. Т.е. смотришь логи проекта, а там сначала 649 ревизия, а потом 700. Все таки программисты народ чистолюбивый, любит когда все разложено по полочкам, поэтому было решено разделить один большой репозиторий на несколько более мелких.

Итак, краткая инструкция, чтобы все было по «фен-шую»

Немного исходных данных:
  • Физическое расположение репозитория:
    /home/user/svn/reps/projects
  • Доступ к репозиторию настроен через apache и имеет адрес
    http://svn.mysite.ru

    Раньше использовалась переменная SVNPath, указывающая на /home/user/svn/reps/projects, но т.к. мы собираемся разделить проекты, то настроим доступ с помощью переменной
    SVNParentPath "/home/user/svn/reps"
  • Структура репозитория, который будем разделять:
    http://svn.mysite.ru
                   |
                   |-Modules
                   |
                   |-Projects
                           |
                           |-Project1
                           |
                           |-Project2 
        


Инструкция:
  1. Надо сделать dump нашего репозитория. Для этого выполним команду:
    svnadmin dump /home/user/svn/reps/projects > myrep.dump
  2. Теперь оставим только один проект
    cat myrep.dump | svndumpfilter include Projects/Project1 --drop-empty-revs --renumber-revs > project1.dump

    --drop-empty-revs — удалить пустые ревизии
    --renumber-revs — перенумеровать ревизии

    Надо указывать полный путь до проекта, т.е. не просто наименование проекта «Project1», а именно «Projects/Project1». Иначе на выходе получите пустой dump файл.

    Вообще предыдущие две команды можно объединить
    svnadmin dump /home/user/svn/reps/projects | svndumpfilter include Projects/Project1 --drop-empty-revs --renumber-revs > project1.dump
  3. Создадим новый репозиторий для проекта в папке «reps»
    svnadmin create project1
  4. Загрузим очищенный дамп в новый репозиторий
    svnadmin load project1 < project1.dump
    На этом шаге возникает ошибка
    svnadmin: File not found transaction '0-0', path Projects/Project1, т.е это значит что папки Projects не существует. Видимо при восстановлении, структура не воссоздается.
    Чтобы это исправить, надо вручную создать папку «Projects»:
    svn mkdir http://svn.mysite.ru/project1/Projects -m "Создание папки Projects"

    А теперь уже можем спокойно выполнить:
    svnadmin load project1 < project1.dump
  5. Т.к. получилась структура нового репозитория, повторяющая старую структуру, то необходимо будет перенести все из папки «Project1» в корень репозитория, а потом удалить папку «Projects»

Хотелось бы здесь написать «Всё» и поставить точку. Но все же, среди этих 4 пунктов, есть ложка дегтя.
Если втечении работы над проектом, Вы его переименовали, то на 2-ом шаге возникнет ошибка Invalid copy source path 'старое название проекта'.
Штатная программа svndumpfilter не может решить эту проблему.
После некоторого поиска, я нашел скрипт, написанный на python svndumpfilter2, позволяющий обойти это ограничение.
Скачиваем скрипт себе на компьютер и вводим команду
cat myrep.dump | svndumpfilter2 --drop-empty-revs --renumber-revs /home/user/svn/reps/projects Projects/Project1 > project1.dump
Есть некоторые отличия от svndumpfilter.
  • Необходимо указать путь до физического расположения репозитория, т.е /home/user/svn/reps/projects
  • Поддерживается только ключ include. (его не надо указывать)


Ну вот теперь… ВСЁ.

Примечание: Когда я начинал писать эту статью (а это было неделю назад), то поискав на Хабре не нашел ничего аналогичного. Но т.к. моя публикация немного отложилась, то за это время появилась похожая статья Восстановление SVN репозитория, но т.к. мне кажется, что некоторые проблемы там не освещены, я все решил опубликовать свою статью.
Теги:
Хабы:
Всего голосов 12: ↑8 и ↓4+4
Комментарии5

Публикации