Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: nickfОтветов: 6

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

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

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

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

  • svnadmin doc: поскольку svnadmin работает через прямой доступ к репозиторию (и, следовательно, может использоваться только на машине, на которой находится репозиторий), он ссылается на репозиторий с путем, а не URL-адресом. Nicolas C 11.09.2014

svn

Ответы

Ответ 1 · рейтинг 74 · Ken Gentle

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


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

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

  • repository root
    • branches
    • теги
    • багажник

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

  • repository root
    • projectA
      • branches
      • теги
      • багажник
    • projectB
      • branches
      • теги
      • багажник

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

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 · рейтинг 11 · Scott Coldwell

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

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

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

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

Ответ 3 · рейтинг 10 · Davide Gualano

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

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

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

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

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

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

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

Ответ 4 · рейтинг 5 · Hatim

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

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

 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 · рейтинг 3 · Kibbee

Если у вас нет доступа к 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. Вы, вероятно, могли бы написать простой сценарий, чтобы сделать это для вас, или, если изменений не так много, вы можете просто сделать это вручную.

Ответ 6 · рейтинг 1 · sthysel

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы