it-swarm.com.de

Wie kann ich mit Mercurial eine Reihe von Changesets zu einem "komprimieren", bevor ich es schiebe?

Nehmen wir an, ich habe ein lokales und ein entferntes Mercurial-Repository. Jetzt beginne ich mit der Arbeit an einem Feature. Ich arbeite daran, und wenn ich denke, dass es fertig ist, setze ich das Änderungsset ein. Ich teste es ein bisschen mehr und finde, dass ich diese Funktion noch verbessern konnte, indem ich etwas im Code korrigierte. Ich mache die Änderung und verpflichte mich. 20 Minuten später stelle ich fest, dass in dieser neuen Funktion ein Fehler aufgetreten ist. Ich behebe das Problem und beweise das auch.

Ich habe jetzt 3 Changesets, die ich wirklich als Remoteset mit der Nachricht "Implementierungsfeature X" an das Remote-Repository senden möchte.

Wie kann ich das ohne viel Aufwand tun? Ich glaube, ich könnte das mit Patches machen, aber es scheint viel Arbeit zu sein.

93
Lucas

Wie wäre es mit der Collapse Extension ?

38
Steve Losh

Die Erweiterung histedit ist genau das, wonach Sie suchen.

hg histedit -o

oder

hg histedit --outgoing

öffnet eine Liste der ausgehenden Changesets. Aus der Liste können Sie

  • Falten Sie 2 oder mehr Änderungssets, um ein einziges Änderungsset zu erstellen
  • Löschen Sie Changesets, um sie aus dem Verlauf zu entfernen
  • Änderungssätze nach Ihren Wünschen neu anordnen.

histedit fragt Sie nach der neuen Festschreibungsnachricht der gefalteten Changesets, die standardmäßig auf die beiden Nachrichten mit "\ n ***\n" gesetzt wird.

Sie können ähnliche Ergebnisse auch mit der mq-Erweiterung erzielen, aber es ist viel schwieriger.

Sie können die collapse-Erweiterung auch nur zum Falten verwenden, aber sie bietet keine schöne Benutzeroberfläche und keine Möglichkeit, die resultierende Commit-Nachricht zu bearbeiten. Das Bearbeiten der resultierenden Commit-Nachricht ermöglicht auch das Bereinigen der endgültigen Nachricht, was ich am Ende immer benutze.

48
Stefan Rusek

Ja, Sie können dies mit Patches tun: Nehmen wir an, Ihre Arbeit ist in den Änderungssets 100 bis einschließlich 110 enthalten

  1. Erstellen Sie einen Patch:

    % hg export -o mypatch 100:110 --git

  2. Update auf 99:

    % hg update 99

  3. Wenden Sie den Patch mit --no-commit an (sonst erhalten Sie alle Ihre Änderungssets zurück):

    % hg import --no-commit mypatch

  4. Alle Änderungen auf einmal übernehmen:

    % hg commit

  5. Sie haben jetzt zwei Köpfe (110 und 111), die in Bezug auf die Dateien, die sie in Ihrem Arbeitsverzeichnis erzeugen, gleichwertig sein sollten. Möglicherweise sollten Sie sie für die Vernunft verwenden, bevor Sie die alten entfernen.

    % hg strip 100

OK, jetzt, wo ich alles genau buchstabiert habe, scheint es langwierig zu sein, aber nachdem ich es einige Male selbst gemacht habe, finde ich es nicht zu viel Arbeit ...

20
Arkady

Wenn Sie TortoiseHg verwenden, können Sie einfach zwei Versionen auswählen (verwenden Sie die STRG-Taste, um nicht-nachfolgende Versionen auszuwählen), klicken Sie mit der rechten Maustaste und wählen Sie "Compress History" .

Danach wird eine neue Änderungsliste in der neuen Kopfzeile ab der ersten zuvor ausgewählten Änderung angezeigt. Sie enthält alle Nachkommen-Änderungslisten zwischen den ausgewählten.

Sie können alte Änderungslisten einfach entfernen, wenn Sie sie nicht mehr benötigen: Verwenden Sie dafürMQextensions. Wieder in TortoiseHg: Klicken Sie mit der rechten Maustaste auf die erste Änderungsliste, die mit allen ihren Nachkommen entfernt werden muss, "Historie ändern -> Streifen" .

