2010-12-08 26 views
8

Soy bastante nuevo en mercurial, he leído mucho sobre este tema, pero no he podido encontrar una respuesta clara.subrepo, hg clon y enlaces simbólicos

The mercurial guide dice: "Para la eficacia, los enlaces duros se utilizan para la clonación siempre que el origen y el destino estén en el mismo sistema de archivos (tenga en cuenta que esto se aplica únicamente a los datos del repositorio, no al directorio de trabajo).

Repository wiki page dice: "Todos los archivos y directorios que coexisten con el directorio .hg en la raíz del repositorio se dice que viven en el directorio de trabajo".

Ahora, a "enlace" una subrepo en un acuerdo de recompra principal que 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 en realidad estoy creando una copia de subrepo cuando (1) realizo? ? ¿O solo estoy creando un enlace simbólico al ../subrepo? De acuerdo con la salida 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.

+1

Solo un pequeño detalle porque usó ambas palabras como si fueran intercambiables: [los enlaces duros no son enlaces simbólicos] (http://linuxgazette.net/105/pitcher.html). La diferencia radica básicamente en que los enlaces duros se encuentran dentro de un sistema de archivos y no se pueden romper, mientras que los enlaces simbólicos solo contienen una ruta y pueden apuntar a otros sistemas de archivos. Mercurial solo usa enlaces duros. –

Respuesta

6

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 su estructura de directorios separada, pero los archivos son todos idénticos, porque fueron clonados, por lo que se construyen como enlaces al original.

Al iniciar la manipulación del depósito, a través de sus comandos add o commit (ci), a continuación, los enlaces duros se rompen por Mercurial y archivos separados están construidos para cada uno, bajo demanda.

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.

Dado que 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 usted.

+0

+1 Internals aparte, uno debe seguir las prácticas normales de clonación. Sin embargo, está bien jugar con fines de aprendizaje. – pyfunc

2

Comencemos mirando lo que sucede cuando se clona sin hablar de subrepositorios. Cuando lo haga

$ hg clone A B 

continuación Mercurial hará enlaces duros de los archivos dentro de A/.hg/store/data.Así que si un archivo llamado x se realiza un seguimiento, a continuación, después de que el clon se verá que

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

y

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

son enlaces duros - esto significa que los dos nombres de archivo realmente se refieren al mismo archivo . Como señala Lasse, esto es inteligente ya que nunca se puede realizar un cambio al clon x, por lo que no hay razón para crear dos archivos x.i 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 x.i es muy grande: el enlace duro es una operación de tiempo constante.

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

  1. el subrepositorio en sí. Esto crea lo que cuando lo hace

    $ hg clone ../subrepo 
    
  2. los metadatos subrepository. 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.

le preguntas si copia o enlace simbólico del repositorio, y que sin duda copiado (clonado), como también se 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.

Cuestiones relacionadas