2008-11-06 17 views
53

Después de considerar las respuestas a mi pregunta anterior (One SVN Repository or many?), he decidido tomar los 4 o más repositorios que tengo y consolidarlos en uno solo. Esto, por supuesto, lleva a la pregunta, ¿cuál es la mejor manera de hacer esto?Combinación de múltiples repositorios SVN en uno

¿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, que yo sepa

Otra edición: ¿Este siquiera importa? Si svnadmin funciona en URLs, entonces no hay problema entonces.

+0

[svnadmin doc] (http://svnbook.red-bean.com/en/1.7/svn.ref.svnadmin.html): "Dado que svnadmin funciona mediante el acceso directo al repositorio (y, por lo tanto, solo se puede usar en máquina que contiene el repositorio), se refiere al repositorio con una ruta, no una URL ". –

Respuesta

67

Editar: Bueno, la pregunta se hizo la edición, mientras que yo estaba escribiendo. Esta es una respuesta a

¿Hay una manera de combinar dos o más repositorios mantener el historial de versiones para ambos?


Suponiendo que

Los repositorios existentes tienen una estructura como:

  • raíz del repositorio
    • ramas
    • etiquetas
    • t runk

y desea una estructura algo como:

  • raíz del repositorio
    • ProjectA
      • ramas
      • etiquetas
      • tronco
    • ProjectB
      • ramas
      • etiquetas
      • tronco

A continuación, para cada uno de los repositorios de proyectos:

svnadmin dump > project<n>.dmp 

A continuación, para cada uno de los archivos de volcado:

svn mkdir "<repo url>/project<n>" 
svnadmin load --parent-dir "project<n>" <filesystem path to repos> 

más complejas manipulaciones son posibles, pero este es el más simple, más sencillo. Cambio de la estructura del repositorio de origen durante una volcado/carga es peligrosa, pero factible a través de una combinación de svnadmin dump, svndumpfilter, mano de edición o de texto adicional de filtros y svnadmin load


Tratar con un proveedor de terceros

  • Solicite svnadmin dump archivos para cada uno de sus repositorios. El proveedor debe estar dispuesto/puede proporcionar esto: essu 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 llene 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.

+0

ese último bit es justo lo que era ¡después! Estaba a punto de renunciar a mis posibilidades cuando leí esto. Gracias. – nickf

+0

Si su servidor de subversión utiliza subversión 1.4 o posterior, siempre puede svnsync el repositorio a un repositorio local y (después de la sincronización) volcar esa base de datos. –

+1

Y algunos proveedores de subversión (por ejemplo, Google Code) permiten svnsyncing/to/a repository. Entonces puedes subir el resultado con svnsync allí después de realizar la fusión en otro lugar. –

8

Sí, usando svnadmin dump y svnadmin load.

Vamos a suponer que usted tiene que repositorios, uno con revisión HEAD 100 y el otro con revisión HEAD 150.

volcar el primer repositorio y cargarlo en el nuevo: se termina con la historia completa de el primer repositorio, desde la revisión 0 a 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 conservador, solo cambian los números de revisión para el repositorio que se importó para el segundo.

Lo mismo, por supuesto, se aplica a más de dos repositorios.

EDIT: He publicado mientras que estaba editando, por lo que no vi la nota ...

+1

Solo una nota rápida: parece que se deslizó un poco de italiano mientras escribía su comentario. Eso debería ser "y", no "e" :-) –

+0

Eheh, tienes razón, a veces mis dedos italianos teclean más rápido de lo que mi cerebro que intenta ser inglés puede manejar: D –

2

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.

  1. Consulte la revisión 1 del repositorio A en su disco duro.

  2. Crea un directorio, llamado Repository_A en la raíz de tu repositorio C, y mira esto en tu disco duro local.

  3. Copie los archivos de su cheque de A (menos) los archivos .svn, a su salida de C, en la carpeta Repository_A.

  4. realice una confirmación sobre C.

Actualización de su copia de trabajo del repositorio de la A a la revisión 2, y realizar los pasos 3 y 4, y repetir con cada revisión sucesiva hasta llegar a la cabeza.

Ahora haga lo mismo con B.

Básicamente, esto 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.

+0

Sí, el resultado final será el mismo que el de la solución que usa svnadmin dump y load, pero probablemente llevará mucho tiempo. –

+0

El resultado final tendrá metadatos ligeramente diferentes. Todos los cambios serán revisados ​​por un desarrollador en un corto período de tiempo. También deberá ser inteligente para que su secuencia de comandos copie el control en los comentarios. –

9

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

+0

Comenzando con svn 1.4 también puede usar svnsync para crear una copia local del repositorio remoto. https://svn.apache.org/repos/asf/subversion/trunk/notes/svnsync.txt –

1

Las otras respuestas para esta pregunta me permitieron hacer el guión 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 
3

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 

En primer lugar debe crear el directorio (proyecto A, el proyecto B) en la 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 que usted puede cargar sus archivos de volcado :

Utilice 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 manera tendrá un repositorio que contiene muchos repositorios vacíos.

Cuestiones relacionadas