Объединение нескольких SVN-репозиториев в один - PullRequest
58 голосов
/ 06 ноября 2008

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

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

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

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

Ответы [ 6 ]

72 голосов
/ 06 ноября 2008

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

10 голосов
/ 16 декабря 2011

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

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

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

http://svnbook.red -bean.com / о / 1,7 / svn.ref.svnrdump.c.dump.html

9 голосов
/ 06 ноября 2008

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

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

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

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

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

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

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

3 голосов
/ 10 января 2013

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

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

 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

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

3 голосов
/ 06 ноября 2008

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

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

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

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

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

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

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

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

1 голос
/ 29 июня 2012

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