Kombiniere magit mit undo-tree für eine einfache Navigation in der Geschichte

16

Ich liebe undo-tree(Screenshot unten). Es bietet eine einfache Möglichkeit für durch verschiedene Versionen einer Datei zu navigieren (oberes Fenster) durch den Benutzer bewegen lassen um die Geschichte Baum der Datei in einem separaten Fenster (unten Fenster) mit einfachen Tasten wie n, pund C-bund C-fauf Schalter über Nachkommen der gleichen Elternteil.

Am bemerkenswertesten, undo-treeaktualisiert die Puffer die Datei mit der entsprechenden Version basierend auf der Auswahl in der Baumansicht zu halten, automatisch.

Natürlich magitist es phänomenal für Git, und es wäre erstaunlich, wenn es eine ähnliche Fähigkeit hätte, dh die Benutzer können interaktiv durch den Git- Verlauf einer Datei navigieren und gleichzeitig den Puffer aktualisieren, der die Datei automatisch enthält.

Ist das heute überhaupt möglich magit?

Bildbeschreibung hier eingeben

Amelio Vazquez-Reina
quelle
Ich weiß nicht, ob es mit magit möglich ist, aber ich warte auf github.com/pidu/git-timemachine
clemera 10.10.15
Ich bin nicht sicher, aber ich denke, undo-treeverwendet einen Baum (es ist im Namen: -p), während Git-Verlauf ein gerichteter azyklischer Graph ist . Es könnte nicht trivial sein.
Suvayu
2
Magit unterstützt so etwas, aber ich ändere gerade, wie die Funktion aktiviert wird. Ich werde eine Antwort posten, wenn ich damit fertig bin.
Tarsius

Antworten:

7

Magit hat in letzter Zeit Unterstützung für so etwas erhalten, aber das Feature ist immer noch etwas rau und muss explizit aktiviert werden.


Eine ähnliche Funktion gibt es schon seit langer Zeit: Wenn Sie in einem Protokollpuffer von einem Commit zu einem anderen wechseln und in demselben Frame ein anderes Fenster als Revisionspuffer des Repositorys angezeigt wird, wird dieser Puffer aktualisiert, um das Commit anzuzeigen, anstatt das Commit auszuführen wurde zuvor gezeigt.

Bis vor kurzem wurde der Revisionspuffer erstellt, als Sie das erste Mal von einem Commit zu einem anderen verschoben haben. Ich habe dieses Verhalten geändert und jetzt wird der Revisionspuffer immer nur aktualisiert . Wenn in keinem Fenster desselben Frames bereits dieser Puffer angezeigt wird, wird der Puffer beim Bewegen im Protokoll nicht mehr in einem neuen Fenster oder in einem vorhandenen Fenster angezeigt, in dem zuvor ein anderer Puffer angezeigt wurde.

Jetzt müssen Sie einmal drücken SPC, um den Revisionspuffer anzuzeigen. Erst dann wird es aktualisiert, wenn Sie sich im Protokollpuffer bewegen.

Wenn Sie nicht möchten, dass der Revisionspuffer aktualisiert wird, gehen Sie wie folgt vor:

(remove-hook 'magit-section-movement-hook
             'magit-log-maybe-update-revision-buffer)

Wenn Sie andererseits auch möchten, dass der Revisionspuffer aktualisiert wird, wenn Sie sich im Statuspuffer bewegen, verwenden Sie Folgendes:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-revision-buffer)

Es ist jetzt möglich, dass ein Blob-Puffer auf ähnliche Weise automatisch aktualisiert wird. Fügen Sie zuerst Folgendes hinzu:

(add-hook 'magit-section-movement-hook
          'magit-log-maybe-update-blob-buffer)

Und vielleicht auch:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-blob-buffer)

Drücken Sie dann in einem Protokoll- (oder Status-) Puffer RET, um den Revisionspuffer anzuzeigen oder zu aktualisieren und auch zu diesem Puffer zu wechseln. Gehen Sie zu der gewünschten Datei und drücken Sie RETerneut. Sie befinden sich jetzt in einem "Blob-Visiting" -Puffer, der einem Dateibesuchspuffer ähnelt, mit der Ausnahme, dass nicht die Datei im Arbeitsbaum, sondern die Datei wie in einem Commit aufgerufen wird.

Wechseln Sie zurück in den Protokoll- (oder Status-) Puffer und wechseln Sie zu einem anderen Commit. Der Blob-Puffer wird aktualisiert.


Beachten Sie, dass beim Anzeigen eines anderen Blobs der vorhandene Blob-Puffer nicht wiederverwendet wird. Stattdessen wird ein neuer Puffer erstellt, der diesen Blob aufruft und dann den Puffer in dem Fenster anzeigt, in dem zuvor der andere Blob-Puffer angezeigt wurde. Dieser andere Puffer wird nicht gelöscht, was leider zur Folge hat, dass sich in kurzer Zeit einige Puffer ansammeln können. Welches wäre eine dieser Ecken und Kanten, die ich bereits erwähnt habe. Durch Drücken qauf einen Blob-Puffer wird dieser gelöscht. Sie können also aufräumen, indem Sie zu dem Fenster gehen, in dem die verschiedenen Blob-Puffer angezeigt wurden, und qsolange drücken, bis alle Puffer gelöscht wurden.

Zusätzlich ist es möglich, aus einem Blob-Puffer mit pund zum nächsten oder vorherigen Blob zu navigieren n. Ich gehe davon aus, dass Sie in den meisten Fällen mit einem kürzlich aufgetretenen Blob beginnen und dann mithilfe von zu älteren Blobs zurückkehren p. Wenn Sie das tun und sich dann in die andere Richtung bewegen möchten, empfehle ich Ihnen q, den aktuellen Puffer zu löschen und damit zum vorherigen Puffer, dh zum nächsten Blob, zu wechseln .

Beachten Sie auch, dass Sie nicht erst eine Revision aufrufen müssen, um einen Blob aufzurufen. Sie könnten auch M-x magit-find-file RET <revision> RET <file> RETdirekt verwenden, aber ich finde das weniger bequem.

Tarsius
quelle
Vielen Dank, Tarsius. Ich arbeite mit magit 20151014.231(spätestens soweit ich das beurteilen kann). Ich habe versucht, die oben beschriebenen Schritte auszuführen. Ich ging in magit-log-buffer-filedenen ich den Commits navigieren kann nach oben und unten mit nund paber wenn ich drücke SPCoder RETauf einem von ihnen erhalte ich:Symbol's value as variable is void: magit-blame-mode
Amelio Vazquez-Reina
Sie haben wahrscheinlich hinzugefügt , magit-blame-maybe-update-revision-bufferum magit-section-movement-hookdurch Fehler.
Tarsius