Подтвердить что ты не робот

Объединение нескольких репозиториев SVN в один

Рассмотрев ответы на мой предыдущий вопрос (Один репозиторий SVN или многие?), я решил взять 4 или около того репозитории, которые у меня есть, и объединить их в один. Это, конечно, приводит к вопросу, , что лучший способ сделать это?

Есть ли способ объединить два или более хранилища, поддерживающие историю версий для обоих?

Изменить: я должен также указать, что я использую Assembla.com, который не предоставляет доступ к команде svnadmin, AFAIK

Другое редактирование: Это даже имеет значение? Если svnadmin работает с URL-адресами, тогда это не проблема.

4b9b3361

Ответ 1

Изменить: Ну, редактирование вопроса было сделано во время ввода. Это ответ на

Есть ли способ объединить два или более хранилища, поддерживающие версию история для обоих?


Предполагая, что

Существующие репозитории имеют такую ​​структуру, как:

  • корень репозитория
    • ветки
    • теги
    • багажник

и вам нужна структура:

  • корень репозитория
    • Projecta
      • ветки
      • теги
      • багажник
    • projectB
      • ветки
      • теги
      • багажник

Затем для каждого из ваших репозиториев проектов:

svnadmin dump > project<n>.dmp

Затем для каждого из файлов дампа:

svn mkdir "<repo url>/project<n>"
svnadmin load --parent-dir "project<n>" <filesystem path to repos>

Более сложные манипуляции возможны, но это самый простой, самый простой. Изменение структуры исходного репозитория во время дампа/нагрузки опасно, но возможно с помощью комбинации svnadmin dump, svndumpfilter, редактирования вручную или дополнительных текстовых фильтров и svnadmin load


Работа с сторонним провайдером

  • Запросить svnadmin dump файлы для каждого из ваших репозиториев. Поставщик должен быть готов/способен предоставить это - это ваш код!
  • Создайте репозиторий SVN локально.
  • Выполните действия, перечисленные выше для файлов дампа.
  • Проверьте правильность структуры репозитория с вашим любимым клиентом.
  • Создайте файл дампа для объединенных репозиториев.
  • Запросите, чтобы провайдер заполнил новый репозиторий из этого файла дампа.

YMMV: Это, кажется, разумный подход, но я никогда не работал с сторонним провайдером, подобным этому.

Ответ 2

С Subversion 1.7 вы можете удаленно выполнять сброс. То есть, не имея доступа к локальной файловой системе и команде svnadmin dump.

Вы можете использовать svnrdump для получения полного дампа удаленного репозитория. См. Документацию по деталям синтаксиса.

Обратите внимание, что серверу не нужно запускать 1.7, а только клиент.

http://svnbook.red-bean.com/en/1.7/svn.ref.svnrdump.c.dump.html

Ответ 3

Да, используя svnadmin dump и svnadmin load.

Предположим, что у вас есть репозитории, один с версией HEAD 100, а другой с версией 150 HEAD.

Вы удаляете первый репозиторий и загружаете его в новый: в итоге вы получаете полную историю первого репозитория, начиная с версии 0 до версии 150.

Затем вы выгружаете второй репозиторий и загружаете его в новый: он загружается с полной историей, единственными изменениями являются фактические номера версий. История второго репозитория будет представлена ​​в новом репозитории от версии 151 до версии 250.

Полная история обоих репозиториев - это preserver, только номера версий изменяются для репозитория, который импортируется для второго.

То же самое относится и к более чем двум репозиториям.

РЕДАКТИРОВАТЬ: Я опубликовал, когда вы редактировали, поэтому я не видел вашу заметку...

Ответ 4

Вы можете загрузить много файлов дампа в один репозиторий с помощью следующих шагов.

Корень репозитория:

 projectA
    branches 
    tags
    trunk
 projectB
    branches
    tags
    trunk

Сначала вы должны создать каталог (проект A, проект B) в корне репозитория следующим образом:

$ svn mkdir -m "Initial project root" \
file:///var/svn/repository_root/Project_A\
file:///var/svn/repository_root/Project_B\
file:///var/svn/repository_root/Project_C\

Revision 1 committed.

И после этого вы можете загрузить файлы дампа:

Используйте параметр --parent-dir DIRECTORY

