Combinando múltiples repositorys SVN en uno

Después de considerar las respuestas a mi pregunta anterior (¿ Un repository SVN o muchas? ), He decidido tomar los 4 o más repositorys 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 repositorys 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.

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 repositorys manteniendo el historial de versiones para ambos?


Asumiendo que

Los repositorys existentes tienen una estructura como:

  • raíz del repository
    • twigs
    • tags
    • el maletero

y quieres una estructura algo así como:

  • raíz del repository
    • proyectoA
      • twigs
      • tags
      • el maletero
    • proyecto B
      • twigs
      • tags
      • el maletero

Luego, para cada uno de sus repositorys de proyectos:

svnadmin dump > project.dmp 

Luego, para cada uno de los archivos de volcado:

 svn mkdir "/project" svnadmin load --parent-dir "project"  

Manipulaciones más complejas son posibles, pero esta es la más simple, más directa. Cambiar la estructura del repository 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 repositorys. El proveedor debería estar dispuesto / ser capaz de proporcionar esto, ¡ es su código!
  • Cree un repository SVN localmente.
  • Realice las acciones enumeradas anteriormente para los archivos de volcado.
  • Verifique que la estructura del repository sea la correcta con su cliente favorito.
  • Crea un archivo de volcado para los repositorys combinados.
  • Solicite que el proveedor rellene un nuevo repository desde este archivo de volcado.

YMMV: Este parece ser un enfoque razonable, pero nunca he trabajado con un proveedor de terceros como este.

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 repository remoto. Ver la documentación para detalles de syntax.

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

Sí, usando svnadmin dump y svnadmin load .

Supongamos que tiene repositorys, uno con la revisión HEAD 100 y el otro con la revisión HEAD 150.

Vacila el primer repository y lo carga en el nuevo: termina con la historia completa del primer repository, desde la revisión 0 hasta la revisión 150.

Luego descarga el segundo repository 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 repository se representará en el nuevo repository de la revisión 151 a la revisión 250.

El historial completo de ambos repositorys es preservador, solo cambian los números de revisión para el repository que se importa para el segundo.

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

EDIT: publiqué mientras editabas, así que no vi tu nota …

Puede cargar muchos archivos de volcado en un repository con los siguientes pasos.

Raíz del repository:

  projectA branches tags trunk projectB branches tags trunk 

Primero debe crear el directorio (proyecto A, proyecto B) en su raíz del repository 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 repository que contiene muchos repositorys objeto de dumping.

Si no tiene acceso a svnadmin, sería difícil pero factible. Digamos que tiene los repositorys A y B, y desea fusionarlos en el repository C. Aquí están los pasos que debería seguir para lograr esto.

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

  2. Cree un directorio, llamado Repository_A en la raíz de su repository C, y verifique esto en su 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 un compromiso en C.

Actualice su copia de trabajo del repository 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.

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 tags y las twigs a un directorio “preagregado” en lugar de directamente a las nuevas twigs 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