git difftool, öffne alle diff-Dateien sofort, nicht seriell


240

Das Standardverhalten von git diff besteht darin, jede diff-Datei seriell zu öffnen (warten Sie, bis die vorherige Datei geschlossen ist, bevor Sie die nächste Datei öffnen).

Ich suche nach einer Möglichkeit, alle Dateien auf einmal zu öffnen. In BeyondCompare würde dies beispielsweise alle Dateien in Registerkarten innerhalb desselben BC-Fensters öffnen.

Dies würde es einfacher machen, eine komplexe Reihe von Änderungen zu überprüfen. Blättern Sie zwischen den Diff-Dateien hin und her und ignorieren Sie unwichtige Dateien.


"git diff" oder "git difftool"? Vielleicht möchten Sie eine Anfrage auf der Git-Mailingliste (offen für alle und mit unterschiedlicher Weboberfläche) veröffentlichen: git@vger.kernel.org
Jakub Narębski

Ich benutze "git difftool", um eine externe Diff-Anwendung auszulösen. Danke für die Mailinglisten-Idee.
Seba Illingworth

Es wäre hilfreich, die Plattform zu kennen. Auf einer Unix-basierten Plattform würde ich ein Skript schreiben, um das Diff auszuführen, und git anweisen, dieses Skript zu verwenden. Im Skript würde ich einfach das Diff im Hintergrund ausführen und dann das Skript sterben lassen.
Chris Cleeland

Windows-Plattform, aber danke für die Ideen Chris.
Seba Illingworth

Antworten:


214

Ab gitVersion 1.7.11 können Sie git difftool --dir-diffeinen Verzeichnisdifferenz ausführen.

Diese Funktion funktioniert beispielsweise gut mit Meld 3.14.2 und ermöglicht das Durchsuchen aller geänderten Dateien:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Dies ist eine praktische Bash-Funktion:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

Die folgende Antwort gilt für gitInstallationen, die älter als Version 1.7.11 sind.


Dieselbe Frage wurde auf der Git-Mail-Liste gestellt .

Ich habe ein Shell-Skript zusammengestellt, das auf diesem E-Mail-Thread basiert und einen Verzeichnisunterschied zwischen beliebigen Commits ausführt.

Ab Git v1.7.10 ist das git-diffallSkript in contribder Standard-Git-Installation enthalten.

Für Versionen vor v1.7.10 können Sie aus dem git-diffallProjekt auf GitHub installieren .

Hier ist die Projektbeschreibung:

Das git-diffall-Skript bietet einen verzeichnisbasierten Diff-Mechanismus für git. Das Skript verwendet die Konfigurationsoption diff.tool, um zu bestimmen, welcher Diff-Viewer verwendet wird.

Dieses Skript ist mit allen Formularen kompatibel, mit denen eine Reihe von Revisionen für diff angegeben werden:

1) git diffall: Zeigt den Unterschied zwischen dem Arbeitsbaum und den bereitgestellten Änderungen.
2) git diffall --cached [<commit>]: Zeigt den Unterschied zwischen den Stufenänderungen und HEAD (oder einem anderen benannten Commit).
3) git diffall <commit>: Zeigt den Unterschied zwischen dem Arbeitsbaum und dem benannten Commit.
4) git diffall <commit> <commit>: Zeigt den Unterschied zwischen zwei benannten Commits.
5) git diffall <commit>..<commit>: Gleich wie oben
6) git diffall <commit>...<commit>: Zeigen Sie die Änderungen auf dem Zweig, der bis zur Sekunde enthält, beginnend mit einem gemeinsamen Vorfahren von beiden<commit>

Hinweis: Alle Formulare verfügen über einen optionalen Pfadbegrenzer [--] [<path>]

Dieses Skript basiert auf einem Beispiel von Thomas Rast auf der Git-Liste .


Was ist der Unterschied zwischen git-diffall und github.com/wmanley/git-meld ? Ich habe beide ausprobiert und sie scheinen auf den ersten Blick identische Funktionen zu bieten.
Kynan

5
Ich jedenfalls schätze Ihr Drehbuch sehr. Ehrlich gesagt kann ich nicht verstehen, warum Git sich in dieser Hinsicht nicht richtig verhält (Mercurial tut dies und tut dies seit Jahren), und ich kann auch nicht das mangelnde Interesse der Git-Community ergründen.
Douglas

6
Update (in Bezug auf git difftool --dir-diffund Beyond Compare): Ich habe Scooter Software (Autoren von Beyond Compare) kontaktiert und sie sagen, dass dies bcompare.exekeine unterstützte Lösung ist und Probleme verursachen kann, wenn mehr als ein Diff gleichzeitig geöffnet ist. Sie planen, bcomp.exein einer zukünftigen Version Unterstützung für Ordnerunterschiede hinzuzufügen (in der Zwischenzeit werde ich diese weiterhin bcompare.exeals nicht unterstützte Problemumgehung verwenden).
Peter Rust

