2010-04-03 18 views
6

Las preguntas frecuentes y hginit.com han sido realmente útiles para ayudarme a hacer la transición de svn a hg.Hacer superpositorios mercuriales comportarse como subversión externos

Sin embargo, cuando se trata de utilizar la función de subrepositorio de Hg a la manera de los elementos externos de subversión, he intentado con todo y no puedo reproducir el buen comportamiento de svn externals.

Aquí está el ejemplo más sencillo de lo que quiero hacer:

  1. Init "lib" repositorio Este repositorio es no volver a ser utilizado como un independiente; siempre está incluido en los repositorios principales , como un sub-repositorio.

  2. Init incluyendo uno o más repositorios para mantener el ejemplo sencillo, voy a "init" un repositorio llamado "principal"

  3. tiene "principal" incluyen "lib" como subrepository

  4. Importante: Y AQUÍ HAY LO QUE NO PUEDO OBTENER PARA TRABAJAR: Cuando modifico un archivo dentro de "main/lib", y presiono la modificación, , entonces ese cambio se envía al repositorio "lib" - NO a una copia dentro de "main".

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. Init "lib" del repositorio

$ cd/home/moi/## hgrepos Dónde estoy almacenar 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. Init repositorio "principal", e incluyen "lib" como subrepos

$ cd/home/moi/hgrepos

$ hg init principales

$ echo "foo"> principal/main.txt

$ hg agregar

$ cd principal

$ clon principal hg ../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 se colocan en "main/lib" , NO a "lib".

EN LÍNEA DE COMANDO-ESE, este es el problema:

$/home/moi/hg-test

$ hg clone ssh: //[email protected]/hgrepos/ lib lib

$ hg clone ssh: //[email protected]/hgrepos/main principal

$ cd principales

$ echo foo >> lib/lib.txt

$ hg st

M lib.txt

$ hg com -m "lib.txt Modificado, desde el interior de las principales repos" lib.txt

$ hg empuje

empujando a ssh: //[email protected]/hgrepos/main/lib

La última línea de salida de hg muestra el problema.

Muestra que he hecho una modificación a una COPIA de un archivo en lib, NO a un archivo en el repositorio lib. Si esto funcionara como me gustaría, el impulso sería para hgrepos/lib, NO para hgrepos/main/lib. Es decir, me gustaría ver:

$ hg empuje

empujando a ssh: //[email protected]/hgrepos/lib

si puede responder a esto en términos

DE LÍNEAS DE COMANDO EN LUGAR DE EN INGLÉS,

¡SERÉ ETERNAMENTE AGRADECIDO!

¡Gracias de antemano!

Emily en Portland

+1

Emily, me alegro de que trabajó. ¿Qué tal si selecciono mi respuesta? Esa es la recompensa habitual por el tiempo dedicado a ayudar aquí en SO. Sus revisiones de la respuesta generalmente van a un comentario sobre el mío o a una edición de 'Actualización' de su pregunta, no a una respuesta en sí misma. –

+0

Y en realidad, al ver las instrucciones de ssh: //, lo está pensando demasiado. Después de seguir mis pasos para configurar una configuración de subrepo local, puede clonar el repositorio 'principal' sobre ssh y mercurial creará toda la configuración main/lib en el repositorio remoto haciendo ambos pulls. Esa es la verdadera promesa de los subrepos: un solo clon le proporciona múltiples repositorios anidados. –

Respuesta

8

El problema es con el archivo .hgsub. Apunta a que la cesión temporal lib es, por lo que si lib es un hermano de principal que debe ser:

lib=../lib 

también sus hg add lib y hg add main líneas no tienen sentido. ¿A qué repositorio fuera de main y lib se están agregando? Los está ejecutando mientras está en /home/moi/hgrepos.

Aquí está tu guión 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 

de hacer eso a través de ssh: // sólo tiene que realizar un solo cambio. Al clonar el repositorio principal cambie hg clone main main-clone a hg clone ssh://host/hgtest/main main-clone - clonando el principal clona automáticamente el 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 
[email protected]'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 
[email protected]'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 
[email protected]'s password: 
pushing to ssh://localhost/hgtest/main 
pushing subrepo lib 
[email protected]'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 
1

Vaya, lo siento por el formato en la respuesta anterior. Aquí está de nuevo, formateado!

lo tanto, aquí están los dos escenarios de la mayoría de la gente se le enfrenta con:

a) Usando subrepositories en una situación completamente local. Esta es la solución de Ryan, esencialmente. Imagino que solo los desarrolladores que trabajen solos 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) Uso de subrepositorios en ssh.
Imagino que la mayoría de los desarrolladores que trabajan en equipos estarán en este barco.

1) Establecer lib

cd /home/moi/hgrepos 
hg init lib 
cd lib 
echo foo > lib.txt 
hg ci -A -m Init 

2) Configurar 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) lib Clone a hgtest dir

cd /home/moi/hgtest 
hg clone ssh://[email protected]/hgrepos/lib lib 

4) Clone principal para hgtest dir

cd /home/moi/hgtest 
hg clone ssh://[email protected]/hgrepos/main main 

5) Modificar lib.txt mientras que 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 se cambió 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 
Cuestiones relacionadas