2011-12-16 22 views
11

Niedawno zrobiliśmy hg copy katalogu w naszym repozytorium. Pomyśleliśmy, że to robi coś takiego jak cp -a i hg add i może oznaczać jakoś, że ten plik został skopiowany z innego pliku wewnątrz repo (tak, że hg annotate pokazuje pierwotnego użytkownika). Ale teraz wydaje się, że hg copy robi więcej lub inne rzeczy. Naprawdę nie mogłem znaleźć na temat tego, jak dokładnie działa ta kopia. Więc:Co robi kopia hg?

  • Co dokładnie hg copy robić i co robi to szczególne traktowanie przyczyny w przyszłości?
  • Jeśli okaże się, że w naszej sprawie jest "niewłaściwa rzecz" (tm), w jaki sposób mogę odfiltrować plik jako kopię innego pliku?

(To pytanie zadano na Mercurial dyskusyjnej, może chcesz follow the original thread zbyt.)

+0

Możesz również przeczytać [Kopiowanie plików] (http://tortoisehg.bitbucket.org/hgbook/1.7/mercurial-in-daily-use.html#chap:daily.copy) w [Mercurial: The Definitive Guide ] (http://tortoisehg.bitbucket.org/hgbook/1.7/) książka. – Matus

Odpowiedz

14
  • Co dokładnie robi hg kopia zrobić i jakie szczególne traktowanie robi to przyczyny w przyszłości?

Dodaje nowe pliki i oznacza je jako kopie starych plików. Ponieważ są to kopie, zmiana dokonana w oryginalnym pliku zostanie scalona w kopię. Czas płynie od lewej do prawej:

(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt) 
     \     /
     (hg copy a.txt b.txt) 
  • Jeśli okaże się to zrobić „coś złego (tm)” dla naszej sprawy, jak mogę usunięcie flagi pliku jako beeing kopię innego pliku ?

Ten mechanizm uruchamia się tylko po połączeniu. Jeśli b.txt nie jest obecny w wspólnej wersji przodka (init na powyższym wykresie), Mercurial wykona przeszukiwanie wstecz, aby sprawdzić, czy b.txt jest skopiowane z innego miejsca.

Daj nam kontynuować powyższy wykres w formie skróconej:

(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge) 
    \   /        /
    (copy a b) --/------- (edit b) ------------------/ 

Chodzi o to, w jaki sposób odbywa się końcowy seryjnej. Wspólny punkt przodka jest teraz węzłem copy a b i tutaj obecne są zarówno a i . Oznacza to, że nie będzie żadnego wyszukiwania kopii! Tak więc druga edycja do a wont zostać połączone w .

dokładnie sprawdzić, próbowałem go:

$ hg init 
$ echo a > a 
$ hg add a 
$ hg commit -m init 
$ hg copy a b 
$ hg commit -m "copy a b" 

Była to kopia, b zawiera teraz tylko a.

$ hg update 0 
0 files updated, 0 files merged, 1 files removed, 0 files unresolved 
$ echo aa >> a 
$ hg commit -m "edit a" 
created a new head 
$ hg merge 
merging a and b to b 
0 files updated, 1 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 
$ hg commit -m "a edit copied to b" 

Był to pierwszy scalania i edycja a została skopiowana do b:

$ cat b 
a 
aa 

Mamy teraz dokonać zmian równolegle:

$ echo aaa >> a 
$ hg commit -m "edit a again" 
$ hg update 3 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
$ echo bbb >> b 
$ hg commit -m "edit b" 
created new head 
$ hg merge 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

Nie ma dalsze kopiowanie odbywa :

$ cat a 
a 
aa 
aaa 
$ cat b 
a 
aa 
bbb 

Co do wyłączania tego ... nie można naprawdę jawnie wyłączyć wykrycia kopii . Ale, jak mam nadzieję zilustrować powyżej, po pierwszym scaleniu znowu "nie zawracam sobie głowy" tym .

Jeśli pierwszy scalania jest problem, można użyć hg resolve --tool internal:local, aby przywrócić pliki do stanu, zanim rozpoczął scalenie. Więc z

$ hg resolve --tool internal:local b 

mogliśmy przyniosły b powrót do nieco zawierający jedną linię z a.

+0

Niestety, ** nie może ** potwierdzić zmian kopiowania na głowach scalających w * moim * teście. '> hg version Mercurial Distributed SCM (wersja 2.0.1)' –

+0

Również nie w pierwszym scaleniu? Napisz [email protected], abyśmy mogli go w pełni omówić, to znacznie lepiej niż te małe pola komentarza :) –

+0

"Również nie w pierwszym scaleniu?" - tak. e-mail zanotowany, wiadomość zostanie wysłana (z logami) –