2013-07-30 14 views
6

Wiele plików w naszym repozytorium Mercurial zostało przeniesionych w pojedynczym zatwierdzeniu, ale te pliki nie zostały oznaczone jako o zmienionej nazwie. Co gorsza, niektóre pliki zostały zmodyfikowane w tym samym zatwierdzeniu.Naprawianie nazw w repozytorium Mercurial po zatwierdzeniu

Jak mogę wycofać zestaw zmian i wykryć nazwy poprawnie, zachowując zmiany i plik się porusza?

Odpowiedz

0
  1. Sporządź listę wszystkich modyfikacji dokonanych w plikach.
  2. Zaktualizuj z powrotem do wersji, w której pliki nie zostały przeniesione.
  3. Zmień nazwy plików.
  4. W razie potrzeby zmodyfikuj pliki wewnętrzne.
  5. Commit.
+0

Sporządzenie listy wszystkich modyfikacji, powrót do wcześniejszych zmian, a następnie ręczne uaktualnienie każdego pliku wydaje się najbardziej ręcznym sposobem wykonania tego. Miałem nadzieję na bardziej zautomatyzowany, niezawodny sposób. –

+0

Mercurial nie wie, jak zmiany muszą się różnić. Nie ma "zastępowania usuniętych i dodanych plików, których nazwy są podobne w przypadku zmiany nazwy tych plików". Git byłby tu lepszy, szukał treści i prawdopodobnie sugerowałby zmianę nazw plików lub czegoś, zamiast kasowania i dodawania plików. – MrFox

2

Zautomatyzowana wersja odpowiedzi MrFox za

  1. zmiany wywóz "złego" changeset język patch-pliku (git formatu, może) lub zapisać do bundle lub przekształcić go w MQ-plaster
  2. aktualizacji dir pracy do rodzica złej changeset
  3. Zastosuj poprawkę | import wiązki
  4. Zastosowanie hg addremove -s NN w zmodyfikowanej pracy dir w celu wykrycia Zmienia nazwę (NN muszą być uznane przez strony, wszystkie zmienia nazwy muszą zostać wykryte w wyniku), sprawdź resul ts zgadywania z hg status -C powtórzyć adremove aż poprawny wynik nie otrzymał
  5. Commit wyrób nowy changeset
10

Jest alternatywą do edycji historii (aka mucking w MQ) do mocowania zmienia nazwę. Procedura ręczna jest określona jako here jako logika, której używa rozszerzenie fixrenames.

Proces ręczny wygląda następująco. Dla każdej wersji N, dla której nie ma nazw oznaczonych:

$ hg update n-1 
$ hg revert --all --rev n 
$ hg addremove -s 70 
$ hg commit -m "Fix renames from n" 
$ hg merge n 

Pamiętaj, że flaga podobieństwa czasami wymaga gry na skrzypcach. Powodem jest to, że nazwy prawie nigdy nie są czystymi nazwami. Na przykład zmiana nazwy klasy wymaga zmiany w pliku, jak również zmiany nazwy pliku. W związku z tym nie są w 100% takie same. Będziesz musiał sprawdzić, co robi addremove i upewnić się, że dodane pliki są oznaczone jako "X (zmieniono nazwę z Y)".

W ten sposób można odzyskać pełną historię bez ręcznej pracy. Musiałem to zrobić dzisiaj (bez korzystania z rozszerzenia fixrenames) i zajęło mi to około 5 minut, aby naprawić.

Można nawet zastosować tę procedurę, gdy istnieją zestawienia złożone, które należy naprawić.

Wykres zestawu zmian wyglądałby tak: Rozważmy Zestawienia zmian A, B, C, D. & B i D nie miały nieprawidłowych Zmienia nazwę:

D 
| 
C 
| 
B 
| 
A 

Najpierw aktualizacji A, wykonać Ustalone przywrócić B wykonać addremove i zobowiązać się w E. Następnie połączyć C do E jak F, ponieważ C nie miało w tym nic złego.Powinieneś zobaczyć coś takiego:

F D 
|\| 
| C 
| | 
E B 
|/ 
A 

Teraz stosuje się takie same dla D. Aktualizujemy do F, powraca z D addremove i zobowiązać się do G. Teraz wystarczy połączyć, aby zamknąć dodatkową głową. Powinieneś zobaczyć coś takiego:

H 
|\ 
G | 
| | 
F D 
|\| 
| C 
| | 
E B 
|/ 
A 

Jeśli chcesz się przekonać siebie, że to działało zawsze można

hg diff -r D -r H 

zależności od narzędzia, zobaczysz ani żadnej różnicy albo zmiany nazwy plików wymienione ale bez różnic między nimi.

+0

Wiersz poleceń mówi 'hg merge n', ale wykres wskazuje połączenie z' n + 1'? –

Powiązane problemy