Frage

Sagen, ich machte viele änderungen an meinem code und müssen nur zu verpflichten, ein paar von diesen änderungen.Gibt es eine Möglichkeit, es zu tun in mercurial?Ich weiß, dass darcs hat eine Funktion wie diese.

Ich weiß hg transplant können dies tun, zwischen den Zweigen, aber ich brauche so etwas wie dies für die Begehung von code in der Gegenwart Zweig und nicht beim hinzufügen ändern-sets aus einem anderen Zweig.

War es hilfreich?

Lösung

MQ als Chad erwähnt ein Weg sind. Es gibt auch leichtere Lösungen:

  • Satzerweiterung die etwa die gleiche Art und Weise wie darcs Aufzeichnung funktioniert. Es verteilt mit Mercurial.
  • Erweiterung Shelve dem Sie auf "ad acta" bestimmte Änderungen, so dass Sie erlaubt verpflichten nur eine Teilmenge der Änderungen (diejenigen, die nicht auf Eis gelegt werden)

Andere Tipps

Wenn Sie mit TortoiseHg 1.x für Windows, diese Funktion schön implementiert wird direkt aus der Box (keine Erweiterungen erforderlich).

  1. Führen Sie das TortoiseHg Werkzeug Commit.
  2. Wählen Sie eine Datei, für die Sie nur will eine Untergruppe von begehen Änderungen.
  3. Klicken Sie auf das Hunk Registerkarte Auswahl im Vorschaufenster.
  4. Doppelklick oder die Leertaste, um Toggle die großen Stücke ändern sollten in der Commit enthalten.

TortoiseHg 2.x wird die Hunk Registerkarte Auswahl jetzt weg. An seiner Stelle ist das Shelve Werkzeug . Es hat ein paar mehr Features als die alte große Stück Auswahl. Diese neuen Features kommen auf Kosten von einigen zusätzlichen Komplexität.

eingeben Bild Beschreibung hier

Beachten Sie, dass es nicht notwendig ist, um explizit die Mercurial Shelve Erweiterung zu aktivieren, wenn diese Funktion verwenden. Laut Steve Borho (lead TortoiseHg Entwickler) in Antwort auf eine andere Frage TortoiseHg : "Wir haben eine lokale Kopie der shelve Erweiterung und rufen in es direkt."


TortoiseHg 2.7 + , diese Funktionalität wurde verbessert und neu eingeführt. Es wird nun direkt in das Commit-Tool gebaut:

Beispiel einer Änderung Auswahl in dem Commit-Tool

Beachten Sie in der Dateiliste auf der linken Seite, dass die Top-Datei, um anzuzeigen, geprüft wird, enthalten sein die zweite Datei ist nicht markiert, weil es nicht aufgenommen werden, und die dritte Datei, Sample.txt, gefüllt ist (die Null Checkbox-Indikator), da nur ausgewählte Änderungen aus dieser Datei wird in der Commit enthalten sein.

Die Änderung Sample.txt, die wird enthalten ist in der rechten unteren Änderungsauswahl Teil des Bildes überprüft. Die Veränderung, die ausgeschlossen wird, ist nicht markiert und die diff Ansicht ist ausgegraut. Beachten Sie auch, dass das Symbol für das shelve Werkzeug noch leicht verfügbar ist.

Der Mercurial Queues Tutorial ist für diesen Anwendungsfall schrecklich. Alle Beispiele, die ich gesehen habe annehmen, dass Sie noch zu einem machen zu begehen und Sie Auffrischen eines einzelnen Patch. Die meiste Zeit nicht der Fall dieses ist, und Sie haben 2 oder 3 Commits, die Sie gemeinsam zerquetschen wollen oder auf andere Art und Weise ändern.

Lassen Sie uns sagen Sie diese Art von Geschichte haben:

---O---O---A---B---C

Das erste Beispiel ist zum Squash A, B und C. Erste init mq verpflichtet:

$ hg qinit

Jetzt müssen wir auf "Import" die Commits A, B und C in die Patch-Queue. Nehmen wir an, sie die letzten drei Commits sind. Wir können die „N“ Revision Syntax verwenden, sie zu importieren wie folgt:

$ hg qimport -r -3:-1

bedeutet, dass Import als Patches von 3 Patches wieder bis zum letzten begehen. Sie können den Status dieses Patches mit hg qseries überprüfen. Es sollte wie folgt zeigen:

$ hg qseries
101.diff
102.diff
103.diff

Wenn die Zahlen 101, 102 und 103 zu den lokalen Revisionsnummern der Commits entsprechen A, B und C. Nun sind diese Patches angewandt , was bedeutet, die Veränderungen, die sie beschreiben, sind bereits in der Arbeitskopie. Sie können die Arbeitskopie loszuwerden, die Änderungen erhalten und sie aus der Geschichte der Commits entfernen, sie in Pflasterform Speicher nur durch hg qpop verwenden. Sie können entweder sagen hg qpop; hg qpop Pop ändern C und B vom Stapel oder einen Patch angeben „Pop zu“. In diesem Fall wäre es so etwas wie diese:

$ hg qpop 101.diff
now at: 101.diff

Sie haben nun die Patches für B und C in der Patch-Queue verpflichtet, aber sie nicht angewandt werden (ihre Veränderungen „verloren“ haben - sie existieren nur in dem Patch-Queue-Bereich). Jetzt können Sie diese Patches in die letzte Falte, das heißt wir schaffen eine neue begehen das entspricht der Summe der Änderungen A + B + C.

