2010-01-18 16 views
36

SituaciónMercurial Subrepos: ¿cómo se crean y cómo funcionan?

Tengo dos .NET soluciones (Foo y Bar) y una biblioteca común que contiene ProjectA, ProjectB, y ProjectC. Foo y Bar hacen referencia a uno o más proyectos de biblioteca, pero los proyectos de biblioteca no se encuentran dentro de las carpetas de soluciones Foo y Bar.

estructura de directorios:

-- My Documents* 
    -- Development 
     -- Libraries 
     -- ProjectA 
     -- ProjectB 
     -- ProjectC 
    -- Projects 
     -- Foo 
     -- Solution 
      -- .hg 
      -- .hgignore 
      -- Foo { Project Folder } 
      -- FooTests { Project Folder } 
      -- Foo.sln { References ProjectA } 
      -- Foo.suo 
     -- Bar 
     -- Solution 
      -- .hg 
      -- .hgignore 
      -- Bar { Project Folder } 
      -- BarTests { Project Folder } 
      -- Bar.sln { References ProjectA and ProjectB } 
      -- Bar.suo 

* por desgracia, todavía estoy usando Windows XP ...

Mercurial Subrepositories

Meta - Quiero configurar subrepos para que pueda almacenar el código fuente de cualquier proyecto de biblioteca referenciado en mi Foo y Bar repositorios.

Según this page (que es literalmente la única documentación que puedo encontrar en subrepos), la creación de un subrepo requiere ejecutar los siguientes comandos desde una ventana de la consola de DOS:

1| $ hg init main 
2| $ cd main 
3| $ hg init nested 
4| $ echo test > nested/foo 
5| $ hg -R nested add nested/foo 
6| $ echo nested = nested > .hgsub 
7| $ hg add .hgsub 
8| $ ci -m "initial commit" 

Preguntas

  1. ¿Se puede ejecutar alguno o todos estos pasos con TortoiseHG a partir de la versión 0.9.2? Si es así, ¿cómo? Estoy bastante seguro de que las líneas 1-3 pueden, pero no sé sobre las líneas 4-7. Nada de esto parece estar documentado en TortoiseHG.
  2. ¿Qué hace el código anterior? (Una explicación línea por línea sería muy apreciada). Aquí hay algunas preguntas específicas que me vinieron a la mente cuando intentaba descifrarlo:
    • ¿Qué significa >? Intenté buscar en los documentos de Mercurial por >, pero no encontré nada.
    • En la línea 5, no entiendo qué es nested/foo. ¿De dónde vino foo? ¿Cuál es foo? Un repositorio? ¿Una carpeta?
    • Línea 6 - esto me desconcierta por completo.
    • En la línea 7, supongo que .hgsub se está agregando al main? ¿O se está agregando al nested?
  3. Digamos que le ponga las subrepos establecieron, y mi repositorio Bar corresponde ahora a la revisión 10. Si intento actualizar mi directorio de trabajo para la revisión 7, será esta causa mis carpetas de la biblioteca (My Documents/Development/Libraries/ProjectA y .../Libraries/ProjectB) a actualizar a lo que está almacenado en la revisión 7 también?

actualización

he añadido una octava línea de código: ci -m "initial commit". Esto hace dos cosas: (1) agrega a.el archivo hgsubstate al repositorio principal y (2) confirma todos los cambios, incluido el nuevo subrepo en el repositorio principal (con el mensaje "confirmación inicial"). El propósito del archivo .hgsubstate es realizar un seguimiento del estado de todos los subrepos, por lo que si regresa a una revisión anterior, también obtendrá la revisión correcta de todos los subrepos.


Actualización 2 - algunas instrucciones

Después de la experimentación, que pensar ahora puedo proporcionar los pasos para resolver mi problema original (utilizando la mayoría de Windows Explorer y TortoiseHG):

Crear un subrepo

  1. Libraries/ProjectA, Libraries/ProjectB, y los repositorios principales (Projects/Foo/Solution y Projects/Bar/Solution) deben ser repositorios separados.
  2. Abierto Projects/Foo/Solution.
  3. Clonar de Libraries/ProjectA a Projects/Foo/Solution.
  4. Agregue ProjectA al repositorio Foo.
  5. usar un editor de texto para crear un archivo llamado .hgsub, que contiene lo siguiente:

    ProjectA = ProjectA 
    
  6. Abra una ventana de la consola de DOS y escriba los siguientes comandos (ver nota más abajo):

    cd c:\...\Projects\Foo\Solution 
    hg ci -m "Committing subrepo "ProjectA" 
    
  7. Para Bar, los pasos son básicamente los mismos, excepto que el archivo .hgsub debe contener entradas para ambos proyectos, como este:

    ProjectA = ProjectA 
    ProjectB = ProjectB 
    

Nota: comenzando con TortoiseHG 0,10 (que está programado para marzo), usted será capaz de utilizar el comando HG Commit shell para hacer esto, pero por ahora, usted tiene que utilizar la línea de comandos .

Una vez que todo está configurado, se vuelve un poco más fácil.

