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

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

Ich suche nach einer Möglichkeit, alle Dateien gleichzeitig zu öffnen – in BeyondCompare zum Beispiel würde dies alle Dateien in Tabs innerhalb desselben BC-Fensters öffnen.

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

   

Ab git v1.7.11 können Sie mit git difftool --dir-diff ein Verzeichnis diff ausführen.

Die folgende Antwort gilt für ältere git Installationen als v1.7.11.


Die gleiche Frage wurde in der Git Mail-Liste gestellt .

Ich habe ein Shell-Skript erstellt, das auf diesem E-Mail-Thread basiert und einen Verzeichnis-Unterschied zwischen beliebigen Commits durchführt.

Beginnend mit git v1.7.10 ist das git-diffall Skript im contrib der Standard-Git-Installation enthalten.

Für Versionen vor Version 1.7.10 können Sie das git-diffall Projekt auf GitHub installieren.

Hier ist die Projektbeschreibung:

Das Git-Diffall-Skript stellt einen verzeichnisbasierten Diff-Mechanismus für Git bereit. Das Skript basiert auf der Konfigurationsoption diff.tool, um zu bestimmen, welcher Diff-Viewer verwendet wird.

Dieses Skript ist mit allen Formen kompatibel, die zur Angabe eines Bereichs von Revisionen für diff verwendet werden:

1) git diffall : zeigt git diffall zwischen dem Arbeitsbaum und git diffall Änderungen
2) git diffall --cached [] : Zeigt das diff zwischen git diffall --cached [] Änderungen und HEAD (oder anderen benannten Commits)
3) git diffall : zeigt Unterschiede zwischen funktionierendem Baum und benanntem Commit
4) git diffall : git diffall Diff zwischen zwei benannten Commits
5) git diffall .. : wie oben
6) git diffall ... : git diffall ... die Änderungen auf dem Zweig an, der bis zum zweiten enthält, beginnend bei einem gemeinsamen Vorfahren von

Hinweis: Alle Formulare benötigen einen optionalen Pfadbegrenzer [--] []

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

Hier ist, worauf ich mich festgelegt habe …

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

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

Platziere die Datei im cmd Ordner deines Git-Installationsverzeichnisses (zB C:\Program Files (x86)\Git\cmd )

Und verwende wie du git diff :

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

Hinweise: Der Schlüssel dazu ist der & param, der dem externen diff-Befehl mitteilt, dass er in einer Hintergrundaufgabe ausgeführt wird, damit Dateien sofort verarbeitet werden. Im Falle von BeyondCompare öffnet dies einen Bildschirm mit jeder Datei in einem eigenen Tab.

Wenn Sie ein Verzeichnis unter Quellcodeverwaltung (Git, Mercurial, Subversion, Bazaar und wahrscheinlich andere) eingeben, wird es automatisch alle geänderten Dateien auflisten und Sie können doppelklicken, um die einzelnen Unterschiede anzuzeigen.

IMO ist es viel einfacher zu meld . und lassen Sie das VCS herausfinden, als konfigurieren Sie Ihr VCS, um meld zu starten. Außerdem können Sie denselben Befehl verwenden, unabhängig davon, welches VCS Ihr Projekt gerade verwendet, was großartig ist, wenn Sie häufig zwischen ihnen wechseln.

Der einzige Nachteil ist, dass es langsamer ist, wenn meld nach Änderungen sucht, als die Änderungen von git / hg / svn zu bestehen, ob es langsam genug ist, ein Problem zu sein, hängt davon ab, wie Sie es verwenden.

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

Aber ich würde lieber die Arbeitsdateien direkt anzeigen (aus dem Arbeitsverzeichnis), da BeyondCompare die praktische function hat, die Datei innerhalb des Diff-Fensters bearbeiten zu können, was für schnelle Säuberungen sehr nützlich ist.

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

git meld => https://github.com/wmanley/git-meld ist ein geniales Skript, das ein nettes Diff aller Dateien in einem einzigen Fenster öffnet.

Diffuse verfügt auch über VCS-Integration. Es funktioniert mit einer Vielzahl von anderen VCS, einschließlich SVN, Mercurial, Bazaar, … Für Git, wird es sogar drei Bereiche zeigen, wenn einige, aber nicht alle Änderungen inszeniert werden. Bei Konflikten wird es sogar vier Bereiche geben.

Screenshot von diffuse mit gestuften und nicht gestanzten Bearbeitungen

Rufen Sie es mit auf

 diffuse -m 

in deiner Git Arbeitskopie.

Wenn Sie mich fragen, unterscheiden sich die besten visuellen Unterschiede seit zehn Jahren. (Und ich habe versucht, auch zu merge.)

Beachten Sie, dass Araxis Merge eine Befehlsoption ‘-nowait’ hat:

-nowait Verhindert, dass Compare auf das Schließen eines Vergleichs wartet

Vielleicht gibt das einen sofortigen Exit-Code zurück und würde funktionieren, hat irgendjemand das erfahren? Kann keine ähnliche Option für BeyondCompare finden …

Wenn Sie nur alle Dateien öffnen möchten, die gerade geändert werden, versuchen Sie Folgendes:

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

Wenn Sie “komplexe Änderungen” vornehmen, sollten Sie Ihren Arbeitsablauf überdenken. Eine der wirklich netten Eigenschaften von git ist, dass es dem Entwickler leicht gemacht wird, komplexe Änderungssets auf eine Reihe von einfachen Patches zu reduzieren. Anstatt zu versuchen, alle Dateien zu bearbeiten, die derzeit geändert werden, sollten Sie sich das genauer ansehen

  Git hinzufügen --patch 

mit dem du gezielt Hunks inszenieren kannst.

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

 GitNdiff master~3 . 

Um beispielsweise den Master-Zweig vor drei Checkins mit dem aktuellen Arbeitsbaum zu vergleichen.

Es ist glänzend und neu und wahrscheinlich voller Bugs. 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

Für diejenigen, die git-diffall unter Mac OS X mit Araxis verwenden möchten, 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 modifizierter Klon der araxisgitdiff Datei, die mit Araxis Merge für Mac OS X ausgeliefert wird.

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

Folgendes 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 Changesets anstelle von Herkunft / Branch-Name verwendet werden

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

Sie können gitk verwenden und alle Unterschiede gleichzeitig sehen