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