10 Stimmen

Wie kann ich die Arbeit in mehrere Patches mit Mercurial-Warteschlangen aufteilen?

Wenn ich eine Weile am Code gearbeitet und dabei vergessen habe, eine Patch-Serie zu erstellen, wie erstelle ich dann die Patch-Serie im Nachhinein? Bisher ist das einzige, was mir dazu einfällt:

# Prepare and test the first batch of changes.
$ hg qrecord -m 'first batch' 1.patch
$ hg qnew -m 'stash downstream changes' stash-1.patch
$ hg qdelete -k temp-1.patch
$ make hello
cc     hello.c   -o hello
hello.c: In function ‘main’:
hello.c:4: error: syntax error at end of input
make: *** [hello] Error 1
$ echo '}' >> hello.c
$ make hello
cc     hello.c   -o hello
$ hg qrefresh

# Recover the stashed changes.
$ patch -p1 < .hg/patches/last.patch

# And around we go again!
$ hg qrecord -m 'second batch' 2.patch
$ hg qnew -m 'stash downstream changes' stash-2.patch
$ hg qdelete -k stash-2.patch
$ make hello
...

Dieser sehr umständliche Ansatz ist auch gefährlich. Ich könnte vergessen, die -k en qdelete Dann schlage ich meine Stirn minutenlang gegen eine Wand, oder ich habe zu viel oder zu wenig bei der qrecord-Operation aufgenommen.

Gibt es einen besseren Weg?

(Was ich wirklich möchte, ist, dass ich in der Lage bin hg qpop kurz vor einem Patch, den ich aufteilen möchte, und verwende einen derzeit nicht existierenden Befehl, hg qunrecord , um interaktiv Änderungen aus dem Patch in mein Arbeitsverzeichnis zu saugen. Sobald ich mit den Änderungen zufrieden bin, hg qnew -f ein neues Pflaster vor das alte klemmen könnte).

6voto

wierob Punkte 4199

En MQTutorial erklärt, wie man Patches aufteilt. Sie könnten also einen Patch aus Ihrer aktuellen Arbeit erstellen und ihn in mehrere Patches aufteilen.

3voto

kuy Punkte 924

TortoiseHg hat eine sehr nützliche Funktion "Hunk Selection" im Commit-Dialog für diese Art von Arbeit:
http://tortoisehg.bitbucket.io/manual/2.0/commit.html#change-selection

2voto

RyanWilcox Punkte 13600

Ich denke, die Kreuzwortverlängerung können Sie dies tun. Es bietet Ihnen eine interaktive, auf Curses basierende Schnittstelle, auf der Sie genau auswählen können, was in einer Übergabe enthalten ist.

1voto

gavenkoa Punkte 40749

Aktivieren Sie integrierte Erweiterungen:

[extensions]
mq=
record=
shelve=

Dann verschieben Sie MQ in den Arbeitsbaum, teilen die Änderungen auf und entfernen den ursprünglichen Patch:

$ hg qpop my.patch
$ patch -p1 <.hg/patches/my.patch

$ hg qnew -i my1.patch
 ....
$ hg qnew -i my2.patch
 ....
$ hg qnew myN.patch   # last without interactive stuff

$ hg qdelete --keep my.patch

Zwischen my$i.patch y my$((i+1)).patch können Sie hg shelve / hg unshelve um zu testen, ob das Projekt gebaut wurde und die Tests auf der Grundlage von my$i.patch ohne nachträgliche Änderungen!

Wenn Sie feststellen, dass auf dieser Stufe etwas fehlt, verwenden Sie hg qref über zurückgestellte Änderungen oder hg qref -i über nicht abgeschlossene Änderungen!

Siehe auch Mercurial: MQ-Patch nach Shelve verschieben?

0voto

sfink Punkte 1696

Installieren Sie zuerst Crecord, weil es einfach eine viel schönere Art ist, Änderungen aufzuteilen.

$ hg qcrecord part1
$ hg qnew part2 # ok, slightly a lie at this point
$ hg qpop
$ echo "}" >> hello.c
$ hg qrefresh
$ hg qpush
$ hg qcrefresh # Keep just what you want in part2
$ ...

Die einzige Besonderheit von crecord ist hier der Befehl qcrefresh. Wenn Sie kein Curses-Fan sind, können Sie hier trotzdem alles machen, ersetzen Sie einfach qcrefresh durch hg qrefresh -X 're:.' . Oder hg qrefresh -I aauuuuuggghhh wenn Sie das bevorzugen. (Es ist Ihr "uncommit" mit -X oder -I.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X