español - mercurial repositorio
¿Cómo convertir un repositorio Mercurial existente para usar subrepositorios y mantener el historial intacto? (1)
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:/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.
Sin embargo, 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 revisión anterior que no conocía el subrepo, esta actualización quiere poner archivos en el SubFolder. 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 manera de evitar este error o hay un mejor método para pasar a utilizar un subrepo para una determinada carpeta en un repositorio Mercurial existente y mantener el historial intacto (y ambos historiales vinculados)?
No, me temo que no hay herramientas que te permitan dividir un repositorio de la manera que pides.
Para aclarar su pregunta, imaginemos que tiene un repositorio donde el contenido de root.txt
y sub/file.txt
evolucionan así
root.txt sub/file.txt`
0: root 0 file 0
1: root 1 file 1
2: root 2 file 2
para los primeros tres conjuntos de cambios. Lo que usted solicita es una opción para hg convert
que convertiría esto en dos repositorios (es fácil, podemos hacerlo hoy) y donde la extensión de conversión inyecta archivos .hgsub
y .hgsubstate
para que los tres conjuntos de cambios contengan
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 los hashes <X>
, <Y>
y <Z>
son los correspondientes a las tres primeras confirmaciones en el subrepositorio.
No existe tal opción para hg convert
hoy, pero en base a lo anterior, parece factible escribir uno. Eso le daría una gran manera de convertir entre un repositorio combinado y uno dividido.