4
@coin Ich habe gerade mit Beyond Compare 4 getestet und --dir-diff scheint mit der unterstützten bcomp.exe zu funktionieren.
Peter Rust

5
Nur zu kommentieren, um zu sagen, dass dies --dir-diffperfekt mit Meld funktioniert. Von dort aus können Sie Unterschiede für einzelne Dateien auswählen und anzeigen.
Mkasberg

61

Hier ist, worauf ich mich festgelegt habe ...

Kopieren Sie den folgenden Code in eine Datei mit dem Namen git-diffall(keine Erweiterung):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Legen Sie die Datei in den cmdOrdner Ihrer git Installationsverzeichnis (zB C:\Program Files (x86)\Git\cmd)

Und verwenden Sie wie Sie würden git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Hinweise: Der Schlüssel dazu ist & param, der den externen diff-Befehl anweist, in einer Hintergrundaufgabe ausgeführt zu werden, damit Dateien sofort verarbeitet werden. Im Fall von BeyondCompare wird ein Bildschirm mit jeder Datei auf einer eigenen Registerkarte geöffnet.


Danke fürs Schreiben. Leider funktioniert es nicht mit der Option -s von WinMerge. Alle temporären Dateien mit Ausnahme der ersten werden gelöscht, bevor WinMerge sie anzeigen kann.
Carlos Rendon

Carlos: Ich benutze WinMerge mit Git. Mein Ansatz war es, nach dem Start von WinMerge eine "Schlaf-1" hinzuzufügen (die in meinem Fall bereits "im Hintergrund" zu starten scheint - keine Notwendigkeit für &). Auf diese Weise lebt die temporäre Datei gerade so lange, dass WinMerge sie einmal abrufen kann (außer in seltsamen Fällen). Es bedeutet auch, dass es 1 Sekunde pro Datei dauert, um alle zu öffnen. Es ist ein böser Hack (ich würde ihn niemals als "Antwort" präsentieren!), Aber ein einfacher, ziemlich effektiver.
Woody Zenfell III

2
Für die Verwendung unter Linux mit Git 2.x musste ich eine geringfügige Änderung vornehmen: Wechseln "$filename"zu "../$filename". Dann funktionierte es perfekt mit Beyond Compare
Dave C

1
@ DaveC im ursprünglichen Thread heißt es, "die Datei im cmd-Ordner Ihrer Git-Installation zu speichern" und fährt mit einem Beispiel unter Windows fort. Wo haben Sie die "git-diffall" -Datei unter Linux gespeichert?
m4l490n

2
Müssen wir Windows neu starten, nachdem wir eine git-diffallDatei zum C:\Program Files\Git\cmdOrdner hinzugefügt haben ? Ich tat genau wie angewiesen, aber als ich es tat $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis

19

meld hat eine nette Funktion, die, wenn Sie ihm ein Verzeichnis unter Quellcodeverwaltung geben (Git, Mercurial, Subversion, Bazaar und wahrscheinlich andere), automatisch alle geänderten Dateien auflistet und Sie doppelklicken können, um die einzelnen Unterschiede anzuzeigen.

IMO ist es viel einfacher meld ., das VCS einzugeben und herauszufinden, als das VCS für den Start zu konfigurieren meld. Außerdem können Sie denselben Befehl verwenden, unabhängig davon, welches VCS Ihr Projekt gerade verwendet. Dies ist großartig, wenn Sie häufig zwischen diesen wechseln.

Der einzige Nachteil ist, dass es für meld langsamer ist, nach Änderungen zu suchen, als die Änderungen von git / hg / svn zu übergeben. Ob es jedoch langsam genug ist, um ein Problem zu sein, hängt davon ab, wie Sie es verwenden, da bin ich mir sicher.


4
Für mich ist der Hauptnachteil, dass meld (aus welchem ​​Grund auch immer) das Diff in einem neuen Fenster anstelle eines neuen Tabs öffnet und nach dem Schließen des Diff die Datei im Arbeitsverzeichnis in einem neuen Tab mit einer nervigen Popup-Nachricht öffnet.
Kynan

schönes Tool, aber schreckliche Windows-Installation (ab Anfang 2012).
Wernight

