Объединение нескольких репозиториев SVN в один
Рассмотрев ответы на мой предыдущий вопрос (Один репозиторий SVN или многие?), я решил взять 4 или около того репозитории, которые у меня есть, и объединить их в один. Это, конечно, приводит к вопросу, , что лучший способ сделать это?
Есть ли способ объединить два или более хранилища, поддерживающие историю версий для обоих?
Изменить: я должен также указать, что я использую Assembla.com, который не предоставляет доступ к команде svnadmin, AFAIK
Другое редактирование: Это даже имеет значение? Если svnadmin работает с URL-адресами, тогда это не проблема.
Ответы
Ответ 1
Изменить: Ну, редактирование вопроса было сделано во время ввода. Это ответ на
Есть ли способ объединить два или более хранилища, поддерживающие версию история для обоих?
Предполагая, что
Существующие репозитории имеют такую структуру, как:
и вам нужна структура:
Затем для каждого из ваших репозиториев проектов:
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
С Subversion 1.7 вы можете удаленно выполнять сброс. То есть, не имея доступа к локальной файловой системе и команде svnadmin dump
.
Вы можете использовать svnrdump
для получения полного дампа удаленного репозитория. См. Документацию по деталям синтаксиса.
Обратите внимание, что серверу не нужно запускать 1.7, а только клиент.
http://svnbook.red-bean.com/en/1.7/svn.ref.svnrdump.c.dump.html
Ответ 3
Да, используя svnadmin dump и svnadmin load.
Предположим, что у вас есть репозитории, один с версией HEAD 100, а другой с версией 150 HEAD.
Вы удаляете первый репозиторий и загружаете его в новый: в итоге вы получаете полную историю первого репозитория, начиная с версии 0 до версии 150.
Затем вы выгружаете второй репозиторий и загружаете его в новый: он загружается с полной историей, единственными изменениями являются фактические номера версий. История второго репозитория будет представлена в новом репозитории от версии 151 до версии 250.
Полная история обоих репозиториев - это preserver, только номера версий изменяются для репозитория, который импортируется для второго.
То же самое относится и к более чем двум репозиториям.
РЕДАКТИРОВАТЬ: Я опубликовал, когда вы редактировали, поэтому я не видел вашу заметку...
Ответ 4
Вы можете загрузить много файлов дампа в один репозиторий с помощью следующих шагов.
Корень репозитория:
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
Если у вас нет доступа к svnadmin, это будет трудно, но выполнимо. Скажем, у вас есть репозитории A и B, и вы хотите объединить их в репозиторий C. Здесь шаги, которые вы должны будете использовать для достижения этого.
-
Проверьте версию 1 репозитория A на ваш жесткий диск.
-
Создайте каталог, называемый Repository_A в корневом каталоге вашего репозитория C, и проверьте его на локальном жестком диске.
-
Скопируйте файлы из вашей проверки из A (минус).svn файлов в вашу папку C в папке Repository_A.
-
Выполните команду Commit на C.
Обновите рабочую копию репозитория A до версии 2 и выполните шаги 3 и 4 и повторите с каждой последующей ревизией до тех пор, пока вы не достигнете головы.
Теперь сделайте то же самое с B.
Это будет в основном делать то же самое, что предлагал @Davide Gualano, не требуя svnadmin. Вероятно, вы могли бы написать простой script, чтобы сделать это для вашего, если нет большого количества изменений, вы можете просто сделать это вручную.
Ответ 6
Другие ответы на этот вопрос позволили мне сделать script ниже. Адаптируйте карту 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