Wie funktioniert die mercuriale Zusammenführungsfunktion für abgelehnte hunks in einer Patch-Warteschlange ohne den veralteten qsave?

8

Ich habe ein Repository und verwende mq patch queue für nicht abgeschlossene Änderungen. Die Patch-Warteschlange unterliegt ebenfalls der Versionskontrolle.

Nehmen wir an, ich habe zwei Patches p1 und p2 (in dieser Reihenfolge). Jetzt mache ich eine Änderung auf p1:

%Vor%

... und p2 wird nicht angewendet.

Der Standardweg wäre nun, die abgelehnten hunks manuell anzuwenden. ich möchte etwas wie MqMergePatch verwenden, was nett ist und die Zusammenführung von verwendet mercurial - aber es basiert auf der veralteten Eigenschaft:

%Vor%

Meine Frage ist: Wie geht es mit hg rebase ?

BEARBEITEN

Nachdem ich das Protokoll des Repositorys gesehen habe, mag ich überhaupt nicht, was MqMergePatch dazu macht. Mein Hauptziel bei der Verwendung von Patches besteht darin, die Historie des Repository sauber zu halten und nicht mit unnötigen Details zu verstreuen.

    
mr_georg 04.08.2011, 20:27
quelle

2 Antworten

15

Der Vorschlag, hg rebase zu verwenden, ist irreführend, denke ich. Die Seite MqMergePatch besagt, dass es sich um eine Änderung von MqMerge , das eine Technik war, um eine Reihe von Patches auf neue Changesets zu übertragen, die von anderswo gezogen wurden.

Es beinhaltet jedoch das Speichern einer Kopie der Patch-Warteschlange, die bereits angewendet wurde (das ist wirklich alles hg qsave does ) und die Verwendung der gespeicherten Kopie als Teil der Referenz für eine 3-Wege-Zusammenführung, die eine Patch-Warteschlangen-Rebase bewirkt. Ich habe das selbst gemacht, bevor ich die Erweiterung für die Erweiterung aktiviert habe. Dann ging es einfach darum, den ersten Patch auf den Spitzenwechselsatz zu übertragen, den ich als neuen Elternteil haben wollte.

Das ist aber nicht das, was Sie wollen, denn Sie möchten grundsätzlich einen Patch über einem Patch, den Sie geändert haben, neu erstellen. Die Patch-Warteschlange ist jedoch linear, und Sie können einen Patch nur dann erneut bereitstellen, wenn der Changeset, auf den er angewendet wurde, parallel zur Patch-Warteschlange weitere untergeordnete Elemente aufweist:

%Vor%

In der obigen Situation könnte die Patch-Warteschlange auf B mit hg rebase einfach rebasiert werden (daher der Vorschlag, hg rebase zu verwenden), aber das hat nichts mit Ihrer Situation zu tun.

Ein Ansatz für Ihre Situation

Hier ist ein angewendeter Patch mit nicht gespeicherten lokalen Änderungen, der einen Konflikt mit einem nicht zugewiesenen Patch verursacht:

%Vor%

Normalerweise beiße ich die Kugel und handle Ablehnungen manuell, da sie normalerweise wenige sind. Ich finde, wenn ich eine Situation habe, in der zu viele Ablehnungen manuell zu handhaben sind, habe ich sie wahrscheinlich nicht richtig organisiert.

Wenn die Technik, die qsave und qpush -m usw. verwendet, den folgenden Elementen vorzuziehen ist, ist es unwahrscheinlich , dass qsave in absehbarer Zeit entfernt wird, obwohl es veraltet ist.

Hier ist, wie ich die obige Situation behandeln würde, wenn ich wirklich 3-Wege-Merge-Tools nutzen wollte:

(TortoisHg 2.x lässt uns Patch-Queues noch nicht rebasen, also ist dies eine Variante des finish-rebase-Imports, die ich manchmal mache.)

  • Anstelle von qrefresh verwenden Sie qnew , um die ungesicherten Änderungen zu einem neuen Patch zu machen:

    %Vor%
  • Schließen Sie diese Patches in reguläre Changesets ab:

    %Vor%
  • Aktualisieren Sie auf den Changeset, auf den patch sauber angewendet wird ( B ), und wenden Sie den Patch an:

    %Vor%
  • Rebase patch2 atop C , damit die 3-Wege-Zusammenführung verwendet wird, um Konflikte zwischen local patch2 und anderen C mit zu lösen Basis B :

    (Ich würde dies in TortoiseHg 2.x tun müssen, indem ich patch2 vor der Umbenennung beende und dann wieder in die Warteschlange importiere.)

    %Vor%
  • Importieren Sie B und C als Patches erneut in die Warteschlange:

    %Vor%
  • Pop patch2 und patch1b und dann fold patch1b in patch1 (umbenannt als patch1new ):

    %Vor%

Jetzt wird patch2 sauber auf patch1new angewendet.

    
Joel B Fant 05.08.2011, 03:41
quelle
1

Ich habe kürzlich an einer Erweiterung gearbeitet, da ich viele MQ-Patches verwendet habe. Die Erweiterung heißt qsmooth (da Sie Ihre Patches "glätten").

Sie können hier nachschauen: Ссылка

Es verwendet ein Verfahren, das dem in Joels Antwort sehr ähnlich ist. Ich habe es noch nicht sehr oft in der Produktion verwendet, aber es hat eine anständige Anzahl von Tests, und ich bin froh, Fehlerberichte zu erhalten.

    
jwd 29.06.2015 04:16
quelle

Tags und Links