$ svnadmin load /var/svn/repository_root --parent-dir Project_A < file-dump-PRJA.dump
…
$ svnadmin load /var/svn/repository_root --parent-dir Project_B < file-dump-PRJB.dump

Таким образом, у вас будет репозиторий, содержащий множество сбрасываемых репозиториев.

Ответ 5

Если у вас нет доступа к svnadmin, это будет трудно, но выполнимо. Скажем, у вас есть репозитории A и B, и вы хотите объединить их в репозиторий C. Здесь шаги, которые вы должны будете использовать для достижения этого.

  • Проверьте версию 1 репозитория A на ваш жесткий диск.

  • Создайте каталог, называемый Repository_A в корневом каталоге вашего репозитория C, и проверьте его на локальном жестком диске.

  • Скопируйте файлы из вашей проверки из A (минус).svn файлов в вашу папку C в папке Repository_A.

  • Выполните команду Commit на C.

Обновите рабочую копию репозитория A до версии 2 и выполните шаги 3 и 4 и повторите с каждой последующей ревизией до тех пор, пока вы не достигнете головы.

Теперь сделайте то же самое с B.

Это будет в основном делать то же самое, что предлагал @Davide Gualano, не требуя svnadmin. Вероятно, вы могли бы написать простой script, чтобы сделать это для вашего, если нет большого количества изменений, вы можете просто сделать это вручную.

Ответ 6

Другие ответы на этот вопрос позволили мне сделать script ниже. Адаптируйте карту REPOS для вашего дела. Кроме того, вы можете перенести теги и ветки в каталог "preaggregate" вместо непосредственно в новые ветки и соединительные линии.

#!/bin/bash

NEWREPO=$(pwd)/newrepo
NEWREPOCO="${NEWREPO}_co"
DUMPS=repodumps
REV="0:HEAD"
REPOROOT=/data/svn/2.2.1/repositories/
TOOLDIR=/opt/svn/2.2.1/bin/
PATH=${PATH}:${TOOLDIR}

# Old Repository mapping 
declare -A REPOS=( 
    [BlaEntityBeans]='(
        [newname]="EntityBeans"
    )'
    [OldServletRepoServlet]='(
        [newname]="SpreadsheetImportServlet"
    )'
    [ExperimentalMappingXML]='(
        [newname]="SpreadsheetMappingXML"
    )'
    [NewImportProcess]='(
        [newname]="SpreadsheetImportProcess"
    )'    
)

dump() {
    rm -fr ${DUMPS}
    mkdir ${DUMPS}
    for repo in "${!REPOS[@]}"
    do
        local dumpfile=${DUMPS}/${repo}.dmp
    echo "Dumpimg Repo ${repo} to ${dumpfile}"
        svnadmin dump -r ${REV} ${REPOROOT}/${repo} > ${dumpfile}
    done
}

loadRepos() {
    # new big repo
    rm -fr ${NEWREPO}
    svnadmin create ${NEWREPO}
    svn mkdir file:///${NEWREPO}/trunk -m ""
    svn mkdir file:///${NEWREPO}/branches -m ""
    svn mkdir file:///${NEWREPO}/tags -m ""

    # add the old projects as modules
    for currentname in "${!REPOS[@]}"
    do  
        declare -A repo=${REPOS[$currentname]}
        local newname=${repo[newname]}
        echo "Loading repo ${currentname} soon to be ${newname}"
        dumpfile=${DUMPS}/${currentname}.dmp

        # import the current repo into a trmporary root position
        svn mkdir file:///${NEWREPO}/${currentname} -m "Made module ${currentname}"
        svnadmin load --parent-dir ${currentname} ${NEWREPO} < ${dumpfile}

        # now move stuff arround
        # first rename to new repo
        svn move file:///${NEWREPO}/${currentname} file:///${NEWREPO}/${newname} -m "Moved ${currentname} to ${newname}"
        # now move trunk, branches and tags
        for vc in {trunk,branches,tags}
        do
            echo "Moving the current content of $vc into ${NEWREPO}/${vc}/${newname}"
            svn move file:///${NEWREPO}/${newname}/${vc} file:///${NEWREPO}/${vc}/${newname} -m "Done by $0"
        done
    svn rm  file:///${NEWREPO}/${newname} -m "Removed old ${newname}"
    done
}

dump
loadRepos