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

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

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

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

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


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


Ответы (6)


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

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


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

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

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

person Ken Gentle    schedule 06.11.2008
comment
этот последний кусочек - именно то, что мне было нужно! Я как раз собирался отказаться от своих шансов, когда прочитал это. благодаря. - person nickf; 06.11.2008
comment
Если ваш хостер Subversion использует Subversion 1.4 или новее, вы всегда можете svnsync репозиторий с локальным репозиторием и (после синхронизации) выгрузить эту базу данных. - person Bert Huijben; 06.11.2008
comment
А некоторые провайдеры подрывной деятельности (например, Google Code) разрешают svnsyncing / to / a репозиторий. Таким образом, вы можете загрузить результат с помощью svnsync туда после выполнения слияния в другом месте. - person Bert Huijben; 06.11.2008
comment
Убедитесь, что вы создали пустой каталог проекта ‹n› в целевом репозитории, прежде чем запускать svnadmin load --parent-dir {project [n]} {путь файловой системы к репозиториям} ‹{путь файловой системы к dmp}. - person Aaron Greenlee; 22.10.2010
comment
Как упоминал Аарон, вам необходимо создать пустой каталог проекта в целевом репозитории перед запуском svnadmin load --parentdir. Это можно сделать с помощью svn mkdir {repo url} / {project [n]}. - person Joe Kiley; 02.02.2012
comment
Одна из проблем этого подхода заключается в том, что коммиты больше не будут располагаться в хронологическом порядке. История будет выглядеть так, как будто все в projectA произошло последовательно, затем все в projectB и т. Д. Помимо того, что это сбивает с толку, это, похоже, также достаточно сбивает с толку svn, что проверка по дате не сработает. - person Lutorm; 24.01.2015

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

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

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

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

person Scott Coldwell    schedule 16.12.2011
comment
Начиная с svn 1.4, вы также можете использовать svnsync для создания локальной копии удаленного репозитория. svn.apache.org/repos/asf/subversion/trunk/ заметки / svnsync.txt - person Jeremy Salwen; 28.01.2015

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

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

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

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

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

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

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

person Davide Gualano    schedule 06.11.2008
comment
Просто небольшое примечание - похоже, что вы проскользнули немного по-итальянски, пока вы писали свой комментарий. Это должно быть и, а не е :-) - person Simon Howard; 06.11.2008
comment
Эхе, вы правы, иногда мои итальянские пальцы печатают быстрее, чем мой мозг, пытающийся быть английским, может справиться: D - person Davide Gualano; 06.11.2008

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

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

 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

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

person Hatim    schedule 10.01.2013

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

person Kibbee    schedule 06.11.2008
comment
Да, конечный результат будет таким же, как и решение с использованием svnadmin dump and load, но это, вероятно, займет много времени. - person Davide Gualano; 06.11.2008
comment
Конечный результат будет иметь несколько другие метаданные. Все изменения будут проверены одним разработчиком в течение короткого периода времени. Вам также необходимо проявить смекалку, чтобы заставить ваш скрипт копировать проверку в комментариях. - person Denise Skidmore; 15.12.2014

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