После рассмотрения ответов на мой предыдущий вопрос (Один или несколько репозиториев SVN?) я Я решил взять 4 репозитория или около того, которые у меня есть, и объединить их в один. Это, конечно, приводит к вопросу: как лучше всего это сделать?
Есть ли способ объединить два или более репозитория с сохранением истории версий для обоих?
Изменить: Я также должен указать, что я использую Assembla.com, который не предоставляет доступ к команде svnadmin, AFAIK
Другое редактирование: Это вообще имеет значение? Если svnadmin работает с URL-адресами, тогда это не проблема.
svnadmin doc: поскольку svnadmin работает через прямой доступ к репозиторию (и, следовательно, может использоваться только на машине, на которой находится репозиторий), он ссылается на репозиторий с путем, а не URL-адресом. Nicolas C 11.09.2014
Возможны более сложные манипуляции, но это самые простые, понятные. Изменение структуры исходного репозитория во время дампа / загрузки опасно, но выполнимо с помощью комбинации svnadmin dump, svndumpfilter, ручного редактирования или дополнительных текстовых фильтров и svnadmin load
Работа со сторонним поставщиком
Запросите svnadmin dump файлов для каждого из ваших репозиториев. Провайдер должен быть готов / иметь возможность предоставить это - это ваш код!
Создайте репозиторий SVN локально.
Выполните действия, перечисленные выше для файлов дампа.
Проверьте правильность структуры репозитория с помощью вашего любимого клиента.
Создайте файл дампа для объединенных репозиториев.
Попросите поставщика заполнить новый репозиторий из этого файла дампа.
YMMV: Это кажется разумным подходом, но я никогда не работал со сторонним провайдером, подобным этому.
Ответ 2 · рейтинг 11 · Scott Coldwell
С Subversion 1.7 вы теперь можете делать дампы удаленно. То есть без доступа к локальной файловой системе и команде svnadmin dump.
Вы можете использовать svnrdump, чтобы получить полный дамп удаленного репозитория. Подробную информацию о синтаксисе см. В документации.
Обратите внимание, что сервер не обязательно должен работать под управлением версии 1.7, только клиент.
Предположим, у вас есть репозитории, один с HEAD ревизией 100, а другой с HEAD ревизией 150.
Вы выгружаете первый репозиторий и загружаете его в новый: вы получаете полную историю первого репозитория, от ревизии 0 до ревизии 150.
Затем вы выгружаете второй репозиторий и загружаете его в новый: он загружается с полной историей, единственное, что изменяется, - это фактические номера ревизий. История второго репозитория будет представлена в новом репозитории от ревизии 151 до ревизии 250.
Полная история обоих репозиториев сохраняется, только номера ревизий меняются для репозитория, который импортируется за секунду.
То же самое, конечно, относится к более чем двум репозиториям.
РЕДАКТИРОВАТЬ: я опубликовал, пока вы редактировали, поэтому я не видел вашей заметки ...
Ответ 4 · рейтинг 5 · Hatim
Вы можете загрузить несколько файлов дампа в один репозиторий, выполнив следующие действия.
Таким образом, у вас будет репозиторий, содержащий множество сброшенных репозиториев.
Ответ 5 · рейтинг 3 · Kibbee
Если у вас нет доступа к svnadmin, это будет сложно, но выполнимо. Допустим, у вас есть репозитории A и B, и вы хотите объединить их в репозиторий C. Вот шаги, которые вам нужно будет выполнить для этого.
Извлеките ревизию 1 репозитория A на свой жесткий диск.
Создайте каталог с именем Repository_A в корне вашего репозитория C и скопируйте его на свой локальный жесткий диск.
Скопируйте файлы из вашего чека из A (минус) файлы .svn в свой чек из C в папку Repository_A.
Выполните фиксацию на C.
Обновите вашу рабочую копию репозитория A до ревизии 2 и выполните шаги 3 и 4, и повторяйте их с каждой последующей ревизией, пока не дойдете до головы.
Теперь сделайте то же самое с Б.
Это будет в основном то же, что предлагал @Davide Gualano, без необходимости использования svnadmin. Вы, вероятно, могли бы написать простой сценарий, чтобы сделать это для вас, или, если изменений не так много, вы можете просто сделать это вручную.
Ответ 6 · рейтинг 1 · sthysel
Другие ответы на этот вопрос позволили мне создать сценарий ниже. Адаптируйте карту 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