version control - source - Mercurial Subrepos: ¿cómo los creas y cómo funcionan?
subversion vs git 2018 (2)
Probablemente puedas probar estas cosas y aprender más rápido que escribir tu pregunta, pero voy a morder.
¿Se puede ejecutar alguno o todos estos pasos con TortoiseHG, a partir de la versión 0.9.2? Si es así, ¿cómo?
TortiseHG aún no pone envoltorios GUI en torno a 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.
¿Qué hace el código anterior? (Una explicación línea por línea sería muy apreciada).
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
Aquí hay algunas preguntas específicas que me vinieron a la mente cuando intentaba descifrarlo: ¿Qué hace?
Eso no tiene nada que ver con mercurial es shell estándar (unix y dos) para "poner el resultado en un archivo llamado X"
En la línea 5, no entiendo qué es anidado / foo. ¿De dónde vino 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 cadena "prueba"
Línea 6: esta me desconcierta por completo.
Es necesario poner el contenido en .hgsub para decir que anidado es un repositorio anidado llamado anidado y ubicado en anidado.
En la línea 7, ¿supongo que se está agregando .hgsub a main? ¿O se está agregando a anidado?
principal
Supongamos que configuro mis subrepos y mi repositorio de barras está ahora en la revisión 10. Si intento actualizar a la revisión 7, esto causará las carpetas de mi biblioteca (Mis documentos / Desarrollo / Bibliotecas / Proyecto A y ... / Bibliotecas / ProjectB) para actualizar a lo que está almacenado en la revisión 7 también? Dado que Foo también se refiere a Libraries / ProjectA, ¡esto podría ser interesante!
Los números de revisión no se transmitirán, pero usted tiene el control editando el archivo .hgsubstate.
Situación
Tengo dos soluciones .NET ( Foo
y Bar
) y una biblioteca común que contiene ProjectA, ProjectB y ProjectC. Foo
y Bar
referencia a uno o más proyectos de la biblioteca, pero los proyectos de la biblioteca no se encuentran dentro de las carpetas de Foo
and Bar
Solution.
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
Objetivo : quiero configurar subrepos para poder almacenar el código fuente de cualquier proyecto de biblioteca referenciado en mis repositorios Foo
y Bar
.
De acuerdo con esta página (que es literalmente la única documentación que puedo encontrar en subrepos), la configuración de un subrepo requiere la ejecución de 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 descifrarlas:
- ¿Qué hace
>
hacer? Traté de buscar en los documentos de Mercurial para>
, pero no encontré nada. - En la línea 5, no entiendo qué es
nested/foo
. ¿De dónde vinofoo
? ¿Qué esfoo
? Un repositorio? ¿Una carpeta? - Línea 6: esta me desconcierta por completo.
- En la línea 7, ¿supongo que se está agregando
.hgsub
amain
? ¿O se está agregando anested
?
- ¿Qué hace
- Digamos que configuro mis subrepos y mi repositorio de
Bar
está ahora en la revisión 10. Si intento actualizar mi directorio de trabajo a la revisión 7, esto causará 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 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 más experimentación, creo que ahora puedo proporcionar los pasos para resolver mi problema original (usando principalmente Windows Explorer y TortoiseHG):
Creando un subrepo
-
Libraries/ProjectA
,Libraries/ProjectB
y los repositorios principales (Projects/Foo/Solution
yProjects/Bar/Solution
) deben ser repositorios separados. -
Projects/Foo/Solution
AbiertosProjects/Foo/Solution
. - Clonar de
Libraries/ProjectA
aProjects/Foo/Solution
. - Agregue
ProjectA
al repositorio deFoo
. Use un editor de texto para crear un archivo llamado
.hgsub
, que contenga lo siguiente:ProjectA = ProjectA
Abra una ventana de la consola de DOS e ingrese los siguientes comandos (vea la nota a continuación) :
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), podrá usar el comando HG Commit
shell para hacer esto, pero por ahora, debe usar la línea de comando.
Una vez que todo está configurado, se vuelve un poco más fácil.
Confirmación de cambios : para realizar cambios en Foo
o Bar
, se realiza una operación Synchronize/Pull
para cada subrepo para que los subrepos estén sincronizados con las últimas revisiones en los repositorios de proyectos de la 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 : parece funcionar bastante bien con TortoiseHG y no parece requerir el uso de ningún comando de DOS. Para trabajar 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, probablemente sea mejor escribir archivos por lotes para las operaciones subrepo usadas con frecuencia (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).
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 pude hacer desde Explorer fue el paso 6:
echo nested = nested > .hgsub
Explorador de Windows (al menos en XP) informa 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 utilizas tanto hg a través de TortoiseHg como la línea de comandos y aún no tienes instalada la PowerTool "Command Here" de Microsofts, te lo recomiendo 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.