2009-05-28 14 views
58

Tengo un repositorio de Mercurial que contiene un puñado de proyectos relacionados. Quiero ramificar solo uno de estos proyectos para trabajar en otro lugar.¿Cómo puedo clonar una subcarpeta de un repositorio en Mercurial?

¿Es posible la clonación solo como parte de un repositorio, y es esa la forma correcta de lograrlo?

+0

Por lo que he oído, esta es una de las razones para no poner varios proyectos en un repositorio. –

Respuesta

51

Lo que quiere es un narrow or partial clone, pero desafortunadamente aún no es compatible.

Si ya tiene un gran repositorio y se da cuenta de que lo que tendría sentido para dividirlo en varios repositorios más pequeños, a continuación, puede utilizar la convert extension hacer un Mercurial Mercurial a la conversión. Tenga en cuenta que esto crea un nuevo repositoriofoo y no puede empujar/jalar entre your-big-repo y foo.

El convert extension no está activada por defecto por lo que añadir lo siguiente al archivo de tu repositorio hgrc o su archivo mercurial.ini:

[extensions] 
hgext.convert= 

A continuación, cree un archivo map.txt con

include "libs/foo" 
rename "libs/foo" . 

(Nota Puede utilizar barras diagonales incluso en Windows) y ejecuta

$ hg convert --filemap map.txt your-big-repo foo 

Eso hará que foo sea un repositorio con el historial completo de la carpeta libs/foo de your-big-repo.

Si desea eliminar todas las pruebas de foo de your-big-repo puede hacer otra conversión donde use exclude libs/foo para deshacerse del directorio.

Cuando tenga varios repositorios como ese y quiera usarlos como un todo, entonces debería mirar subrepositories. Esta característica le permite incluir otros repositorios en el proceso de pago, de manera similar a cómo funciona el svn:externals. Por favor, siga el recommendations en esa página wiki.

+0

Gracias: he encontrado una solución para lo que tengo que hacer. Interesante para ver los problemas involucrados. –

+27

¿Cuál fue la solución que pudo idear? –

+20

Argh! "He descubierto una prueba verdaderamente maravillosa de esto, que este margen es demasiado estrecho para contener". – Matt

3

No es posible, hg clone clonará todo el repositorio.

Puede consultar la extensión de sub-repositorio que le permite tener repositorios dentro de un repositorio, que pueden coincidir con sus necesidades.

11

En lugar de hacer un clon parcial, puede usar el Convert Extension para dividir su repositorio en más de un repositorio por sub repositorio.

Específicamente, consulte la sección, Converting from Mercurial:

También es útil para filtrar repositorios Mercurial para obtener subconjuntos de uno ya existente. Por ejemplo, para transformar una subfoo subdirectorio de un foo repositorio en un repositorio con su propia vida (mientras se mantiene todo su historial), haga lo siguiente:

$ echo include subfoo > /tmp/myfilemap 
$ echo rename subfoo . >> /tmp/myfilemap 
$ hg convert --filemap /tmp/myfilemap /path/to/repo/foo /tmp/mysubfoo-repo 
2

Ésta es sencillo con la Convert extension.

+0

Esta es una solución muy válida, ¿por qué votó -1? – cheenu

+1

Supongo que es porque la solución realmente no permite clonar un subdirectorio desde un repositorio. En su lugar, le permite convertir un repositorio existente en un repositorio nuevo y más pequeño que luego puede clonar. –

+5

1) Como se indicó anteriormente, no está respondiendo la pregunta que hizo la pregunta original. 2) No explica que la pregunta original es imposible. Usted acaba de ofrecer algo diferente. 3) Usted da un enlace, en lugar de realmente explicar. –

6

He tropezado al otro lado de este problema y encontró una manera de hacerlo: El uso de enlaces simbólicos (sólo Linux desgracia)

Por ejemplo, si sólo necesita /project en el repositorio, en su clon equipo del repositorio en otro carpeta, luego use ln -s /repo/location/ project. Mercurial lo manejará

1

(finales de 2016) Mainline Mercurial sigue sin ser compatible con paquetes para "clones estrechos", pero hay extensiones de terceros que abordan el problema de diferentes maneras.

Si usted puede hacer frente a sólo una estrecha la caja (también conocido como "la caja escasa" o "pago y envío parcial por parte de la ruta del archivo") y luego sparse.py extensión de Facebook de la hg-experimental repository (observar el interior del directorio hgext3rd/) puede ser viable. En este escenario, aún clona el historial completo (por lo tanto, el directorio .hg no es más pequeño) pero su directorio de trabajo solo muestra/actúa en un subconjunto del repositorio completo.

Alternativamente Google ha creado un NarrowHG extension que hace clonación (también conocido como "clonación parcial por ruta de archivo"). Tendrá que tener el control del servidor, del cliente y estar dispuesto a usar funciones experimentales, pero realmente restringe el historial copiado del clon en .hg a un subconjunto de lo que estaba en el repositorio original.

Cuestiones relacionadas