Объединение нескольких репозиториев SVN в один
после рассмотрения ответов на мой предыдущий вопрос (один репозиторий SVN или много?), Я решил взять 4 или около того репозиториев, которые у меня есть, и объединить их в один. Это, конечно, приводит к вопросу,каков наилучший способ сделать это?
есть ли способ объединить два или более репозиториев, поддерживающих историю версий для обоих?
Edit:Я должен также указать, что я использую Assembla.com, которая не обеспечивает доступ к команда svnadmin, AFAIK
другой редактировать: это вообще имеет значение? Если svnadmin работает на URL-адресах,то это не проблема.
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 репозитория A на вашем жестком диске.
создайте каталог с именем Repository_A в корне вашего репозитория C и проверьте его на локальном жестком диске.
копировать файлы из вашего чека из A (минус) the .svn файлы, к вашей проверке C, в папке Repository_A.
выполнить фиксацию на 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