Mit Mercurial, wie kann ich „komprimieren“, um eine Reihe von Änderungssätzen in eine vor schieben?

StackOverflow https://stackoverflow.com/questions/1200691

Frage

Lassen Sie uns sagen, ich habe eine lokale und eine Remote-Mercurial-Repository. Jetzt beginne ich zu einer Funktion arbeiten. Ich arbeite daran, und wenn ich es gemacht denken, befehle ich die changeset. Teste es ein bisschen mehr, finde ich, dass ich weiter diese Funktion im Code von Tweaking etwas verbessern könnte. Ich mache die Änderung und begehen. 20 Minuten später, ich finde es ist ein Fehler in dieser neuen Funktion, so dass ich es beheben und sich verpflichten, das auch.

Ich habe jetzt 3 Changeset, die ich wirklich an die Remote-Repository als eine changeset mit der Meldung schieben möchte „Implementing Feature X“, zum Beispiel.

Wie kann ich dies tun, ohne viel Aufwand? Ich glaube, dass ich es mit Patches tun könnte, aber es scheint wie eine Menge Arbeit.

War es hilfreich?

Lösung

Wie über die Erweiterung Collapse?

Andere Tipps

Die histedit Erweiterung ist genau das, was Sie suchen .

hg histedit -o

oder

hg histedit --outgoing

Eine Liste der abgehenden Differenzmengen bringen. Aus der Liste können Sie

  • Falten 2 oder mehr Differenzmengen die Schaffung einer einzigen changeset
  • Drop Change sie aus der Geschichte zu entfernen
  • Nachbestellung Change wie Sie wollen.

histedit wird Sie auffordern, für das neue Commit-Nachricht der gefalteten Changesets, die es standardmäßig die beiden Nachrichten mit „\ n *** \ n“ trennt sie.

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

Sie können auch den Zusammenbruch Erweiterung verwenden, nur um Falten zu tun, aber es funktioniert nicht so schön eine Benutzeroberfläche zur Verfügung stellt und bieten keine Möglichkeit, die resultierenden Commit-Nachricht zu bearbeiten. begehen die resultierende Bearbeitung Nachricht ermöglicht auch die letzte Botschaft Reinigung, das ist etwas, das ich immer unter Verwendung enden.

Ja, können Sie es mit Patches tun: Nehmen wir an, Ihre Arbeit in Changesets 100 bis 110, inklusive

  1. einen Patch erstellen:

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

  2. Update bis 99:

    % hg update 99

  3. Wenden Sie den Patch mit --no-commit (sonst werden Sie alle Ihre Changesets zurück):

    % hg import --no-commit mypatch

  4. Commit alle Änderungen auf einmal:

    % hg commit

  5. Sie haben nun zwei Köpfe (110 und 111), die in Bezug auf die Dateien entsprechen sollten sie in Ihrem Arbeitsverzeichnis erzeugen - vielleicht sie für geistige Gesundheit diff bevor die alten Strippen aus:

    % hg strip 100

OK, jetzt, wo ich sie alle aus Dinkel habe, ist es langwierig erscheinen, aber es ein paar Mal getan zu haben, ich, ich kann es nicht zu viel von einer lästigen Pflicht zu finden sein ...

Wenn Sie TortoiseHg verwenden, verwenden Sie kann nur zwei Revisionen auswählen (mit STRG nicht-nachfolgend denjenigen auszuwählen) mit dem rechten Maustaste und wählen Sie „Compress Geschichte“ .

Danach werden Sie eine neue Änderungsliste in neuen Kopf bekommen von der ersten Änderung starten Sie vor ausgewählt, werden alle Nachkomme Änderungslisten zwischen denen, enthalten Sie ausgewählt haben.

Sie können einfach alte Änderungslisten Streifen aus, wenn Sie sie nicht mehr benötigen: Verwenden Sie MQ Erweiterungen für sie. Wieder in TortoiseHg:. Direkt auf der ersten Änderungsliste klicken, die mit all seinen Nachkommen werden abgestreift muss, "Modify Geschichte -> Strip"

Meine bevorzugte Methode des mq für diese Faltung unter Verwendung verwendet TortoiseHg wie hier beschrieben. Es kann jedoch leicht von der Kommandozeile wie so getan 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 kann eine bessere Möglichkeit, die qfold Schritt zu tun, aber ich bin mir nicht bewusst ist, wie ich in der Regel TortoiseHg für diese Operation verwendet werden.)

Es scheint ein wenig auf den ersten kompliziert, aber wenn man einmal angefangen habe mit mq, es ist ziemlich einfach und natürlich - plus Sie können alle möglichen anderen Dinge mit mq tun, die ziemlich praktisch sein kann

hg collapse und hg histedit sind die besten Möglichkeiten. Oder besser gesagt, würde die besten Möglichkeiten, wenn sie zuverlässig gearbeitet ... habe ich histedit mit einem Stack Dump innerhalb von drei Minuten zum Absturz bringen. Collapse ist nicht viel besser.

Dachte ich zwei andere BKMS teilen könnten:

  1. hg rebase --collapse

    Diese Erweiterung ist mit Mercurial verteilt. Ich habe noch nicht Probleme mit ihm hatte. Sie können einige Spiele spielen müssen um hg rebase Einschränkungen arbeiten - im Grunde ist es nicht Rebasing auf demselben Zweig zu einem Vorfahren mag, mit dem Namen oder Standard, obwohl es es erlaubt, wenn Rebasing zwischen (benannt) Zweig

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

Einige Leute haben über das Erstellen von zwei Klon Bäumen gesprochen, und das Kopieren von Dateien zwischen ihnen. Oder das Patchen zwischen ihnen. Stattdessen ist es einfacher, die .hg Verzeichnisse zu bewegen.

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 solange die wahren Repositories funktioniert, die .hg Bäume, sind unabhängig von dem Arbeitsverzeichnis und seine Dateien.

Wenn sie nicht unabhängig sind ...

Ich habe noch nie Mercurial, aber das klingt viel wie das, was Martin Fowler spricht in seinem Blog nicht allzu lange Zeit verwendet:

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

Warum nicht einfach hg strip --keep Befehl?

Dann können Sie alle Änderungen zu übernehmen als ein begehen.

HistEdit wird tun, was Sie wollen, aber es ist wahrscheinlich übertrieben. Wenn das einzige, was Sie brauchen einige Changesets zusammen, um die Erweiterung kollabieren die Arbeit erledigen.

Angenommen, Sie haben zwei nicht veröffentlichten THIS und THAT begeht in Mercurial und wie sie in einzelne beizutreten bei THIS Punkt begehen ::

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

Überprüfen Sie, ob Ihre Commits nicht veröffentlicht ::

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

Update auf LAST begehen ::

$ hg up

und Import verpflichtet bis THIS in MQ ::

$ hg qimport $THIS::.

all Patches Un-Anwendung und nur ersten THIS gelten ::

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

Join mit THAT ::

$ hg qfold $THATNAME

Hinweis , um Namen THATNAME Verwendung finden ::

$ hg qseries

Alle Patches anwenden und verschieben Sie sie Geschichte zu der Verwahrungsstelle ::

$ hg qpush -a
$ hg qfinish -a

Mein Blog-Post auf Thema ist Joining zwei Commits in Mercurial .

Ja, funktioniert strip --keep für Autoren Frage. Aber es war etwas anders als andere, zum Beispiel, wenn Sie Version von 1 bis 30 haben, wollen aber nur die Version 15.12 kollabieren. Andere Lösungen arbeiten, aber nicht strip --keep.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top