2010-12-16 9 views
18

Mi proyecto se compone de código en los siguientes lugares¿Tiene un subrepositorio mercurial un subdirectorio del repositorio principal?

C:\Dev\ProjectA 
C:\Lib\LibraryB 
C:\Lib\LibraryC 

Actualmente cada una de estas carpetas es un repositorio Mercurial completamente independiente. El Proyecto A cambia todo el tiempo, la Biblioteca B y la Biblioteca C cambian raramente.

Actualmente etiqueto cada versión del Proyecto A a medida que se lanza y (cuando recuerdo) pongo una etiqueta correspondiente en los repositorios de la Biblioteca B y C.

¿Puedo mejorar esto usando subrepositorios? ¿Eso requeriría que haga de la Biblioteca B y C un subdirectorio del Proyecto A?

Si la Biblioteca B y C deben ser subdirectorios del Proyecto A, ¿qué hago si quiero iniciar un Proyecto D que utiliza la Biblioteca B pero que no está afiliado al Proyecto A en absoluto?

Respuesta

18

Si Biblioteca B y C deben ser subdirectorios del Proyecto A lo puedo hacer si quiero iniciar un proyecto D que utiliza Biblioteca B, pero no es lo contrario afiliado con el proyecto A en absoluto?

Cualquier proyecto puede existir tanto en forma independiente y como subrepository de otro proyecto al mismo tiempo. Explicaré sugiriendo un flujo de trabajo.

En primer lugar, cada uno de sus proyectos (A, B, C) debe tener un repositorio bendita que se publica en alguna parte:

blessed repository

Usted podría funcionar hgwebdir en su propio servidor, o hacer uso de un servicio de alojamiento Mercurial como Bitbucket o Kiln. De esta manera, los desarrolladores tienen un punto central de autorización para hacer/alejar los cambios, y usted tiene algo para hacer copias de seguridad.

Ahora usted puede hacer clones de estos repositorios para trabajar en dos modos diferentes:

  • clonar directamente su proyecto. Por ejemplo:

    hg clone http://bitbucket.org/LachlanG/LibraryB C:\Lib\LibraryB 
    
  • y/o crear definiciones subrepository poniendo un archivo .hgsub en la raíz de ProjectA con el siguiente contenido:

    libraries/libraryB = http://bitbucket.org/LachlanG/LibraryB 
    libraries/libraryC = http://bitbucket.org/LachlanG/LibraryC 
    

Estas definiciones subrepository indicarle a Mercurial que cada vez que se clona el Proyecto A, también debe colocar los clones de la Biblioteca B y la Biblioteca C en la carpeta libraries.

Si está trabajando en el Proyecto A y confirma, sus cambios en libraries/LibraryB y libraries/LibraryC se cometerán también. Mercurial registrará qué versión de las bibliotecas está utilizando el Proyecto A en el archivo .hgsubstate. El resultado es que si hg update a una versión anterior del proyecto para ver cómo funcionó la semana pasada, también obtendrá la versión correspondiente de sus bibliotecas. Ni siquiera necesita crear etiquetas :-)

Cuando hg push el Proyecto A cambia al depósito bendecido, Mercurial también se asegurará de hacer que los cambios en el subrepositorio primero sean de su propio origen. De esta forma, nunca publica accidentalmente cambios de proyecto que dependen de cambios de biblioteca no publicados.

Si prefiere mantener todo local, puede seguir utilizando este flujo de trabajo utilizando rutas de acceso relativas en lugar de URL en las definiciones del subrepositorio.

+0

Dónde está la carpeta de bibliotecas que menciona al final de la oración, "Estas definiciones de subrepositorio indican a mercurial que cada vez que se clona projectA, también debe colocar clones de LibraryB y LibraryC en la carpeta de bibliotecas." – LachlanG

+0

Es solo una carpeta, la parte izquierda de: libraries/libraryB = http://bitbucket.org/LachlanG/LibraryB es donde el clon del lado derecho debería ser –

+0

@LachlanG: aparecerá en la raíz del ProyectoA clonar, por ejemplo 'C: \ Dev \ ProjectA \ libraries \'. –

2

Se puede declarar de hecho B y C subrepos de proyecto A (aparecerán como subdirectorio, como se describe en Mercurial Subrepository).
que mejorarían su mecanismo de liberación, ya que le permitirá:

  • obtener todos los repositorios en un solo lugar (A y bajo)
  • referencia una etiqueta exacta de B y C bajo A
  • etiqueta de cada uno sub-repo s primero si tenían alguna modificación
  • etiqueta A con la información sobre B y C etiquetas en él (cualquier clon de A será capaz de ct etiquetas de B y C utilizados por A)

También pueden declarar como B subrepo de D, independientemente A. Lo que haga en A (con respecto a B) no tendrá consecuencias para B utilizado en D.

Cuestiones relacionadas