significado - Hacer que los subrepositorios mercuriales se comporten como subversiones externas
mercurial vapor (2)
Las preguntas frecuentes y hginit.com han sido realmente útiles para ayudarme a hacer la transición de svn a hg.
Sin embargo, cuando se trata de usar la función de subrepositorio de Hg a la manera de los elementos externos de la subversión, lo he intentado todo y no puedo replicar el buen comportamiento de svn externals.
Este es el ejemplo más simple de lo que quiero hacer:
Repositorio init "lib" Este repositorio nunca debe usarse como independiente; siempre está incluido en los repositorios principales, como un sub-repositorio.
Inicia uno o más incluyendo repositorios Para mantener el ejemplo simple, voy a "iniciar" un repositorio llamado "principal"
Tener "main" incluir "lib" como un subrepositorio
Es importante: Y ESTO ES LO QUE NO PUEDO OBTENER PARA TRABAJAR: cuando modifico un archivo dentro de "main / lib", y presiono la modificación, ese cambio se envía al repositorio "lib" - NO a una copia dentro de "principal".
Las líneas de comando hablan más que las palabras. He intentado muchas variaciones sobre este tema, pero esta es la esencia. Si alguien puede responder, en líneas de comando, ¡estaré eternamente agradecido!
1. Iniciar el repositorio "lib"
$ cd / home / moi / hgrepos ## Donde estoy almacenando mis repositorios de hg, en mi servidor principal
$ hg init lib
$ echo "foo"> lib / lib.txt
$ hg add lib
$ hg ci -A -m "Init lib" lib
2. Inicie el repositorio "principal" e incluya "lib" como un subrepos
$ cd / home / moi / hgrepos
$ hg init main
$ echo "foo"> main / main.txt
$ hg add main
$ cd main
$ hg clone ../lib lib
$ echo "lib = lib"> .hgsub
$ hg ci -A -m "Init main".
Todo funciona bien, pero cuando hago un clon del repositorio "principal", y realizo modificaciones locales a los archivos en "main / lib", y los presiono, los cambios son empujados a "main / lib", NO a "lib ".
EN COMMAND-LINE-ESE, ESTE ES EL PROBLEMA:
$ / home / moi / hg-test
$ hg clone ssh: //[email protected]/hgrepos/lib lib
$ hg clone ssh: //[email protected]/hgrepos/main main
$ cd main
$ echo foo >> lib / lib.txt
$ hg st
M lib.txt
$ hg com -m "Lib.txt modificado, desde dentro del repositorio principal" lib.txt
$ hg push
presionando a ssh: //[email protected]/hgrepos/main/lib
La última línea de salida de hg muestra el problema.
Muestra que hice una modificación a una COPIA de un archivo en lib, NO a un archivo en el repositorio de lib. Si esto funcionara como me gustaría, el impulso sería para hgrepos / lib, NO para hgrepos / main / lib. Es decir, vería:
$ hg push
presionando a ssh: //[email protected]/hgrepos/lib
SI PUEDES RESPONDER ESTO EN TÉRMINOS
DE LÍNEAS DE COMANDOS EN LUGAR DE EN INGLÉS,
¡SERÉ ETERNAMENTE AGRADECIDO!
¡Gracias de antemano!
Emily en Portland
El problema es con su archivo .hgsub. Señala dónde está el repositorio de lib, así que si lib es un hermano para main debería ser:
lib=../lib
Además, su hg add lib
y hg add main
lines no tienen sentido. ¿A qué repositorio fuera de main y lib se están agregando? Los estás ejecutando mientras estás en /home/moi/hgrepos
.
Aquí está tu script con algunos ajustes:
+ cd /home/ry4an/hgtest
+ hg init lib
+ echo foo
+ cd lib
+ hg commit -A -m Init lib
adding lib.txt
+ cd /home/ry4an/hgtest
+ hg init main
+ echo foo
+ cd main
+ echo lib=../lib
+ hg clone ../lib
destination directory: lib
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ hg add .hgsub main.txt
+ hg commit -m Init main: initial file and a .hgsub
committing subrepository lib
+ cd /home/ry4an/hgtest
+ hg clone main main-clone
updating to branch default
pulling subrepo lib
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ cd main-clone
+ echo foo
+ hg commit -m Modified lib.txt, from inside the main repos
committing subrepository lib
+ hg push
pushing to /home/ry4an/hgtest/main
pushing subrepo lib
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
Para hacer eso a través de ssh: // solo necesitas hacer un solo cambio. Al clonar el repo principal cambiar hg clone main main-clone
a hg clone ssh://host/hgtest/main main-clone
- clonar el principal automáticamente clona la lib - ese es el beneficio del subrepo.
Aquí hay un registro de ese trabajo:
+ cd /home/ry4an/hgtest
+ hg init lib
+ echo foo
+ cd lib
+ hg commit -A -m Init lib
adding lib.txt
+ cd /home/ry4an/hgtest
+ hg init main
+ echo foo
+ cd main
+ echo lib=../lib
+ hg clone ../lib
destination directory: lib
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ hg add .hgsub main.txt
+ hg commit -m Init main: initial file and a .hgsub
committing subrepository lib
+ cd /home/ry4an/hgtest
+ hg clone ssh://localhost/hgtest/main main-clone
The authenticity of host ''localhost (::1)'' can''t be established.
RSA key fingerprint is 0c:58:d6:d3:d3:16:14:ee:3b:be:01:bc:c7:3c:92:0b.
Are you sure you want to continue connecting (yes/no)? yes
ry4an@localhost''s password:
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 3 changes to 3 files
updating to branch default
pulling subrepo lib
ry4an@localhost''s password:
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
remote: Warning: Permanently added ''localhost'' (RSA) to the list of known hosts.
+ cd main-clone
+ echo foo
+ hg commit -m Modified lib.txt, from inside the main repos
committing subrepository lib
+ hg push
ry4an@localhost''s password:
pushing to ssh://localhost/hgtest/main
pushing subrepo lib
ry4an@localhost''s password:
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
Vaya, disculpa por el formato en la respuesta anterior. Aquí está de nuevo, formateado!
Entonces, aquí están los dos escenarios que la mayoría de la gente enfrentará:
A) Usar subrepositorios en una situación completamente local. Esta es la solución de Ryan, esencialmente. Me imagino que solo los desarrolladores que trabajan en solitario estarán en este barco.
cd /home/moi/hgrepos
hg init lib
cd lib
echo foo > lib.txt
hg ci -A -m Init
cd /home/moi/hgrepos
hg init main
cd main
echo foo > main.txt
echo lib = ../lib > .hgsub
hg clone ../lib
hg add .hgsub main.txt
hg ci -m Init
cd /home/moi/hgrepos
hg clone main main-clone
cd main-clone/lib
echo "Modified while on main trunk" >>lib.txt
hg commit -m "Modified lib.txt, while on main trunk"
hg push
cd /home/moi/hgrepos/lib
hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
cat lib.txt
foo
Modified while on main trunk
-------------------------------------------------- ---------------
B) Usar subrepositorios en ssh.
Me imagino que la mayoría de los desarrolladores que trabajan en equipos estarán en este barco.
1) Configurar lib
cd /home/moi/hgrepos
hg init lib
cd lib
echo foo > lib.txt
hg ci -A -m Init
2) Configurar el principal
cd /home/moi/hgrepos
hg init main
cd main
echo foo > main.txt
echo lib=ssh://[email protected]/hgrepos/lib > .hgsub
hg clone ssh://[email protected]/hgrepos/lib lib
hg add .hgsub main.txt
hg ci -m Init
3) Clone lib a hgtest dir
cd /home/moi/hgtest
hg clone ssh://[email protected]/hgrepos/lib lib
4) Clon principal a hgtest dir
cd /home/moi/hgtest
hg clone ssh://[email protected]/hgrepos/main main
5) Modificar lib.txt mientras está en el tronco principal
cd /home/moi/hgtest/main/lib
echo "Modified while on main trunk" >>lib.txt
hg commit -m "Modified lib.txt, while on main trunk"
hg push
6) Verificar que lib.txt haya cambiado en el repositorio lib
cd /home/moi/hgtest/lib
hg pull
hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
cat lib.txt
foo
Modified while on main trunk