mercurial subrepos

mercurial - subrepo, hg clone y symlinks



subrepos (2)

Antes que nada, esa parte de Mercurial, no soy un experto, pero esto es lo que he entendido.

No, no creó un enlace a todo el directorio. En cambio, los archivos estaban enlazados en su interior.

Esto significa que el espacio en el disco está reservado para mantener la estructura de su directorio separada, pero los archivos son todos idénticos, porque fueron clonados, por lo que se construyen como enlaces al original.

Cuando empiezas a manipular el repositorio, a través de tus comandos de add o commit ( ci ), Mercurial rompe los enlaces duros y se crean archivos separados para cada uno, a pedido.

Ahora, esto es puramente una cosa técnica, no necesita saber o preocuparse por esto. Si lo hace más fácil, solo piense en un clon como una copia completa del repositorio original, archivos separados y todo eso. La parte de hardlink es solo para guardar el espacio de disco para las cosas que son iguales.

Como un proyecto típico tiene muchos archivos, y un conjunto de cambios típico solo cambia unos pocos archivos, y una razón típica para clonar es que vas a hacer un conjunto fijo de cambios, los enlaces duros tienen sentido ya que muchos de los archivos en los directorios del repositorio será 100% idéntico a su original durante la vida útil del repositorio.

Para aquellos que no lo son, todo eso es manejado silenciosamente por Mercurial para ti.

Soy bastante nuevo en mercurial, he leído mucho sobre este tema, pero no he podido encontrar una respuesta clara.

La guía mercurial dice: "Para mayor eficiencia, los enlaces duros se usan para la clonación siempre que el origen y el destino se encuentren en el mismo sistema de archivos (tenga en cuenta que esto solo se aplica a los datos del repositorio, no al directorio de trabajo)".

La página wiki del Repositorio dice: "Se dice que todos los archivos y directorios que coexisten con el directorio .hg en la raíz del repositorio viven en el directorio de trabajo".

Ahora, para "vincular" un subrepo en un repositorio principal, lo hago:

hg init main cd main echo subrepo = ../subrepo > .hgsub hg clone ../subrepo subrepo # (1) hg add hg ci -m "initial rev of the main repo"

¿La definición anterior significa que estoy creando una copia de subrepo cuando realizo (1)? ¿O solo estoy creando un enlace simbólico a ../subrepo ? Según la salida de ls , es una copia real. Pero suena tan extraño para mí ... Si alguien pudiera poner un poco de luz sobre este tema, lo agradecería.


Comencemos mirando lo que sucede cuando clonas sin hablar de los subrepositorios. Cuando tu lo hagas

$ hg clone A B

entonces Mercurial creará enlaces duros para los archivos dentro de A/.hg/store/data . Entonces, si un archivo llamado x es rastreado, entonces después del clon verá que

A/.hg/store/data/x.i

y

B/.hg/store/data/x.i

están vinculados de forma rígida; esto significa que los dos nombres de archivo se refieren realmente al mismo archivo . Como señala Lasse, esto es inteligente ya que nunca se puede realizar un cambio en el clon x , por lo que no hay ninguna razón para crear dos archivos xi diferentes para los clones A y B Otra ventaja es que es mucho más rápido hacer un enlace duro que copiar un archivo, especialmente si xi es muy grande: el enlace duro es una operación de tiempo constante.

En el ejemplo anterior, está agregando un subrepo de subrepo al repositorio main . Un subrepositorio consta de dos cosas:

  1. el subrepositorio mismo. Esto es lo que creas cuando lo haces

    $ hg clone ../subrepo

  2. los metadatos del subrepositorio. Esto es lo que almacena en el archivo .hgsub . Debe decirle a Mercurial dónde quiere el subrepositorio y desde dónde Mercurial puede clonarlo.

Usted pregunta si copia o si enlazó el repositorio simbólico, y ciertamente lo copió (clonó), como también lo ha confirmado con ls . Luego, agregó algunos metadatos a Mercurial que le indican dónde puede encontrar el subrepositorio. Esto no tiene nada que ver con un enlace simbólico en el sentido normal del sistema de archivos, solo son algunos metadatos de Mercurial.