¿Cómo exporto (y luego importo) un repositorio de Subversion?

82

Estoy casi terminado en un proyecto en el que estaba usando un proveedor SVN comercial para almacenar el código fuente. El servidor web que el cliente finalmente eligió incluye un repositorio como parte del paquete de alojamiento, así que, ahora que el proyecto ha terminado, me gustaría reubicar el repositorio en su servidor web y descontinuar la cuenta comercial.

¿Cómo haría esto?

Brian Warshaw
fuente

Respuestas:

69

Si desea mover el repositorio y mantener el historial, probablemente necesitará acceso al sistema de archivos en ambos hosts. La solución más simple, si su backend es FSFS (el predeterminado en las versiones recientes), es hacer una copia del sistema de archivos de toda la carpeta del repositorio.

Si tiene un backend Berkley DB, si no está seguro de cuál es su backend o si está cambiando los números de versión de SVN, querrá usar svnadmin para volcar su antiguo repositorio y cargarlo en su nuevo repositorio. El uso svnadmin dumple dará una copia de seguridad de un solo archivo que puede copiar al nuevo sistema. Luego, puede crear el nuevo repositorio (vacío) y usarlo svnadmin load, que esencialmente reproducirá todas las confirmaciones junto con sus metadatos (autor, marca de tiempo, etc.).

Puede leer más sobre el proceso de volcado / carga aquí:

http://svnbook.red-bean.com/en/1.8/svn.reposadmin.maint.html#svn.reposadmin.maint.migrate

Además, si lo hace svnadmin load, asegúrese de usar la --force-uuidopción, o de lo contrario la gente tendrá problemas para cambiar al nuevo repositorio. Subversion usa un UUID para identificar el repositorio internamente, y no le permitirá cambiar una copia de trabajo a un repositorio diferente.

Si no tiene acceso al sistema de archivos, puede haber otras opciones de terceros (o puede escribir algo) para ayudarlo a migrar: esencialmente, tendría que usar el registro svn para reproducir cada revisión en el nuevo repositorio, y luego arregle los metadatos después. Necesitará los scripts de gancho pre-revprop-change y post-revprop-change en su lugar para hacer esto, que asume el acceso al sistema de archivos, entonces YMMV. O, si no desea conservar el historial, puede usar su copia de trabajo para importar al nuevo repositorio. Pero es de esperar que este no sea el caso.

Tadmas
fuente
28
Desde 1.7, ahora puede svnrdump, que no requiere derechos de administrador en los repositorios remotos. Comando es fácil: svnrdump dump https//remote/svn/trunk > repos.dump. En la mayoría de los casos, el comando también funciona con SVN 1.6, pero puede tener algunos problemas, consulte la documentación. Funciona tanto en * nix como en Windows.
Abel
34

rsvndump funcionó muy bien para mí migrar un repositorio de svnrepository.com a un servidor Ubuntu que controlo.

Cómo instalar y usar rsvndump en Ubuntu:

  1. Instalar las dependencias que faltan (bibliotecas "APR" y Subversion)

    sudo apt-get install apache2-threaded-dev
    sudo apt-get install libsvn-dev
    
  2. Instalar rsvndump

    wget http://prdownloads.sourceforge.net/rsvndump/rsvndump-0.5.5.tar.gz
    tar xvfz rsvndump-0.5.5.tar.gz
    cd rsvndump-0.5.5
    ./configure
    make
    sudo make install
    
  3. Volcar el repositorio SVN remoto a un archivo local

    rsvndump http://my.svnrepository.com/svn/old_repo > old_repo_dump
    
  4. Cree un nuevo repositorio y cárguelo en el archivo de volcado local

    sudo svnadmin create /opt/subversion/my_new_rep
    sudo svnadmin load --force-uuid /opt/subversion/my_new_repo < old_repo_dump
    
tkdave
fuente
7
Luego, para migrar una copia de trabajo existente: svn switch --relocate http://my.svnrepository.com/svn/old_repo http://newserver.com/svn/my_new_repo
tkdave
¿Qué significa exactamente la opción force-uuid? ¿Copia los permisos del directorio de la fuente o algo más?
Montag451
1
El UUID es el "identificador único universal" de un repositorio. No puede cambiar al repositorio reubicado a menos que el UUID coincida. Tenga en cuenta que también es posible configurar el UUID más tarde con el comando svnadmin setuuid.
tkdave
9

Extracto de mi Blog-Note-to-me :

Ahora puede importar un archivo de volcado, por ejemplo, si está migrando entre máquinas / versiones de subversión. por ejemplo, si hubiera creado un archivo de volcado desde el repositorio de origen y lo hubiera cargado en el nuevo repositorio como se muestra a continuación.

