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