Wie mehrere patches mit hg-Befehl Linie, wenn es bereits übernommene änderungen?
Ich den folgenden Befehl verwenden, um einen patch anwenden in Mercurial
, ohne dass es :
hg import patch.diff --no-commit
Funktioniert es Super, jedoch wenn ich versuche mehrere patches auf einmal so :
hg import patch1.diff --no-commit
hg import patch2.diff --no-commit
...
Bekomme ich diese Fehlermeldung nach der zweiten commit :
abort: uncommitted changes
Wenn ich genau das gleiche tun in SourceTree
(anwenden der patch1 dann patch2 und wählen Sie "Ändern der Arbeitskopie Dateien") funktioniert es : zwei patches auf Ihrer Arbeitskopie änderungen vom patch1 und patch2 kombiniert/zusammen geklappt.
Wie das gleiche zu tun mit hg Befehlszeile ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist das Verhalten, dass wurde von der Mercurial Autoren: stellen Sie sich vor, dass Sie "manuell aus" nicht festgeschriebenen änderungen in einer Arbeitskopie, möchten wir nicht
hg import
automatisch den patch anwenden, und verpflichten sich beide Ihre änderungen, und der patch ändert eine falsche log-Meldung, und beide Veränderungen miteinander verflochten.Dies ist der Grund, warum die
hg help import
sagt:Den import-Befehl ist mehr für den Import von Differenzmengen (mit metedata, wenn die Daten stammen aus
hg export
) als nur das einspielen von patches. Wenn Sie Ihre eigenen änderungen in die Arbeitskopie können Sie zum Beispiel noch verwendenhg import --bypass
und es wird kein Fehler passieren, weil die übertragung unmittelbar angewendet werden, um das repository und nicht in der Arbeitskopie. (Hinweis: aber dann, wenn Sie nur Ihre änderungen, die Sie erhalten zwei Köpfe, die Sie Zusammenführen müssen.. :-).Lösung mit dem command line für Unix-Systeme ist die Verwendung des
patch
- Befehl, sondern direkthg import
weil dann keine Prüfung, ob lokale änderungen durchgeführt werden. E. g.,Für nicht-Unix-Systemen kann man auch eine Reine Mercurial-Lösung durch die Installation der
shelve
Erweiterung, so dass es in der globalen Konfigurationsdatei (mercurial.ini), und verwenden Sie dannshelve
zu behandeln, das führt einen patch nach dem anderen:Wenn überhaupt ein Konflikt auftreten würde,
shelve
erkennt es, und Sie müssten, um es zu lösen, dann sagen Sieshelve
dass es gelöst ist mit der--continue
option.Hoffe, es wird helfen.
patch
Befehl : ich habe nicht so Dienstprogramm in meinem mercurial Ordner (windows), redest duhg patch
? Wenn ja, habe ich es schon versucht bevor du diese Frage ALSO und es nur berichten gleiche Fehlermeldung wiehg import
Linux
- Dienstprogramm, vielleicht installierencygwin
werden, damit es funktioniert.patch
ist ein Unix-Dienstprogramm. Sie können entweder: verwenden Sie ein Cygwin-version, verwenden Sie kopieren, wie Sie bereits erwähnt, oder ich denke, man kann eine "pur-hg-Lösung", ich werde es auf meine Antwort.. 😉git
installiert, die Sie verwenden können, um die patchen wie in deiner ersten Methode:git apply
wird die Arbeit machen.patch
, genau das was ich brauchte!Hier ist was für mich gearbeitet (windows-Lösung), wurde die Idee packte von Christophe Muller Antwort :
Es einfach verketten alle patches zusammen (als eine große Datei) dann gilt es.
Eine mögliche Lösung ist die Verwendung Mercurial Queues (Anmerkung - es scheint, dass diese Erweiterung wird "oft als für deprecation", aber es ist nicht veraltet, nur noch, und kommt pre-installed mit Mercurial).
Wenn Sie noch nicht verwendet, MQ vor, es ist sehr praktisch, wenn auch ein wenig Komplex. Aber effektiv können Sie Warteschlangen erstellen von patches, die geschoben werden können, geändert, neu geordnet, etc.
Könnten Sie es verwenden, um zu helfen lösen Sie Ihr Problem so:
Den
-P
option schiebt den änderungen, wie Sie Sie importieren, was bedeutet, dass Sie effektiv prüfen, dass Sie richtig angewendet werden.Wenn Sie alle patches importiert, in MQ -, pop-Sie alle (also nicht angewendet werden, und Sie sind zurück zu, wo Sie gestartet sind), und Falten Sie Sie alle in eine neue, kombinierte patch:
Dann wenn Sie glücklich sind, mit dem daraus resultierenden patch, nur konvertieren Sie es in einen "echten" changeset:
Ich denke, es könnte ein eleganter Weg, dies zu tun:
(wenn Sie möchten, zu extrahieren, einen rückwärts-patch zuerst):
hg diff -c xxx --reverse > 1.diff