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



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



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



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



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

662   6  
svn

6 ответов:

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

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


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

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

  • хранилище корень
    • отделения
    • теги
    • багажник

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

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

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

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

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

да, с помощью svnadmin dump и svnadmin load.

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

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

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

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

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

EDIT: я написал, Пока вы редактировали, поэтому я не видел вашу записку...

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

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

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

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

  4. выполнить фиксацию на C.

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

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

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

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

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

 projectA
    branches 
    tags
    trunk
 projectB
    branches
    tags
    trunk

сначала вы должны создать каталог (project A, project 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

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

другие ответы на этот вопрос позволили мне сделать скрипт ниже. Адаптируйте карту репозиториев для вашего случая. Кроме того, вы можете переместить теги и ветви в каталог "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 "
        done
    svn rm  file:///${NEWREPO}/${newname} -m "Removed old ${newname}"
    done
}

dump
loadRepos

Comments

    Ничего не найдено.