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
- ¿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.
- ¿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 vinofoo
? ¿Cuál esfoo
? Un repositorio? ¿Una carpeta? - Línea 6 - esto me desconcierta por completo.
- En la línea 7, supongo que
.hgsub
se está agregando almain
? ¿O se está agregando alnested
?
- ¿Qué significa
- 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
Libraries/ProjectA
,Libraries/ProjectB
, y los repositorios principales (Projects/Foo/Solution
yProjects/Bar/Solution
) deben ser repositorios separados.- Abierto
Projects/Foo/Solution
. - Clonar de
Libraries/ProjectA
aProjects/Foo/Solution
. - Agregue
ProjectA
al repositorioFoo
. usar un editor de texto para crear un archivo llamado
.hgsub
, que contiene lo siguiente:ProjectA = ProjectA
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"
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).
+1 esta es una gran respuesta, gracias. – devuxer
+1 por ser amable. – Zack