Ignorieren Sie * alle * Whitespace-Änderungen mit git-diff zwischen Commits

77

Ich gehe eine Codebasis durch und behebe Leerzeichen-Kuriositäten und korrigiere im Allgemeinen Einrückungen und solche Dinge. Ich möchte sicherstellen, dass ich nicht versehentlich andere Änderungen vorgenommen habe. git diff -wDaher zeige ich Unterschiede in allen geänderten Dateien an, während ich Leerzeichen ignoriere Unterschiede. Das Problem ist, dass dabei nicht alle Leerzeichenunterschiede ignoriert werden - zumindest was ich als reine Leerzeichenunterschiede betrachte. Zum Beispiel in der folgenden Ausgabe von git diff -w,

-"Links":
-{
-
-    "Thermal":
-
-{
-
+  "Links": {
+    "Thermal": {

Sie können sehen, dass ich nur habe

  1. überflüssige Leerzeilen entfernt,
  2. Setzen Sie am Ende der Zeile des Schlüssels geschweifte Klammern, deren Wert sie öffnen, und
  3. eingerückt, um dem Kontext zu entsprechen

Diese Frage schien zunächst eine Antwort zu bieten, befasst sich jedoch mit Unterschieden zwischen zwei bestimmten Dateien und nicht zwischen zwei bestimmten Commits . Alles andere, was beim Suchen auftauchte, war ebenfalls eine Sackgasse. In dieser Frage geht es beispielsweise um das Zusammenführen und nicht um das Anzeigen von Unterschieden. In dieser Frage geht es um das Anzeigen von Unterschieden auf Wortebene usw.

Bilderstürmer
quelle
1
Für Bitbucket-Benutzer gibt es einen vorgeschlagenen Fix dafür, der jedoch noch nicht codiert wurde und wahrscheinlich erst dann funktioniert, wenn genügend Interesse besteht. Sie können zur Bitbucket-Site gehen und Ihre Unterstützung zeigen. Ich habe die aktuelle Seite bei der Suche nach einer Lösung in Bitbucket gefunden. Wenn es also andere in dieser Situation gibt, gehen Sie bitte hierher und stimmen Sie ab!
Paultamalunas
git difftool+ kdiff3 ist eine Option
Tim Abell

Antworten:

66

Vielleicht gibt es eine bessere Antwort, aber die beste Lösung, die ich bisher gefunden habe, ist diese.

Zunächst müssen Sie die Definition von "Whitespace" steuern, die Git derzeit verwendet.

git config core.whitespace '-trailing-space,-indent-with-non-tab,-tab-in-indent'

Als nächstes müssen Sie die Definition eines verwendeten Wortes steuern. Anstatt nur zu verwenden git diff -w, fügen Sie hinzu --word-diff-regex='[^[:space:]]':

git diff -w --word-diff-regex='[^[:space:]]'

Sie werden immer noch den Kontext sehen, der (in meinem Fall, da ich sicherstellen möchte, dass es keine Unterschiede außer Leerzeichen gibt) nicht hilfreich ist. Sie können -U0Git anweisen, Ihnen 0 Kontextzeilen zu geben, wie z.

git diff -w -U0 --word-diff-regex='[^[:space:]]'

Sie erhalten jedoch immer noch eine Ausgabe, die dem Kontext ziemlich ähnlich sieht, aber es ist immer noch viel besser, als alle Änderungen sorgfältig und manuell durchzusehen, um sicherzustellen, dass es sich nur um Leerzeichenänderungen handelt.

Sie können alle oben genannten Schritte auch in einem Befehl ausführen. Das -cFlag ändert die Git-Konfiguration nur für einen Befehl.

git -c core.whitespace=-trailing-space,-indent-with-non-tab,-tab-in-indent diff -U0 --word-diff-regex='[^[:space:]]'
Bilderstürmer
quelle
2
@Torek - noch ein Stück Git-Güte. Warum zum Teufel ist es so schwierig, sich ohne Leerzeichen zu unterscheiden? Ich arbeite auf einem Windows-Computer und versuche, eine PR für Visual Studio-Projektdateien auszuwerten. CR-, LF- oder CRLF-Unterschiede sind mir egal, aber genau damit füllt Git mein Terminal.
JWW
2
und die Leute verstehen nicht, warum ich git hasse
Gerry
Wie auch immer, um einen Alias ​​dafür zu erstellen?
StR
2
@StR können Sie einen Alias .gitconfigmit den folgenden in Ihrem [alias]Abschnitt machen: diffw = diff -w -U0 --word-diff-regex=[^[:space:]]
Mattwright
1
@NSjonas Ich habe den gleichen Fehler bekommen. Sie müssen Anführungszeichen hinzufügen. Ich habe die Befehle in der Antwort bearbeitet.
kambunctious
34

Ignorieren Sie alle Whitespace-Änderungen mit git-diff zwischen Commits

Diese Frage schien zunächst eine Antwort zu bieten, befasst sich jedoch mit Unterschieden zwischen zwei bestimmten Dateien und nicht zwischen zwei bestimmten Commits. Alles andere, was beim Suchen auftauchte, war ebenfalls eine Sackgasse ...

Ich denke, Sie haben Probleme, weil Git das falsche Werkzeug für den Job ist. Es macht die Aufgabe nicht einfach, und es ist der falsche Ansatz, dem Werkzeug nachzugeben. Werkzeuge sollen für Sie funktionieren und nicht umgekehrt .

Führen Sie einen zweiten Klon durch und überprüfen Sie dann die betreffende Startversion. Führen Sie dann mit Ihrer aktuellen Version einen regulären Diff aus : diff -bur --ignore-all-space <dir1> <dir2>.

Hier sind einige der Optionen fürdiff

-i, --ignore-case
       ignore case differences in file contents

-E, --ignore-tab-expansion
       ignore changes due to tab expansion

-Z, --ignore-trailing-space
        ignore white space at line end

-b, --ignore-space-change
       ignore changes in the amount of white space

-w, --ignore-all-space
       ignore all white space

-B, --ignore-blank-lines
       ignore changes where lines are all blank
jww
quelle
2
Keine dieser Optionen hilft in diesem Fall: diff behandelt einen Zeilenumbruch immer noch anders als keinen Zeilenumbruch.
Gilles 'SO - hör auf böse zu sein'
1
mit dem neuesten Git (v2.20.1):error: invalid option: -Z
Morteza Ziyae
4
@MortezaZiaeemehr Die Option ist für den diffBefehl, nicht für den gitBefehl. In dieser Antwort wird empfohlen, das Diff-Tool und nicht Git für den jeweiligen Job zu verwenden.
Saraf
Hatte auch Probleme mit ungültiger Option. --ignore-all-spaceund --ignore-cr-at-eolarbeitete für mich.
mix3d