2010-04-03 17 views
6

Najczęściej zadawane pytania i hginit.com były bardzo przydatne, aby pomóc mi przejść od svn do hg.Tworzenie pod-zachowań mercurial zachowują się jak subversion externals

Jednakże, jeśli chodzi o użycie podskarku Hg w charakterze zewnętrznych elementów subversion, próbowałem wszystkiego i nie mogę replikować ładnego zachowania zewnętrznych svn.

Oto najprostszy przykład tego, co chcę zrobić:

  1. Init „lib” repozytorium To repozytorium nie ma być używany jako samodzielny; jest zawsze dołączane przez główne repozytoria , jako podkatalog.

  2. Init jeden lub więcej tym repozytoriów zachować prosty przykład, będę "init" repozytorium o nazwie "main"

  3. Have "główną" obejmują "lib" jako subrepository

  4. Co ważne - A TUTAJ NIE MOŻNA DOSTAĆ DO PRACY: Kiedy modyfikuję plik wewnątrz "main/lib", a ja pchnę modyfikację, , to zmiana zostanie przekazana do repozytorium "lib" - NIE do kopii wewnątrz "głównego".

Wiersze poleceń mówią głośniej niż słowa. Próbowałem wielu wariacji na ten temat, ale tutaj jest sedno. Jeśli ktoś może odpowiedzieć, w liniach poleceń, będę zawsze wdzięczny!

1. Init "lib" repozytorium

$ cd/home/moi/hgrepos ## Gdzie ja przechowywania moje repozytoria Hg, na moim głównym serwerem

$ hg startowych lib

$ echo "foo"> lib/lib.txt

$ hg dodać lib

$ hg CI -A -m "Init lib" lib

2. Init "main" repozytorium, a to "lib" jako subrepos

$ cd/home/moi/hgrepos

$ hg startowe główne

$ echo "foo"> main/main.txt

$ hg dodawać główny

$ cd głównego

$ hg clone ../lib lib

$ echo "lib = lib"> .hgsub

$ hg ci -A -m "Init main".

Wszystko działa dobrze, ale kiedy robię klon "głównego" repozytorium i dokonuję zmian w plikach w "main/lib" i wprowadzam je, zmiany zostają przeniesione do "main/lib" , NIE do "lib".

w podręczniku Command-line-ESE, to jest problem:

$/home/moi/hg-test

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

$ hg clone ssh: //[email protected]/hgrepos/main głównej

$ cd główne

$ echo foo >> lib/lib.txt

$ hg st

M lib.txt

$ hg com -m "zmodyfikowany lib.txt, od wewnątrz głównych repo" lib.txt

$ hg Push

do pchania ssh: //[email protected]/hgrepos/main/lib

Ta ostatnia linia danych wyjściowych z hg pokazuje problem.

Pokazuje, że dokonałem modyfikacji KOPIU pliku w bibliotece, a NIE pliku w repozytorium lib. Jeśli działało to tak, jak chciałbym, aby działało, push będzie do hgrepos/lib, NIE do hgrepos/main/lib. To znaczy, chciałbym zobaczyć:

$ hg Push

popychanie do ssh: //[email protected]/hgrepos/lib

Jeśli możesz odpowiedzieć na to POD WZGLĘDEM

OF LINIE KOMENDY RÓŻNIEJ NIŻ W ANGIELSKU,

ZOSTANĘ WIECZNIE wdzięczny!

Z góry dziękuję!

Emily w Portland

+1

Emily, ja cieszę się udało. Co powiesz na wybór mojej odpowiedzi? To jest zwykła nagroda za czas spędzony na pomaganiu tutaj w SO. Twoje poprawki do odpowiedzi zwykle trafiają do komentarza na mój temat lub do zmiany "Aktualizuj" na twoje pytanie, a nie samej odpowiedzi. –

+0

A tak naprawdę, patrząc na twoje instrukcje ssh: //, zastanawiasz się nad tym. Po wykonaniu moich kroków w celu skonfigurowania lokalnej konfiguracji subrepo, możesz po prostu sklonować "główne" repozytorium przez ssh i mercurial, aby utworzyć całe ustawienie główne/lib na zdalnym repo, wykonując oba ciągnięcia. To jest prawdziwa obietnica subrepos - pojedynczy klon dostaje wiele zagnieżdżonych repozytoriów. –

Odpowiedz

8

Problem jest z plikiem .hgsub. To wskazuje, gdzie lib repo jest, więc jeśli lib jest rodzeństwo do głównej powinno być:

lib=../lib 

Również twoi hg add lib i hg add main linie nie mają sensu. Do jakiego repozytu poza głównym i lib są dodawane? Używasz ich podczas pobytu w /home/moi/hgrepos.

Oto skrypt z pewnych usprawnień:

+ 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 

Aby to zrobić przez ssh: // trzeba zrobić tylko jedną zmianę. Podczas klonowania głównej zmiany repo hg clone main main-clone na hg clone ssh://host/hgtest/main main-clone - klonowanie głównego automatycznie klonuje bibliotekę - jest to korzyść subrepo.

Oto log że praca:

+ 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

Ups, przepraszam za formatowania w poprzedniej odpowiedzi. Tutaj znowu jest, sformatowany!

Tak, tu są dwa scenariusze większość ludzi będzie musiała zmierzyć się z:

a) stosując subrepositories w zupełnie lokalnej sytuacji. To jest rozwiązanie Ryana, zasadniczo. Wyobrażam sobie, że tylko twórcy pracujący solo będą w tej łodzi.

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) Korzystanie z podskładników przez ssh.
Wyobrażam sobie, że większość programistów pracujących nad zespołami będzie w tej łodzi.

1) powstałą lib

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

2), utworzony na głównym

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) Klonowanie lib hgtest dir

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

4) Klonowanie główny do hgtest dir

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

5) Modyfikacja lib.txt podczas głównego pnia

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) Sprawdź, lib.txt został zmieniony w lib repozytorium

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 
Powiązane problemy