19
Rageous

Meine bevorzugte Methode, mq für diese Faltung zu verwenden, ist TortoiseHg wie hier beschrieben . Es kann jedoch leicht über die Befehlszeile wie folgt ausgeführt werden:

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(Es gibt möglicherweise eine bessere Möglichkeit, den qfold-Schritt auszuführen, aber ich bin mir dessen nicht bewusst, da ich TortoiseHg normalerweise für diese Operation verwende.)

Es erscheint auf den ersten Blick etwas kompliziert, aber sobald Sie mit mq angefangen haben, ist es ziemlich unkompliziert und natürlich - und Sie können mit mq alle möglichen anderen Dinge tun, die sehr praktisch sein können!

18
Chris Phillips

hg collapse und hg histedit sind die besten Möglichkeiten. Oder eher die besten Möglichkeiten, wenn sie zuverlässig arbeiten ... Ich habe histedit mit einem Stack-Dump innerhalb von drei Minuten zum Absturz gebracht. Collapse ist nicht viel besser.

Ich dachte, ich könnte zwei andere BKMs teilen:

  1. hg rebase --collapse

    Diese Erweiterung wird mit Mercurial vertrieben. Ich hatte noch keine Probleme damit. Möglicherweise müssen Sie einige Spiele spielen, um die Einschränkungen von hg rebase zu umgehen. Im Grunde mag es nicht, einen Vorfahren in demselben Zweig (benannt oder standardmäßig) zu verwenden, obwohl dies bei einer Neubasierung zwischen (benannten) Zweigen möglich ist.

  2. Verschieben Sie das Repository (foo/.hg) in das Arbeitsverzeichnis (bar) und dessen Dateien. Nicht umgekehrt.

Einige Leute haben darüber gesprochen, zwei Klonbäume zu erstellen und Dateien zwischen ihnen zu kopieren. Oder zwischen ihnen patchen. Stattdessen ist es einfacher, die .hg-Verzeichnisse zu verschieben.

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg Push

Dies funktioniert, solange die echten Repositorys, die .hg-Bäume, unabhängig vom Arbeitsverzeichnis und dessen Dateien sind.

Wenn sie nicht unabhängig sind ...

4
Krazy Glew

Ich habe Mercurial noch nie benutzt, aber das klingt sehr nach dem, worüber Martin Fowler vor nicht allzu langer Zeit in seinem Blog gesprochen hat:

http://martinfowler.com/bliki/MercurialSquashCommit.html

2
Joseph

Angenommen, Sie haben zwei unveröffentlichte THIS- und THAT-Commits in Mercurial und möchten, dass sie sich am THIS-Punkt zu einem einzelnen Commit zusammenschließen:

... --> THIS --> ... --> THAT --> ... --> LAST

Prüfen Sie, ob Ihre Commits nicht veröffentlicht werden:

$ hg glog -r "draft() & ($THIS | $THAT)"

Update auf LAST commit ::

$ hg up

und Commits bis zu THIS in MQ importieren ::

$ hg qimport $THIS::.

Deaktivieren Sie alle Patches und wenden Sie nur die erste THIS ::

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

Join mit THAT ::

$ hg qfold $THATNAME

NOTE Um den Namen THATNAME zu finden, verwenden Sie:

$ hg qseries

Wenden Sie alle Patches an und verschieben Sie sie in den Repository-Verlauf:

$ hg qpush -a
$ hg qfinish -a

Mein Blog-Post zum Thema ist Zwei Verpflichtungen in Mercurial beitreten .

0
gavenkoa

HistEdit wird tun, was Sie wollen, aber es ist wahrscheinlich übertrieben. Wenn Sie nur einige Changesets zusammenfalten, erledigt die Collapse Extension die Aufgabe.

0
Steve Losh

Ja, strip --keep funktioniert für die Frage des Autors. Es war jedoch ein wenig anders als andere, wenn Sie beispielsweise Version 1 bis 30 haben, aber nur Version 12-15 reduzieren möchten. Andere Lösungen funktionieren, aber nicht strip --keep

0
Frank Tao

Warum nicht einfach hg strip --keep Befehl?

Dann können Sie alle Änderungen als ein Commit festlegen.

0
G. Demecki