Magit teilte das Stück in zwei Stücke

34

Es gibt eine Frage zu SO über das Teilen von Hunks mit Magit, und die beiden angegebenen Lösungen bestehen darin, entweder die Region zu inszenieren (eine Region markieren, Stufe treffen) oder alle Hunks mit +& zu verkleinern / zu vergrößern -. Das ist nicht was ich will.

Im Statuspuffer von magit möchte ich ein Stück am Punkt oder zumindest an den Linien um den Punkt in zwei Stücke aufteilen.

Drehen Sie dies (entschuldigen Sie meine schlechte Diff-Formatierung)

@@ blah blah blah
- foo
+ bar
+ baz
+

In

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

Wenn der Punkt auf der Latte liegt.

Motivationen:

  • bazAls Debug-Anweisung würde ich es gerne aus dem Commit von foo& barstreichen, ohne es loszuwerden.

  • barund baznur teilweise verwandt sein, was bedeutet, dass ihre Änderungen nicht im selben Commit sein sollten.

  • barist groß und bazklein, wodurch es viel einfacher ist, das Stück zu teilen, als es auszuwählenbar

  • Ähnlich wie beim letzten Punkt enthält ein Festschreiben mit 20 Zeilen eine einzelne Zeile in der Mitte, die nicht in Szene gesetzt werden soll. Es wäre einfacher, die oberen und unteren zwei Hunks zu teilen und zu inszenieren, wenn man die mittlere ignoriert, als die Region zu verwenden.

  • Das Obige kann manchmal auftreten, wenn die Diff-Darstellung das Vorher und Nachher von etwas trennt, das geändert wurde, und etwas nicht hilfreiches in der Mitte hat. z.B

@@ line
- old_foo
+ random stuff
+ new foo
Tintenfisch
quelle
Es gibt nichts in magit, was das kann. Es ist sogar noch mehr als das: Das Design von magit macht es wahrscheinlich unmöglich, ohne eine umfassende Neugestaltung des magit-Status zu codieren.
Rémi
4
Danke, macht Sinn. Leider ist das Beste, was ich mir vorstellen kann, eine gewisse Automatisierung, um von Punkt zu Punkt vorwärts oder rückwärts zu wählen und dann zu inszenieren. Beachten Sie auch (für Leute, die diese Funktion noch nicht verwendet haben), dass Sie die Region sowohl für die Bühne als auch für die Bühne verwenden können. Zum Beispiel können Sie ein großes Stück inszenieren, dann zum inszenierten Abschnitt wechseln und eine Linie in der Mitte aus der Bühne entfernen. Ich stimme jedoch mit @MrBones überein, dass eine Split-Hunk-Option einfacher wäre, als mit der Auswahl herumzuspielen.
Glucas
Interessant, die Auswahl von 2 unterscheidet nicht benachbarte Regionen. +1
Nsukami _
1
Persönlich würde ich das ganze Stück inszenieren und dann die Debug-Anweisung inszenieren. (Mein Pre-Commit-Hook fängt inszenierte Debug-Anweisungen ab, daher besteht keine Gefahr, dass ich eine
festschreibe
1
Ich weiß nicht genug über Magit, um zu helfen, aber ich möchte darauf hinweisen, dass der Diff-Modus von Emacs den Befehl diff-split-hunkhat, der genau das tut. IOW Ihre Anfrage diff-split-hunkbezieht sich auf eine Art (oder eine äquivalente) Verwendung aus dem Magit-Status-Puffer.
Stefan

Antworten:

17

Wie in den obigen Kommentaren erwähnt, unterstützt Magit die Aufteilung eines Hunks in mehrere Hunks nicht über das hinaus, was durch die Verwendung von möglich ist git diff -U<n>. Das liegt daran, dass Magit sich auf diesen Git-Befehl verlässt, um die Diffs zu erstellen. Das wird sich nicht ändern, Magit verwendet immer die Unterschiede, die es von Git erhält, wie sie sind.

(Tatsächlich entfernt Magit einige Header, die für den Menschen nicht wirklich relevant sind, stellt sie jedoch wieder her, wenn Änderungen vorgenommen werden. Wenn Sie jedoch ein Stück weiter aufteilen, als dies -U<n>unterstützt wird, ist dies eine ganz andere Geschichte. Es gibt einen Grund, warum Git erlaubt keine "kleineren Hunks", es wäre nicht in der Lage, sie anzuwenden).

Magit unterstützt zwar nicht die Anzeige kleinerer Hunks, wie hier angefordert, unterstützt jedoch die Anwendung nur von Teilen eines Hunks. Wenn die Region während des Staging aktiv ist, wird nur der Teil des Hunks angewendet.

Das hilft nicht viel, wenn sich der Teil, der nicht inszeniert werden soll, genau in der Mitte des Textes befindet, der inszeniert werden soll. Wie andere vorgeschlagen haben, sollten Sie in diesem Fall das ganze Stück inszenieren und dann die Zeile, die Sie nicht in einem zweiten Schritt festschreiben möchten, wieder freigeben.

Das könnte natürlich automatisiert werden. Die einzige Möglichkeit, wie dies automatisiert werden könnte, besteht darin, "den aktuellen Teil mit Ausnahme der Region zu inszenieren" . Ich habe jedoch einige Zweifel, wie oft dies tatsächlich nützlich wäre, und befürchte, dass es nicht einfach wäre, dies robust umzusetzen Daher habe ich derzeit nicht die Absicht, dies umzusetzen.

Tarsius
quelle
47

Sie können mit Magit Hunks aufteilen.

Anstatt den Cursor einfach im Block zu lassen, wählen Sie die Zeilen aus, die Sie im Block platzieren möchten, und drücken Sie s . Es wird nur der ausgewählte Teil des Hunks inszeniert, während sich der Rest des Hunks noch im nicht inszenierten Bereich befindet.

Auf diese Weise haben Sie es in zwei Teile geteilt. Ich denke, Sie können den gleichen Mechanismus verwenden, um Teile von Hunks in den Stash zu befördern. Bei Verwendung von k wird nur ein Teil des Hunks entfernt.

Sven Rieke
quelle
3
IMO, dies sollte die akzeptierte Antwort sein, da sie die Anfrage erfüllt (und ich habe diese Antwort einige Male gefunden, als ich versucht habe, mich daran zu erinnern, wie man das macht).
Chaseadamsio
2
Ja, das sollte als Antwort akzeptiert werden!
Copyninja
3

Wenn Sie Teile eines Hunks verwerfen möchten, wählen Sie die Zeilen innerhalb des Hunks aus, die Sie verwerfen möchten, und drücken Sie x .

NeilDurant
quelle