Mercurial: Czy mogę zmienić nazwę oddziału?

204

Mamy teraz gałąź „przeszywającą”, gdzie „inscenizacja” wydaje się znacznie lepszym dopasowaniem semantycznym. Jaka jest dobra strategia radzenia sobie z tym?

KevDog
źródło

Odpowiedzi:

223

Zaktualizuj stiginggałąź i utwórz z niej nową gałąź. Następnie zamknij stary oddział.

W podsumowaniu:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch
Elliot Cameron
źródło
1
To najlepszy sposób na zrobienie tego, co znalazłem. Zamknięcie gałęzi zapobiega przypadkowemu użyciu go przez inne osoby, ponieważ nie pojawia się na wyjściu „gałęzi hg”. Nadal umożliwia dostęp do niego później, jeśli znasz nazwę.
Przybory
2
Czy Mercurial pozwoli na ponowne użycie nazwy zamkniętego oddziału? To znaczy, jeśli masz gałąź v3, czy możesz użyć powyższej techniki, aby zmienić jej nazwę na v4, a następnie rozwidlić nową gałąź v3 pomimo pozostawienia zamkniętej wersji v3?
Joshua Goldberg
4
@JoshuaGoldberg, 3noch jest w błędzie. Mercurial będzie pozwalają na ponowne użycie nazwy zamkniętego oddziału, jeśli używasz --force. Na przykład: hg branch --force v3. Spowoduje to hg update v3aktualizację do nowej v3gałęzi, tak jak chcesz.
Gili
2
potwierdził komentarz @ Gili z oddziałem pomocy hg: „- wymusza ustawienie nazwy oddziału, nawet jeśli zasłania istniejącą gałąź”
Joshua Goldberg
7
Jeśli zamkniesz stigingprzed rozgałęzieniem, nie dostaniesz „luźnego końca”
max.mustermann
60

Dla przyszłych czytelników: Dzięki temu rebaserozszerzeniu możesz utworzyć nowy oddział z tym samym rodzicem co stigingi przenieść do niego całą historię oddziału, jak poniżej:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

Zakłada się, że stigingma tylko jednego rodzica. Oczywiście zamiast tego możesz użyć wyraźnych numerów wersji.

Uwaga 1: Jeżeli oddział stigingobejmuje łączy się z innymi oddziałami, ja myślę , że to będzie ich utrzymanie, jak długo stagingi stigingmają tego samego rodzica. Ale na pewno sprawdzę jeszcze raz.

Uwaga 2: Ponieważ to edytuje historię, stara gałąź nie zniknie ze sklonowanych repozytoriów (patrz rebasedokumentacja). Jeśli wszyscy nie będą mogli klonować od nowa, może to nie być bardzo praktyczne rozwiązanie dla dużej grupy.

Note3 / Edit (dzięki uprzejmości @JasonRCoombs): Teraz, gdy fazy są standardowe w mercurial, rebaseodmówi modyfikacji zestawów zmian, które zostały już wprowadzone. Oszukaj go, zmieniając fazę z powrotem na wersję roboczą (za pomocą hg phases) lub pozwól, aby stara gałąź pozostała tam, gdzie jest, i po prostu zrób odpowiednio nazwaną kopię (np. Z `hg rebase --keep ').

Alexis
źródło
+1 dla małych zespołów, w których możesz zmusić użytkowników do sklonowania, to dobry pomysł - lub użyj hg convertzamiast tego.
hochl
5
W późnych wersjach Mercurial polecenie rebase zakończy się niepowodzeniem z komunikatem „nie można zmienić niezmiennego zestawu zmian”, jeśli zmiany, które mają zostać przeniesione, są „publiczne”. Zmuś je do przeciągnięcia (z fazami hg) lub przejdź --keepdo polecenia rebase, które skopiuje zamiast przenieść zmiany.
Jason R. Coombs
W kroku 4: abort: can't rebase immutable changeset 11b1e2b7dc4f. Zauważ, że przeszczepiłem zestawy zmian z innej gałęzi do tej. Poza tym jest podzielony i nie łączy się.
Mark Jeronimus
@ Mark, spójrz na uwagę 3 powyżej.
Alexis
6
Zamiast zatwierdzać zestaw zmian w nowej gałęzi, a następnie bazować na niej, możesz to pominąć i użyć .dla swojej --destwartości, a baza automatycznie przyjmie nazwę nowej gałęzi.
weberc2,
16

Jeśli masz na nim zestawy zmian, będziesz musiał użyć rozszerzenia konwersji z mapą gałęzi, aby zmienić jego nazwę. Następnie wszyscy będą musieli sklonować nowe repozytorium lub usunąć starą gałąź.

tghw
źródło
1
To interesujące rozwiązanie, czy możesz rozwinąć nieco więcej?
DrM
15

Utwórz nowy oddział o nazwie „inscenizacja” i zapomnij o drugim ...

lctr30
źródło
+1 właśnie to zrobiłbym. Stare zestawy zmian nadal będą miały starą nazwę rozgałęzienia, ale nowe będą miały nową nazwę gałęzi.
barjak
6

To modyfikuje historię i jest przeznaczone tylko dla zaawansowanych użytkowników Mercurial. Nie rób tego, jeśli nie wiesz, co to znaczy.

Jeśli szycie jest lokalne, możesz zmienić je na inscenizację za pomocą kombinacji przeszczepu i paska . Zacznij od aktualizacji do zestawu zmian przodka, w którym rozchodziło się szarpanie. Stwórz gałąź przemieszczania i przeszczep każdą zatwierdzenie od napadu do inscenizacji. Inscenizacja powinna być teraz kopią znamienia. Na koniec zniszcz stygnięcie, usuwając pierwsze zatwierdzenie.

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch
AWrightIV
źródło
1
Do kroku 3 możesz użyćhg graft {first changeset in stiging}..{stiging head}
KCD