tortoise - svn tutorial español
Combinando múltiples repositorios SVN en uno (6)
Después de considerar las respuestas a mi pregunta anterior (¿ Un repositorio SVN o muchas? ), He decidido tomar los 4 o más repositorios que tengo y consolidarlos en uno. Esto, por supuesto, lleva a la pregunta, ¿cuál es la mejor manera de hacer esto?
¿Hay alguna manera de combinar dos o más repositorios manteniendo el historial de versiones para ambos?
Editar: También debo señalar que estoy usando Assembla.com, que no proporciona acceso al comando svnadmin, AFAIK
Otra edición: ¿Esto incluso importa? Si svnadmin funciona en URLs, entonces no hay problema entonces.
Con Subversion 1.7, ahora puede hacer vuelcos de forma remota. Es decir, sin tener acceso al sistema de archivos local y al comando svnadmin dump
.
Puede usar svnrdump
para obtener un volcado completo de un repositorio remoto. Ver la documentación para detalles de sintaxis.
Tenga en cuenta que el servidor no tiene que estar ejecutando 1.7, solo el cliente.
http://svnbook.red-bean.com/en/1.7/svn.ref.svnrdump.c.dump.html
Editar: Bueno, la edición de la pregunta se realizó mientras escribía. Esta es una respuesta a
¿Hay alguna manera de combinar dos o más repositorios manteniendo el historial de versiones para ambos?
Asumiendo que
Los repositorios existentes tienen una estructura como:
- raíz del repositorio
- ramas
- etiquetas
- el maletero
y quieres una estructura algo así como:
- raíz del repositorio
- proyectoA
- ramas
- etiquetas
- el maletero
- proyecto B
- ramas
- etiquetas
- el maletero
- proyectoA
Luego, para cada uno de sus repositorios de proyectos:
svnadmin dump > project<n>.dmp
Luego, para cada uno de los archivos de volcado:
svn mkdir "<repo url>/project<n>"
svnadmin load --parent-dir "project<n>" <filesystem path to repos>
Manipulaciones más complejas son posibles, pero esta es la más simple, más directa. Cambiar la estructura del repositorio fuente durante un volcado / carga es peligroso, pero posible mediante una combinación de svnadmin dump
, svndumpfilter
, edición manual o filtros de texto adicionales y svnadmin load
Tratar con un proveedor externo
- Solicite archivos de
svnadmin dump
para cada uno de sus repositorios. El proveedor debería estar dispuesto / ser capaz de proporcionar esto, ¡ es su código! - Cree un repositorio SVN localmente.
- Realice las acciones enumeradas anteriormente para los archivos de volcado.
- Verifique que la estructura del repositorio sea la correcta con su cliente favorito.
- Crea un archivo de volcado para los repositorios combinados.
- Solicite que el proveedor rellene un nuevo repositorio desde este archivo de volcado.
YMMV: Este parece ser un enfoque razonable, pero nunca he trabajado con un proveedor de terceros como este.
Las otras respuestas para esta pregunta me permitieron hacer la secuencia de comandos a continuación. Adapte el mapa REPOS para su caso. Además, es posible que desee mover las etiquetas y las ramas a un directorio "preagregado" en lugar de directamente a las nuevas ramas y troncales.
#!/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
Puede cargar muchos archivos de volcado en un repositorio con los siguientes pasos.
Raíz del repositorio:
projectA
branches
tags
trunk
projectB
branches
tags
trunk
Primero debe crear el directorio (proyecto A, proyecto B) en su raíz del repositorio de la siguiente manera:
$ 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.
Y después de eso puedes cargar tus archivos de volcado:
Usa el parámetro --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
De esta forma, tendrás un repositorio que contiene muchos repositorios objeto de dumping.
Sí, usando svnadmin dump y svnadmin load .
Supongamos que tiene repositorios, uno con la revisión HEAD 100 y el otro con la revisión HEAD 150.
Vacila el primer repositorio y lo carga en el nuevo: termina con la historia completa del primer repositorio, desde la revisión 0 hasta la revisión 150.
Luego descarga el segundo repositorio y lo carga en el nuevo: se carga con su historial completo, las únicas cosas que cambian son los números de revisión reales. El historial del segundo repositorio se representará en el nuevo repositorio de la revisión 151 a la revisión 250.
El historial completo de ambos repositorios es preservador, solo cambian los números de revisión para el repositorio que se importa para el segundo.
Lo mismo, por supuesto, se aplica a más de dos repositorios.
EDIT: publiqué mientras editabas, así que no vi tu nota ...
Si no tiene acceso a svnadmin, sería difícil pero factible. Digamos que tiene los repositorios A y B, y desea fusionarlos en el repositorio C. Aquí están los pasos que debería seguir para lograr esto.
Consulte la revisión 1 del repositorio A en su disco duro.
Cree un directorio, llamado Repository_A en la raíz de su repositorio C, y verifique esto en su disco duro local.
Copie los archivos de su cheque de A (menos) los archivos .svn, a su salida de C, en la carpeta Repository_A.
Realice un compromiso en C.
Actualice su copia de trabajo del repositorio A a la revisión 2 y realice los pasos 3 y 4, y repita con cada revisión sucesiva hasta llegar a la cabeza.
Ahora haz lo mismo con B.
Esto básicamente haría lo mismo que @Davide Gualano estaba sugiriendo, sin requerir svnadmin. Probablemente podrías escribir un script simple para hacer esto para ti, o si no hay muchas revisiones, podrías hacerlo manualmente.