Subrepos mercuriales: ¿Cómo los creas y cómo funcionan?

Situación

Tengo dos soluciones .NET (Foo yBar) y una biblioteca común que contiene ProjectA, ProjectB y ProjectC.Foo yBar referencia uno o más proyectos de la biblioteca, pero los proyectos de la biblioteca no se encuentran dentro de laFoo yBar Carpetas de soluciones.

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 ...

Subrepositorios Mercuriales

Gol - Quiero configurar subrepos para poder almacenar el código fuente de cualquier proyecto de biblioteca referenciado en miFoo yBar repositorios.

De acuerdo aesta página (que es, literalmente, la única documentación que puedo encontrar en subpospos), la configuración de un subpopo requiere la ejecución de los siguientes comandos desde una ventana de 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

¿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é acerca de las líneas 4-7. Nada de esto parece estar documentado en TortoiseHG.¿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:Que hace> ¿hacer? Intenté buscar en los documentos de Mercurial>, pero no encontré nada.En la línea 5, no entiendo qué.nested/foo es. Donde hizofoo ¿viene de? Que esfoo? ¿Un repositorio? ¿Una carpeta?Línea 6 - esta me desconcierta por completo.En la línea 7, asumo.hgsub se está agregando amain? ¿O se está agregando anested?Digamos que tengo configurados mis subpospos, y misBar el repositorio ahora está en la revisión 10. Si intento actualizar mi directorio de trabajo a la revisión 7, esto causará que las carpetas de mi biblioteca (My Documents/Development/Libraries/ProjectA y.../Libraries/ProjectB) para actualizar a lo que está almacenado en la revisión 7 también?

Actualizar

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

Actualización 2 - algunas instrucciones

Después de más experimentación, yopensar Ahora puedo proporcionar los pasos para resolver mi problema original (utilizando principalmente el Explorador de Windows y TortoiseHG):

Creando un subrepo

Libraries/ProjectA, Libraries/ProjectB, y los repositorios principales (Projects/Foo/Solution yProjects/Bar/Solution) deben ser repositorios separados.AbiertoProjects/Foo/Solution.Clon deLibraries/ProjectA aProjects/Foo/Solution.AñadirProjectA alFoo repositorio.

Usa un editor de texto para crear un archivo llamado.hgsub, conteniendo lo siguiente:

ProjectA = ProjectA

Abra una ventana de consola de DOS e ingrese los siguientes comandos(vea la nota abajo):

cd c:\...\Projects\Foo\Solution
hg ci -m "Committing subrepo "ProjectA"

porBar, los pasos son básicamente los mismos, excepto que el archivo .hgsub debe contener entradas para ambos proyectos, como esto:

ProjectA = ProjectA  
ProjectB = ProjectB

Nota: a partir de TortoiseHG 0.10 (programado para marzo), podrá utilizar elHG Commit comando de shell para hacer esto, pero por ahora, tienes que usar la línea de comandos.

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

Cometiendo cambios - cometer cambios aFoo oBar, haces unSynchronize/Pull operación para cada subrepo para sincronizar los subrepos con las últimas revisiones en los repositorios de proyectos de la biblioteca. Luego, otra vez usa la línea de comandos 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 normalmente con TortoiseHG y no requiere el uso de ningún comando DOS. Para trabajar realmente con la revisión anterior en Visual Studio, deberá hacer unSynchronize/Push operación para poner la versión anterior de los proyectos de la biblioteca de nuevo en elLibraries/ProjectX carpeta.

Por mucho que me guste TortoiseHG para tareas simples, probablemente es mejor escribir archivos por lotes para operaciones de subrepo de uso frecuente (especialmente la actualización).

Espero que esto ayude a alguien en el futuro. Si ve algún error, avíseme (o siéntase libre de editarse si puede).

Respuestas a la pregunta(2)

Su respuesta a la pregunta