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

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

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

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

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

6 ответов

Решение

Edit: Ну хорошо, редактирование вопроса было сделано, пока я печатал. Это ответ на

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


При условии, что

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

  • корень хранилища
    • ветви
    • теги
    • хобот

и вы хотите структуру что-то вроде:

  • корень хранилища
    • 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: Кажется, это разумный подход, но я никогда не работал с таким сторонним поставщиком.

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

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

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

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

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

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

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

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

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

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

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

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

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

 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

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

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

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

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

  3. Скопируйте файлы из чека A (за вычетом) файлов.svn, в чек C, в папке Repository_A.

  4. Выполнить коммит на C.

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

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

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

Другие ответы на этот вопрос позволили мне сделать сценарий ниже. Адаптируйте карту 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
Другие вопросы по тегам