Comandos para sistemas similares a Unix (desde la terminal):

svnadmin dump /path/to/your/old/repo > backup.dump
svnadmin load /path/to/your/new/repo < backup.dump.dmp

Comandos para sistemas Microsoft Windows (desde cmd shell):

svnadmin dump C:\path\to\your\old\repo > backup.dump
svnadmin load C:\path\to\your\old\repo < backup.dump
Gishu
fuente
5

La herramienta para hacer eso sería

svnadmin dump

Pero para que esto funcione, necesita acceso al sistema de archivos al repositorio. Y una vez que tenga eso (y siempre que el repositorio esté en formato FSFS), puede simplemente copiar el repositorio en su nueva ubicación (si está en formato BDB, se recomienda encarecidamente descargar / cargar).

Si no tiene acceso al sistema de archivos, tendrá que pedirle al proveedor del repositorio que le proporcione el volcado (y hacer que elimine su repositorio, y esperar que cumpla)

pilif
fuente
5

Si no tiene acceso a los archivos del repositorio, prefiero rsvndump (volcado del repositorio remoto de Subversion) para hacer el archivo de volcado.

Rayo
fuente
Aprendí esto de la manera difícil hoy, resultó que los nuevos svns piensan que los repositorios antiguos están corruptos. El uso de volcados resolvió esto.
Búho
4

Básicamente, hay muchas formas de realizar la tarea. El tema se trata en profundidad en SVNBook | Migración de datos del repositorio a otra parte , por lo que sugiero leer la sección del libro.

Aquí hay una breve descripción de sus opciones:

  • Depende de su entorno, pero existe una gran posibilidad de que simplemente pueda copiar el repositorio al nuevo servidor y funcione. Debe revisar los scripts de enlace del repositorio después de copiar el repositorio para asegurarse de que funcionan como espera.

  • Puede usar los comandos svnadmin dumpy svnadmin loadpara, ehm, generar un volcado completo y luego cargarlo en otro repositorio en otro servidor. Necesitará svnadmin createun nuevo repositorio limpio para cargar el volcado en él. Tenga en cuenta que el enfoque solo se ocupa del historial del repositorio y no mueve los scripts de enlace ni los archivos de configuración del repositorio . Además, debe tener acceso de lectura del sistema de archivos al repositorio original para volcarlo.

  • Desde Subversion 1.7, la svnrdumpherramienta está disponible. En general, imita svnadmin dumpy svnadmin loadfunciona, pero funciona de forma remota. No es necesario que tenga acceso al sistema de archivos de lectura / escritura a los repositorios originales y de destino, ya que la herramienta funciona de forma remota como el cliente de Subversion, por ejemplo, a través del protocolo HTTPS. Por lo tanto, debe tener acceso de lectura al repositorio original y leer / escribir en el de destino.

  • Otra opción es usar el svnadmin hotcopycomando. El comando se usa principalmente para fines de respaldo, crea una copia completa del repositorio, incluida la configuración y los scripts de enlace. Luego, puede mover el repositorio copiado en caliente a otro servidor.

bahrep
fuente
4

También puede usar el svnadmin hotcopycomando:

svnadmin hotcopy OLD_REPOS_PATH NEW_REPOS_PATH

Se necesita una copia de seguridad completa del repositorio, incluidos todos los enlaces, archivos de configuración, etc.

Más en SVN Book

pirho
fuente
1
en realidad, es copia en caliente svnADMIN. Lo que significa que esto también requerirá acceso al sistema de archivos del repositorio.
pilif
3

Suponiendo que tiene los privilegios necesarios para ejecutar svnadmin, debe utilizar los comandos dump y load .

Dan Dyer
fuente
3

Encontré un artículo sobre cómo mover repositorios svn de un servicio de alojamiento a otro, y cómo hacer copias de seguridad locales:

  1. Defina dónde almacenará sus repositorios:

    mkdir ~/repo
    MYREPO=/home/me/someplace ## you should use full path here
    
  2. Ahora crea un repositorio svn vacío con svnadmin create $MYREPO
  3. Crea un archivo de gancho y hazlo ejecutable:

    echo '#!/bin/sh' > $MYREPO/hooks/pre-revprop-change
    chmod +x $MYREPO/hooks/pre-revprop-change
    
  4. Ahora podemos comenzar a importar el repositorio con svnsync, que inicializará un repositorio de destino para la sincronización desde otro repositorio:

    svnsync init file://$MYREPO http://your.svn.repo.here/
    
  5. Y el broche de oro para transferir todas las revisiones pendientes al destino desde la fuente con la que se inicializó:

    svnsync sync file://$MYREPO
    

Allí ahora tiene un repositorio svn local en el ~/repodirectorio.

Fuente:

Braiam
fuente