$ hg qfold -e 102.diff 103.diff

Dies zeigt Ihren Editor, damit Sie die Commit-Nachricht ändern können. Standardmäßig wird die Nachricht sein, die Verkettung der Commit-Nachrichten für die Veränderungen A, B und C, getrennt durch Sternchen. Das Schöne daran ist, dass hg qfold werden die Patches Tabula ausfüllen, wenn Sie bash verwenden und die hg-Completion-Skript stammt. Dies lässt die Geschichte wie folgt, wobei A + B + C ist eine einzige verpflichten, dass die Kombination der drei Patches, die uns interessieren:

---O---O---A+B+C

Ein weiterer Anwendungsfall ist, wenn wir die gleiche Art von Geschichte wie vorher, aber wir wollen Patch B fallen zu lassen und A + C verschmelzen. Das ist ziemlich ähnlich wie oben eigentlich. Wenn Sie zu qfold Schritt erhalten, würden Sie einfach falten in den letzten Commit statt der letzten 2 Commits:

$ hg qfold -e 103.diff

Damit bleibt die Änderung für B in der Patch-Warteschlange, aber es ist nicht auf die Arbeitskopie angelegt und seine begehen ist nicht in der Geschichte. Sie können dies sehen, indem Sie:

$ hg qunapplied
102.diff

Die Geschichte sieht nun wie folgt, wobei A + C ein einziges ist verpflichten, dass kombiniert Änderungen A und C:

---O---O---A+C

Ein letzter Anwendungsfall könnte sein, dass Sie nur verpflichten C. anwenden müssen Sie würden dies tun, indem Sie den qimport wie oben ausgeführt wird, und Sie würden alle Patches Pop-off Sie nicht wollen:

$ hg qpop -a

Die Flag -a Mittel alle Patches abspringt. Jetzt können Sie gelten nur die, die Sie wollen:

$ hg qpush 103.diff

Dies lässt Sie mit dieser Geschichte:

---O---O---C

Wenn Sie mit all dies getan haben, müssen Sie die Warteschlange Hantieren beenden. Dies kann gemacht werden:

$ hg qfinish -a

Es gibt also wir. Sie können jetzt laufen hg push und nur begehen genau das, was Sie wollen, oder hg email ein kohärentes Pflaster auf die Mailing-Liste.

Ich fühle mich wie ich bin etwas fehlt, weil niemand vorgeschlagen hat diese bereits.

Die normale "hg commit" - Befehl kann verwendet werden, um selektiv zu wählen, was zu Begehen (Sie nicht haben, um einen commit für alle ausstehenden änderungen in das lokale Arbeitsverzeichnis).

Wenn Sie eine Reihe von änderungen in etwa so:

M ext-web/docroot/WEB-INF/liferay-display.xml
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
M ext-web/docroot/WEB-INF/portlet-ext.xml

Sie verpflichten sich, nur zwei der änderungen...

hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml

Nicht super bequem aus der Kommandozeile, da Sie zur hand haben-geben Sie die Dateien selektiv zu Begehen (vs eine GUI-check-box-Verfahren wie Schildkröte), aber es ist ungefähr so einfach wie es nur geht, und erfordert keine Erweiterungen.Und Datei-globbing können wahrscheinlich helfen reduzieren eingeben (als wäre es oben, beide begangen Dateien einmalig share "liferay" in Ihren Pfadnamen.

Sie können über die Satzerweiterung , die mit Mercurial verteilt wird.

Sie müssen sie zunächst in den ~/.hgrc Datei aktivieren, indem sie sie an den [extensions] Abschnitt hinzufügen:

[extensions]
record=

Dann geben Sie einfach hg record statt hg commit, und Sie werden auswählen können, welche Änderungen, welche Dateien Sie verpflichten wollen.

Sie können auch die crecord Erweiterung denen ein schöneres Interface bietet zu überprüfen und wählen Sie die Veränderungen. (Es ist nicht mit Mercurial verteilt, obwohl, und ich habe es gelegentlich vermasselt gesehen eine Festschreibung so ist es nicht völlig fehlerfrei.)

hat einige Zeit vergangen. Jetzt scheint die beste Option ist hg commit --interactive

Ich glaube, Mercurial Queues diese Rolle für Mercurial füllt. Es gibt ein ziemlich gutes Tutorial dort verknüpft.

Versuchen qct (Qt-Tool Commit). Es hat eine „Kopie Änderungen“ -Funktion, die ein 3-Wege-Merge-Tool startet für Sie individuelle Änderungen rückgängig zu machen. Nachdem Sie verpflichten, diese Änderungen „knöpfte“ zurückkommen.

Ich verwende commit-Patch . Es ist ein Skript, das Sie das Diff bevor sie sich bearbeiten können. Es ist wirklich schön mit Emacs diff-Modus und vc-Modus.

In der Vergangenheit habe ich crecord, aber es hat Fehler im Zusammenhang mit Unicode (eigentlich die Satzerweiterung hat die Fehler, die crecord hängt davon ab).

Zuerst müssen Sie alles vergessen Sie jemals über GUIs wusste und auf der Kommandozeile zurück. Weiter von der Kommandozeile tun:

hg stat> filelist.txt

Diese Rohre alle geänderten Dateien in eine Textdatei namens filelist.txt

Als nächstes bearbeitet Dateiliste, um nur die Dateien, die Sie wollen, zu begehen.

Schließlich verpflichten die fileset sytnax mit:

hg commit "gesetzt: 'Listendatei: test.txt'"

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