2011-01-05 19 views
10

He estado leyendo acerca de los subrepositorios y cómo extraer una carpeta existente de un repositorio de Mercurial a un subrepositorio utilizando la extensión de conversión y un mapa de archivos. Puedo hacer esto con éxito Si tengo la siguiente estructura de carpetas:¿Cómo convertir un repositorio Mercurial existente para usar subrepositorios y mantener el historial intacto?

C:\Project 
---Project\root.txt 
---Project\SubFolder 
---Project\SubFolder\fileinsubfolder.txt 

Puedo hacer un subrepositorio de SubFolder. De la misma manera, puedo extraer todo lo demás un repositorio separado (en este ejemplo, el segundo repositorio solo tendría el archivo root.txt). Luego puedo agregar el repositorio SubFolder como un subrepositorio al segundo repositorio. Pero aunque ambos repositorios tienen el historial completo, estos historiales no están vinculados => la actualización del repositorio raíz a un estado anterior no colocará el subrepositorio en el estado que debería tener en ese punto. La actualización a una revisión anterior coherente (tanto el root como el subrepo se actualizan automáticamente) solo funcionará cuando se actualice a una revisión que ya sepa sobre el subrepositorio y tenga el archivo .hgsubstate.

Y la alternativa que pensé fue simplemente olvidar los archivos en SubFolder en el repositorio actual e ingresar un nuevo repositorio en SubFolder y al mismo tiempo agregar un archivo .hgsub. Lo que espero lograr aquí es trabajar a partir de este punto con un subrepositorio, pero todavía tengo una forma de actualizar a una revisión anterior (antes de separar el subrepo) porque los archivos de SubFolder aún están en el historial del repositorio actual.

Esto no funciona: cuando he olvidado los archivos en mercurial, he ingresado un nuevo repositorio y lo he vinculado como un subrepo en el repositorio actual y actualizo a una revisión anterior antes de que existiera el subrepo, aparece este error:

C:\Project>hg update 1 
abort: path 'SubFolder\fileinsubfolder.txt' is inside repo 'SubFolder' 

el problema aquí es que al actualizar a una versión anterior que no estaba al tanto de la subrepo, esta actualización quiere poner archivos en la subcarpeta. Pero este SubFolder sigue siendo otro repositorio (tiene un directorio .hg) y aunque el repositorio principal no tiene ningún recuerdo al respecto, la actualización no quiere poner archivos en el SubFolder ya que es un repositorio.

¿Hay alguna forma de evitar este error o hay un mejor método para pasar a usar un subrepo para una cierta carpeta en un repositorio de Mercurial existente y mantener el historial intacto (y ambos historiales vinculados)?

+0

Entonces, ¿cómo manejaste esto, sin la solución discutida con @Martin? ¿Funcionaría la solución "olvidar" si el subrepo estuviera ubicado en una ruta diferente (que los archivos originales)? En mi caso, estaba planeando mover los archivos de todos modos ... Volveré a publicar cómo funciona. – harpo

Respuesta

4

No, me temo que no hay herramientas que te permitan dividir un repositorio en la forma que pides.

sólo para aclarar su pregunta, a continuación, imaginemos que tiene un repositorio donde el contenido de root.txt y sub/file.txt evolucionar como esto

root.txt sub/file.txt` 
0: root 0 file 0 
1: root 1 file 1 
2: root 2 file 2 

para los tres primeros conjuntos de cambios. Lo que pide es una opción para hg convert que convertir esto en dos lugares de almacenamiento (fácil, podemos hacer que hoy en día) y donde la extensión convertido inyecta .hgsub y .hgsubstate archivos, de manera que los tres conjuntos de cambios contienen

root.txt .hgsub  .hgsubstate |  file.txt 
0: root 0 sub = sub <X> sub  | <X>: file 0 
1: root 1 sub = sub <Y> sub  | <Y>: file 1 
2: root 2 sub = sub <Z> sub  | <Z>: file 2 

donde el <X>, <Y> y <Z> hash son los correspondientes a las tres primeras confirmaciones en el subrepositorio.

No existe tal opción para hg convert en la actualidad, pero en base a lo anterior, parece factible escribir una. Eso le daría una gran manera de convertir entre un repositorio combinado y uno dividido.

+0

Esto de hecho es exactamente lo que me gustaría y sería perfecto para dividir un repositorio existente. – Christophe

+2

Bien, me alegro de que estemos de acuerdo en cuál es el problema ... ahora alguien necesita pasar tiempo implementándolo :) –

+0

Martin, ¿Sabría usted si esto se ha hecho? – devuxer

Cuestiones relacionadas