2010-04-23 19 views
7

W starych dobrych czasach Subversion, czasami wyprowadzałem nowy plik z istniejącego pliku używając svn copy. Jeśli coś zmieniło się w częściach, które miały ze sobą wspólnego, nadal mógłbym użyć wersji svn merge, aby zaktualizować wersję pochodną.Czy w Mercurial mogę zastosować zmiany z jednego pliku do innego pliku w tej samej gałęzi?

Aby użyć przykładu z , powiedzmy, że przepis "guac" już istnieje i chcę utworzyć "superguac", który zawiera instrukcje, jak podawać guacamole 1000 fanom piłki nożnej. Korzystając z opisanego właśnie procesu, mogłem:

svn cp guac superguac 
svn ci -m "Created superguac by copying guac" 
(edit superguac) 
svn ci -m "Added instructions for serving 1000 raving soccer fans to superguac" 
(edit guac) 
svn ci -m "Fixed a typo in guac" 
svn merge -r3:4 guac superguac 

, a zatem poprawka literowa zostanie zastosowana do superguac.

Mercurial dostarcza komendę hg copy, która oznacza plik jako kopię oryginału, ale nie jestem pewien, czy struktura repozytorium obsługuje podobny przepływ pracy. Oto przykład taka sama, a ja uważnie edytować tylko jeden plik w popełnić chcę używać w korespondencji seryjnej:

hg cp guac superguac 
hg ci -m "Created superguac by copying guac" 
(edit superguac) 
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac" 
(edit guac) 
hg ci -m "Fixed a typo in guac" 

Teraz chcę, aby zastosować zmianę w guac to obowiązkowa pozycja do superguac. Czy to jest możliwe? Jeśli tak, to jaka jest właściwa komenda? Czy istnieje inny przepływ pracy w Mercurial, który osiąga takie same wyniki (ograniczone do jednego oddziału)?

+0

uznaję ten konkretny przykład jest dość łatwy w użyciu oddziałów i przekształcenie Mercurial rozwiązuje tę sytuację trywialnie. Niestety, w mojej prawdziwej aplikacji potrzebuję obu plików w tej samej gałęzi, stąd moja trudność ... – Stephen

+0

Po przemyśleniu tego więcej (i przetestowaniu obu rozwiązań w moim repozytorium), myślę, że obie odpowiedzi mają zalety. Gdybym znał wcześniej odpowiedź Rudiego, wszystkie modyfikacje mające zastosowanie do obu plików mogłyby skorzystać z jego metody. Niestety, ponieważ edytowałem oba pliki po kopii, rozwiązanie Ry4an zapewnia mi obejście tego problemu. Dziękuję im obu! – Stephen

Odpowiedz

6

Można to zrobić przez

hg cp guac superguac 
hg ci -m "Created superguac by copying guac" # CS1 
(edit superguac) 
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac" # CS2 
hg up -r revision-before-copy 
(edit guac) 
hg ci -m "Fixed a typo in guac" #CS3 
hg merge # this will transfer the typo-fix both to guac and superguac 
hg ci -m "merged typo-fix from guac" # CS4 

Po tym repozytorium wygląda tak

CS1 <--- CS2 <--------- CS4 
    \     /
    \--<-------- CS3 -<-/ 
+0

O, to jest podstępne ... (choć z prawidlowego punktu widzenia to nie jest tak) Więc twoje rozwiązanie tworzy wiele głów, a następnie je łączy.Ale na głębszym poziomie ta metoda "wprowadza" zmianę w historii superguaca z porządku chronologicznego. To naprawdę fajne i myślę, że mój mentalny model DVCS właśnie się poprawił! Dzięki! – Stephen

+0

Jednym z wyjaśnień, które DVCS ma nad CVCS, jest to, że ten ostatni zmusza cię do spojrzenia na historię commitów bardziej liniowo i w terminach "rewizji". Ten pierwszy ma DAG w sercu swojego modelu historii, który jest bardziej elastyczny i powinieneś myśleć o commitach jako zestawach "zmian". – Santa

+0

@Santa Czytałem o DAG, ale domyślam się, że tak naprawdę jeszcze tego nie zinternalizowałem. To naprawdę dobry przykład, aby pomóc mi zakotwiczyć to, co DAG naprawdę oznacza w DVCS (i ja również dzielę się nim w biurze, aby pomóc innym zrozumieć tę koncepcję). – Stephen

9

Nie ma czystej mercurial droga krzyżową plik ze swoimi łaty, ale jeśli patch jest zainstalowany w systemie można osiągnąć w zasadzie to samo, wykonując swój cykl rtęci poleceń z:

hg log -p -r tip -I quac | patch superquac 

to się zasadniczo mówiąc: „wziąć diff (-p), który został zastosowany do pliku quac (-I quac) w najnowszym changeset (-r tip) przesyła je do standardowego wyjścia (hg log) i użyć jej jako wejście do plastra (| patch) polecenie działające na fi le superquac (superquac).

+0

Hm ... Dla rozwiązania nie-hg jest to ładne i zwięzłe. Zastanawiam się również, czy rozszerzenie hg może być w porządku. Dzięki! – Stephen

+0

Może. Opuściłem svn, przechodząc od CVS prosto do mercurial, więc nigdy nie wiedziałem, że svn ma tę funkcjonalność. Szczerze mówiąc, brzmi to jak coś, co zniechęci do dobrego refaktoryzowania tego rodzaju, co eliminuje tworzenie tej samej łatki w wielu plikach. –

+0

Sądząc po tym, co mówi 'hg help log', powinno być możliwe określenie innego oddziału (' --branch BRANCH'), a tym samym nawet przeniesienie zmian z innego pliku w innej gałęzi. – Tobias

Powiązane problemy