2010-11-17 8 views
17

Estamos migrando de Subversion a Mercurial y hemos tenido un bache en el proceso de conversión SVN-> Hg. En este momento, nuestro único repositorio de SVN guarda el código para un par de distintos "proyectos", y nos gustaría dividirlos en el proceso de migración. Nuestro repositorio SVN se organiza como:¿Divide el repositorio Subversion en múltiples repositorios Mercurial?

. 
|-- proj1 
| |-- branches 
| |-- tags 
| `-- trunk 
`-- proj2 
    |-- branches 
    |-- tags 
    `-- trunk 

y nos gustaría hacer simplemente proj1 y proj2 sus propios repositorios de Hg. Nos gustaría, por supuesto, no tener un historial específico de proj1 que aparezca en el registro de proj2 tampoco. En este momento, cuando hg convert hace la conversión, simplemente lee todos los archivos de forma bastante tonta, sin distinguir las ramas de los troncos.

¿Cuál es el proceso para filtrar por directorio y reconocer las ramas de SVN en hg convert?

+1

+1 Esta es una pregunta realmente importante y relevante en muchas empresas. –

+0

@Andres Jaan Tack: ¿por qué no se organizaron proyectos como repositorios separados al comienzo del trabajo, entonces? – zerkms

+1

@erjiang: si estuvo contento con el uso de 2 proyectos en 1 repositorio usando svn, ¿por qué no sigue el mismo esquema (incorrecto) y con mercurial?;-))) – zerkms

Respuesta

8

¡Lo tengo trabajando ahora, gracias al ConvertExtension wiki page!

Probé el método de Ry4an, pero vino con las desventajas de tener que convertir primero el repositorio SVN en un repositorio intermedio Mercurial antes de dividir todo, y que las ramas, el tronco y las etiquetas no se reconocían porque hay dos proyectos cada uno con sus propias ramas, tronco y etiquetas.

me encontré con que especificar manualmente el directorio de ramas, tronco y etiquetas funcionó muy bien para la conversión de un proyecto de SVN en Mercurial a la vez:

hg \ 
--config convert.svn.trunk=proj1/trunk \ 
--config convert.svn.branches=proj1/branches \ 
--config convert.svn.tags=proj1/tags \ 
convert --authors authors.txt original-svn-dir hg-proj1 

Esto se encargará de reconocer ramas SVN, etiquetas y tronco y filtro para solo proj1 revisiones al mismo tiempo. Entonces, acabo de repetirlo para proj2.

+0

Me alegro de que lo haya hecho funcionar. El inconveniente con múltiples conversaciones svn-> hg es que la pieza svn-> hg lleva mucho más tiempo que las piezas hg-> hg, por lo que dada la naturaleza iterativa de obtener autormapas, divisiones, etc., hacer el svn-> hg una vez , y hacer (y rehacer) hg-> hg para cada proyecto generalmente ahorra tiempo. Además, si va a utilizar el soporte de conversiones para la conversión incremental (es decir: vuelva a hacer esto en un mes incorporando las nuevas características de svn sin alterar los hash de hg), necesita una única conversión de svn. –

+0

Era una conversión local-> local, por lo que no fue tan malo en cuanto al tiempo. – erjiang

0

Esto se hace fácilmente usando la extensión 'convertir' como ha sugerido. Este es el procedimiento:

  1. hacer un hg convert SVNREPO all-in-one-mercurial-repo de SVN con el mercurial con todo
  2. hacer múltiples hg convert --filemap projectfilemap.txt all-in-one-mercurial-repo project-repo comandos - uno por proyecto

Esos filemaps tienen en ellos líneas como:

exclude proj1 
rename proj2 . 

Eso sería el mapa de archivos utilizado al extraer solo el repositorio del proyecto dos del repositorio mercurial todo en uno. Puede que necesite enumerar cada archivo individual en esos mapas, pero creo que los directorios están bien.

Hay otra pregunta aquí en SO, donde respondí más o menos lo mismo y pegué en un ejemplo completo, pero eso debería ser suficiente para comenzar.

+0

¿Se podría publicar un enlace a la pregunta anterior? – erjiang

+0

Ah, también, ¿puede convertir hg entender ramas como git-svn? – erjiang

+0

Sí, si usó una estructura/ramas/troncos/árbol normal, las recoge bien. –

Cuestiones relacionadas