2010-01-20 16 views
7

Me gustaría convertir un repositorio de Subversion a Mercurial, pero cuando inicialmente configuré el repositorio, lo hice de la manera más perezosa posible. Con el tiempo, la estructura continuó transformándose y deteriorándose (tiene 5 años en este punto). Sin embargo, me gustaría conservar la mayor cantidad de historia posible, incluso si tengo que ensuciarme y unir manualmente las cosas.¿Cómo migrar de Subversion a Mercurial cuando la estructura del tronco/rama/etiqueta es un desastre?

Sin más preámbulos, la estructura actual se ve así:

svn://svn.example.com/Example 
    + trunk 
     + BigProject 
     + BinaryDepedencies 
    + branches 
     + BigProject 
      + branch1 
      + feature1 
      + maintenance1 
      + ... 
    + tags 
     + BigProject 
      + tag1 
      + tag2 
      + ... 
    + projects 
     + small_project1 
     + small_project2 
     + small_project3 
     + ... 

Teniendo en cuenta que esto es sólo la estructura más reciente, ¿hay alguna esperanza para este repositorio? Si no hay esperanza, cualquiera tiene un buen enfoque para reconstruir la historia a mano en Mercurial (o bazar).

Además, por diversas razones, no podré usar git a menos que exista una estrategia a prueba de balas para convertir este repositorio específico de Subversion a git a hg/bzr.

+0

Habrá una nueva buena respuesta a esto pronto. reposurgeon está aumentando la capacidad de importar Subversion, y parece que se está prestando mucha atención y atención a esta capacidad: http://esr.ibiblio.org/?p=4071 – Omnifarious

Respuesta

7

Una estrategia podría ser convertir el enlace troncal. Es posible que deba jugar algunos juegos si su baúl se ha movido, pero no debería ser demasiado difícil.

Otra herramienta en su arsenal podría ser la conversión de hg-> hg y la extensión de rebase. Puede usarlos para jugar con su árbol después de tener cosas en un repositorio de hg y injertar en las ramas después de que las haya convertido. O injerte en nuevas piezas de su historial de troncales después de su movimiento.

Aquí hay un buen enlace a la documentación en el Mercurial rebase extension.

Básicamente, esta es la estrategia que seguiría ... Primero, use convert extension o hgsvn para convertir partes del depósito. Esto puede dar como resultado múltiples líneas de troncales, o en ramas que están en un repositorio separado de la línea principal.

Si tiene dos secciones de tronco en depósitos separados y uno en el directorio llamado second sigue directamente el uno en el directorio llamado first, usted puede hacer esto:

cd second 
hg log -r 0 
# Note the revision hash 
cd ../first 
hg tip 
# Again, note the revision hash 
hg pull -f ../second 
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash from hg tip> 

Eso se injertar una sección de tronco en otra sección del tronco.

Si usted tiene una rama en un repositorio separado, el procedimiento es un poco más complicado:

cd branch 
hg log -r 0 
# Note the revision hash 
cd ../trunk 
# Find the revision that the branch branches off from and note its hash. 
# We will call this revision the 'branch base'. 
hg pull -f ../branch 
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash of branch base> 

Eso se injertar la rama en el árbol principal.

+0

¿Puede explicar cómo injertar en las ramas? La idea hg-> hg suena prometedora. – user255063

+0

@throttled - Ahí, hice más de un intento de explicar. :-) – Omnifarious

+0

Impresionante, gracias. Eso me da un poco de masticar. – user255063

3

De acuerdo con convert extension's docs, algo como lo siguiente debería funcionar.

$ cat > ~/.hgrc <<EOF 
[extensions] 
hgext.convert= 
EOF 
$ hg convert --config convert.svn.trunk trunk/BigProject --config convert.svn.branches branches/BigProject --config convert.svn.tags tags/BigProject svn://svn.example.com/Example newhgrepo 
+1

Muy buena sugerencia, parece que puedo intentar usar la misma estrategia para dividir los proyectos pequeños en su propio repositorio. – user255063

Cuestiones relacionadas