@kynan Dies scheint die perfekte Lösung für eine VCS-agnostische Art der Differenzierung zu sein, wenn nicht für diese nervige Doppelfenster-Popup-Sache. Es ist Schande. :(
PKKid

Ein großartiges Merkmal von meld sind die Diff-Filter: Ignorieren Sie Änderungen, z. B. in Kommentaren oder das Hinzufügen / Entfernen von Leerzeilen, was git diffnicht möglich ist.
Kynan

1
Ich habe diesen Ansatz ungefähr ein Jahr lang angewendet. Es funktioniert gut für kleinere Projekte, aber sobald Sie ein großes Projekt haben (dh viele Dateien), ist es unerschwinglich langsam, da es manuell nach Git-Unterschieden "scannt" (nicht sicher, warum es diesen Ansatz wählt, wenn Git es eindeutig mit einer Liste von versehen kann Dateien direkt ...)
namuol

3

Ich habe diese Methode gefunden (GitDiff.bat und GitDiff.rb), die die Dateien in alte / neue temporäre Verzeichnisse kopiert und dann einen Ordner vergleicht.

Ich möchte die Arbeitsdateien jedoch lieber direkt (aus dem Arbeitsverzeichnis) anzeigen, da BeyondCompare die praktische Funktion bietet, die Datei aus dem Diff-Fenster heraus bearbeiten zu können, was sich hervorragend für schnelle Bereinigungen eignet.

Bearbeiten: eine ähnliche Methode hier als Antwort auf meine Frage auf der Git-Mailingliste.



2

Hier wurde festgestellt, dass Araxis Merge eine Befehlsoption '-nowait' hat:

-nowait Verhindert, dass der Vergleich darauf wartet, dass ein Vergleich geschlossen wird

Vielleicht gibt dies einen sofortigen Exit-Code zurück und würde funktionieren, hat das jemand erlebt? Eine ähnliche Option für BeyondCompare kann nicht gefunden werden ...


2

Diffuse hat auch VCS-Integration. Es arbeitet mit einer Vielzahl anderer VCS zusammen, einschließlich SVN, Mercurial, Bazaar, ... Für Git werden sogar drei Fenster angezeigt, wenn einige, aber nicht alle Änderungen vorgenommen werden. Bei Konflikten gibt es sogar vier Fenster.

Screenshot von diffus mit inszenierten und nicht inszenierten Änderungen

Rufe es mit auf

diffuse -m

in Ihrer Git-Arbeitskopie.

Wenn Sie mich fragen, ist der beste visuelle Unterschied, den ich seit einem Jahrzehnt gesehen habe. (Und ich habe auch versucht zu verschmelzen.)


Kannst du sagen, welchen Teil von diffus dir gefallen hat, besonders über verschmolzen?
Musiphil

@musiphil: Ich mag seine Einfachheit - es scheint genau die Funktionen zu haben, die zur Lösung der Aufgabe erforderlich sind, nicht mehr, aber auch nicht weniger. (Wie die Neuausrichtung von Unterschieden und die Breite der Registerkartengröße.) Ich erinnere mich nicht, warum ich von meld gewechselt habe, und ich habe meld seitdem nicht mehr verwendet, sodass ich sie jetzt nicht wirklich vergleichen kann.
krlmlr

1
Diffuse arbeitete mit Git ohne Konfiguration. Diffuse -m öffnet ein einzelnes Fenster mit Git-Unterschieden in verschiedenen Registerkarten. Andere Tools benötigen zu viel Konfiguration, um überhaupt loszulegen.
Mosh

1

Wenn Sie nur alle aktuell geänderten Dateien öffnen möchten, versuchen Sie Folgendes:

vi $ (git status | sed -n '/.*modified: * / s /// p')

Wenn Sie "komplexe Änderungssätze" festschreiben, möchten Sie möglicherweise Ihren Workflow überdenken. Eine der wirklich schönen Eigenschaften von git ist, dass es dem Entwickler leicht fällt, komplexe Änderungssätze auf eine Reihe einfacher Patches zu reduzieren. Anstatt zu versuchen, alle aktuell geänderten Dateien zu bearbeiten, sollten Sie sich diese ansehen

git add --patch
Dadurch können Sie selektiv Hunks inszenieren.


1

Ich habe ein Powershell-Skript geschrieben, das zwei Arbeitsbäume dupliziert und mit DiffMerge vergleicht. So können Sie tun:

GitNdiff master~3 .

Zum Beispiel, um den Hauptzweig vor drei Checkins mit dem aktuellen Arbeitsbaum zu vergleichen.

Es ist glänzend und neu und wahrscheinlich voller Käfer. Ein Nachteil ist, dass Dateien in Ihrem Arbeitsbaum, die noch nicht hinzugefügt wurden, in beide Arbeitsbäume kopiert werden. Es kann auch langsam sein.

http://github.com/fschwiet/GitNdiff


1

Für diejenigen, die an der Verwendung von git-diffall unter Mac OS X mit Araxis interessiert sind, habe ich das git-diffall-Projekt auf github gegabelt und ein AppleScript hinzugefügt, das den Befehl Araxis Merge umschließt. Hinweis: Dies ist ein leicht geänderter Klon der araxisgitdiffDatei, die mit Araxis Merge für Mac OS X geliefert wird.

https://github.com/sorens/git-diffall


1

Das Folgende funktioniert mit meld und kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

Öffnet alle Dateien in einem Fenster, das Sie problemlos durchsuchen können. Kann mit Änderungssätzen anstelle von Ursprungs- / Zweignamen verwendet werden

z.B: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.