confirmar los cambios - para confirmar los cambios en Foo o Bar, que hacen una operación Synchronize/Pull para cada subrepo para obtener los subrepos en sincronía con las últimas revisiones en los repositorios de proyectos biblioteca. Luego, nuevamente usa la línea de comando para confirmar los cambios (hasta la versión 0.10, cuando puede usar TortoiseHG para confirmar).

Actualización del directorio de trabajo a una revisión anterior - Esto parece funcionar bastante normalmente con TortoiseHG y no parece requerir el uso de ningún comando de DOS. Para trabajar realmente con la revisión anterior en Visual Studio, deberá realizar una operación Synchronize/Push para volver a colocar la versión anterior de los proyectos de la biblioteca en la carpeta Libraries/ProjectX.

Por mucho que me gusta TortoiseHG para tareas simples, es probable que sea mejor escribir archivos por lotes para las operaciones subrepo de uso frecuente (especialmente las actualizaciones).

Espero que esto ayude a alguien en el futuro. Si ve algún error, hágamelo saber (o siéntase libre de editarse si puede).

Respuesta

20

Probablemente puedas probar estas cosas y aprender más rápido que escribir tu pregunta, pero voy a morder.

Puede alguno o todos estos pasos se ejecutada con TortoiseHG, a partir de la versión 0.9.2 ? Si es así, ¿cómo?

TortiseHG aún no pone envoltorios GUI en la creación de sub-repo, pero TortiseHG siempre ha hecho un gran trabajo al trabajar con la línea de comandos. Usa la línea de comando para crearlos y estarás listo.

Lo que hace el código anterior hacer (un explicación línea por línea sería mucho apreciado).

hg init main # creates the main repo 
cd main # enter the main repo 
hg init nested # create the nested. internal repo 
echo test > nested/foo # put the word test into the file foo in the nested repo 
hg -R nested add nested/foo # do an add in the nested repo of file foo 
echo nested = nested > .hgsub # put the string "nested = nested" into a file (in main) named .hgsub 
hg add .hgsub # add the file .hgsub into the main repo 

Éstos son algunos preguntas específicas que vienen a la mente mientras estaba tratando de descifrarlo: ¿Qué significa> hacer?

Eso no tiene nada que ver con mercurial es shell estándar (Unix y DOS) para "poner el resultado en un archivo denominado X"

En la línea 5, que no entender lo que anida/foo es. ¿De dónde vino el foo ? ¿Qué es foo? ¿Un repositorio ? ¿Una carpeta?

Es un archivo en el subrepo. Foo es un nombre arbitrario tradicional, y los contenidos arbitrarios son la "prueba" cadena

Línea 6 - esto uno me desconcierta por completo.

Está poniendo el contenido en .hgsub necesario para decir que anidado es un repositorio anidado llamado anidado y ubicado en anidado.

En la línea 7, Asumo .hgsub se añade a principal? ¿O se está agregando a anidado?

principal

Digamos que le ponga las subrepos establecieron, y mi repositorio Bar es ahora hasta revisión 10. Si intento actualizar a revisión 7, será esta causa mi biblioteca carpetas (Mi Documentos/Desarrollo/Bibliotecas/Proyecto A y .../ Bibliotecas/ProjectB) para actualizar a lo que se almacena en la revisión 7 como ¿bien? Dado que Foo también se refiere a Libraries/ProjectA, ¡esto podría obtener interesante!

Los números de revisión no se transmitirán, pero tiene el control editando el archivo .hgsubstate.

+0

+1 esta es una gran respuesta, gracias. – devuxer

+3

+1 por ser amable. – Zack

6

Solo una actualización rápida, después del lanzamiento de TortoiseHg 1.0.

El soporte de subrepo en THG 1 es lo suficientemente bueno como para permitirle hacer pasos de ejemplo desde Windows Explorer. El único que no podía hacer desde el Explorador era el paso 6:

echo nested = nested > .hgsub 

explorador de Windows (en XP al menos) informa de un error de cambio de nombre "Debe escribir un nombre de archivo." si intenta cambiar el nombre de "Nuevo documento de texto.txt" a ".hgsub". * 8')

Editar: Por cierto, si se utiliza tanto hg través TortoiseHg y la línea de comandos y que aún no dispone de Microsoft de 'comandos aquí' PowerTool instalado, puedo recomendar encarecidamente. Agrega una entrada del menú contextual "Abrir ventana de comando aquí" a cada directorio en el Explorador de Windows, lo que facilita abrir las ventanas de comandos en cualquier lugar que las necesite.

+0

Use su editor de texto favorito para crear el archivo, luego cuando haga un guardar como, puede ponerle el nombre .hgsub. –

+0

Sí, pero aún así es irritante. En lugar de simplemente crear el archivo en la ventana del Explorador que ya tiene abierto (ya que está usando TortoiseHg), debe iniciar otro programa, escribir los contenidos y, lo más importante, encontrar la ubicación nuevamente en el cuadro de diálogo del archivo de editores. Personalmente, instalé el PowerToy "Command Prompt Here" en cada máquina que toco, por lo que es mucho más fácil simplemente usar la línea de comando para crear el archivo. –

+4

Sugerencia rápida: si está utilizando Windows 7 no necesita instalar nada, solo presione Mayús + Clic derecho y seleccione "Abrir ventana de comandos aquí" –

Cuestiones relacionadas