Färben von Leerzeichen in der Ausgabe von git-diff

151

In Bezug auf die Code-Formatierung bin ich ein bisschen puristisch :). Ich entferne sehr oft unnötige Leerzeichen (Zeilen mit nur ws, ws am Zeilenende usw.). Ich habe sogar vim eingestellt, um diese Art von Linien zu zeigen, die rot gefärbt sind.

Mein Problem ist, dass ich mit git-diff oft so etwas sehe:

-      else{ 
+      else{

Selbst wenn ich Git-Diff-Farben habe, kann ich keinen Unterschied erkennen (in dieser speziellen Situation habe ich 1 Ws am Ende der Zeile entfernt). Gibt es eine Möglichkeit, git-diff anzuweisen, zu zeigen, dass ws rot gefärbt ist? (Zum Beispiel diejenigen, die mit / \ s + $ / regexp übereinstimmen).

Radarek
quelle
4
Wenn Sie die Farben invertieren (Vordergrund und Hintergrund tauschen), werden solche Leerzeichenänderungen angezeigt. Eine einfache Möglichkeit, dies in vielen Terminals zu erreichen, besteht darin, den betreffenden Text mit der Maus hervorzuheben. Dieser Trick funktioniert natürlich nur mit einem farbigen Diff.
Phlarx

Antworten:

172

Möglicherweise müssen Sie die Konfigurationseinstellung color.diff.whitespace festlegen, z. B.:

 git config color.diff.whitespace "red reverse"

(Ich gehe davon aus, dass Sie bereits haben color.diffoder color.uieingestellt haben, autoda Sie sagen, dass Sie git diffohnehin farbige Flecken sehen .)

Wenn Sie den Typ von Leerzeichen Fehler zur Feinabstimmung möchten , die rot markiert sind, können Sie dann ändern core.whitespace, aberblank-at-eol standardmäßig aktiviert, sodass Sie dies für das erwähnte Beispiel wahrscheinlich nicht ändern müssen.

Eine mögliche Quelle der Verwirrung ist, dass bei der Ausgabe von git diffLeerzeichenfehler nur in den eingeführten Zeilen hervorgehoben werden, nicht in den entfernten. ( Update: Wie Paul Whittaker in seiner Antwort hervorhebt , über die Sie abstimmen sollten :), können Sie diese sehen, indem Sie den Sinn des Unterschieds mit umkehren git diff -R.)

Weitere Dokumentation zu diesen Konfigurationsoptionen finden Sie in der Manpage zur Git-Konfiguration

Wenn Sie den -RKludge nicht verwenden möchten, können Sie die Option WhiteSpace Error Highlight auf der Diff-Manpage verwenden .

--ws-error-Highlight =

Markieren Sie Leerzeichenfehler in Zeilen, die in der durch color.diff.whitespace angegebenen Farbe angegeben sind. ist eine durch Kommas getrennte Liste alter, neuer Kontexte. Wenn diese Option nicht angegeben ist, werden nur Leerzeichenfehler in neuen Zeilen hervorgehoben. ZB --ws-error-Highlight = neue, alte Highlights Leerzeichenfehler sowohl in gelöschten als auch in hinzugefügten Zeilen. Alle können als Abkürzung für alten, neuen Kontext verwendet werden.

git diff --ws-error-highlight=new,old <file>

oder

git diff --ws-error-highlight=all <file>

Ich kenne keine Möglichkeit, dies dauerhaft einzuschalten und in der Konfiguration zu speichern, abgesehen von der Verwendung eines Alias:

git config alias.df 'diff --ws-error-highlight=all'

Jetzt können Sie verwenden:

git df <file>

Um die Änderungen in rot zu sehen.

Beachten Sie, dass mit Git 2.11 (Q4 2016) dieser Alias ​​möglicherweise ersetzt wird durch:

git config diff.wsErrorHighlight all

Siehe Dokument weitergit diff und weitergit config .

Mark Longair
quelle
33
"Eine mögliche Quelle der Verwirrung ist, dass in der Ausgabe von git diff Leerzeichenfehler nur in den eingeführten Zeilen hervorgehoben werden, nicht in den entfernten." Genau! Und es gibt keine Möglichkeit, es auch für entfernte Zeilen anzuzeigen? (Hey, es ist diff :))
Radarek
6
Fügen Sie --global hinzu, um es in Ihrem ~ / .gitconfig
simlmx
17
@ Radarek: Sie können die umgekehrte Option verwenden:git diff -R
blau
6
Gibt es dafür einen Fehlerbericht? Wenn nicht, scheint es so zu sein.
Ajedi32
3
das hat funktioniert git config diff.wsErrorHighlight all. Verwenden Sie git config --global [...]diese Option , um die Änderungen global vorzunehmen (dh alle Repos zu beeinflussen).
Felipe Alvarez
141

Verwenden Sie git diff -Rdiese Option , um entfernte Zeilen in hinzugefügte Zeilen umzuwandeln. Dann werden nachfolgende Leerzeichen hervorgehoben.

(Dies setzt voraus, dass Sie die Whitespace-Hervorhebung gemäß den Farbeinstellungen aus Marks Antwort bereits aktiviert haben. Die Gutschrift für diese Methode geht an Junios Beitrag unter http://git.661346.n2.nabble.com/Highlighting-whitespace-on-removal- with-git-diff-td5653205.html .)

Wenn git diff -Rich beispielsweise eine Datei von DOS-Zeilenenden nach Unix konvertiere, werden mir die ^MZeichen (dis) am Ende der Zeilen deutlich angezeigt. Ohne -R(und auch ohne -wusw.) zeigt es an, dass sich die gesamte Datei geändert hat, aber nicht wie.

Paul Whittaker
quelle
4
Natürlich können Sie dies auch tun, git diff | cat -A | less -Swenn Sie verzweifelt sind, aber zusätzlich zu den Wagenrückläufen catwerden auch alle farblich hervorgehobenen Escape-Codes buchstäblich angezeigt.
Paul Whittaker
3
@Paul_Whittaker cat -Aist nicht portabel. Bei BSD-Katzen gibt es keine solche Option. Bitte verwenden Sie cat -vetstattdessen.
7heo.tk
9

Verwenden Sie git diff --color | less -R. Das -Rmacht die Farbsteuerungscodes benutzerfreundlich.

Dann können Sie die lessSuche nach regulären Ausdrücken verwenden, z

/[[:space:]]+$
Kelvin
quelle
Dieser reguläre Ausdruck funktioniert vimübrigens auch.
Jose Alban
Diese letzte Idee less -Rmachte es einfach leichter für mich Rohr ls --colordurch less.
Menachem
0

Meine Version von git diffscheint dies bereits zu tun - ich habe git 1.7.4.1 und habe gesetzt color.ui = auto.

Nickgrim
quelle
12
Ich habe gerade mit git 1.7.5.1 getestet und es werden sicherlich keine nachgestellten Leerzeichen in Zeilen hervorgehoben, die entfernt werden.
Infiltrator