Kolorowanie białych znaków na wyjściu git-diff

151

Jeśli chodzi o formatowanie kodu, jestem raczej purystą :). Bardzo często usuwam niepotrzebne spacje (linie zawierające tylko ws, ws na końcu linii itp.). Ustawiłem nawet vima, aby pokazywał tego rodzaju linie w kolorze czerwonym.

Mój problem polega na tym, że używając git-diff często widzę coś takiego:

-      else{ 
+      else{

Nawet jeśli mam kolor git-diff, nie widzę różnicy (w tej konkretnej sytuacji usunąłem 1 ws na końcu linii). Czy jest jakiś sposób, aby powiedzieć git-diff, aby pokazał, że ws jest pokolorowany na czerwono? (na przykład te dopasowane do / \ s + $ / regexp).

radarek
źródło
4
Jeśli odwrócisz kolory (zamień pierwszy plan i tło), pojawią się takie białe znaki. Łatwym sposobem osiągnięcia tego w wielu terminalach jest zaznaczenie tekstu myszką. Ta sztuczka działa oczywiście tylko z kolorowymi różnicami.
Phlarx

Odpowiedzi:

172

Może być konieczne ustawienie ustawienia konfiguracji color.diff.whitespace, np. Za pomocą:

 git config color.diff.whitespace "red reverse"

(Zakładam, że już masz color.difflub color.uiustawiłeś, autoponieważ mówisz, że i tak widzisz kolorowe plamy git diff).

Jeśli chcesz precyzyjnie dostroić typ błędów białych znaków, które są podświetlone na czerwono, możesz to zmienić core.whitespace, ale blank-at-eoljest ono domyślnie włączone, więc prawdopodobnie nie będziesz musiał tego zmieniać w przykładzie, o którym wspominasz.

Możliwym źródłem nieporozumień jest to, że w wyniku działania programu git diffbiałe znaki są podświetlane tylko w wprowadzanych wierszach, a nie w usuwanych. ( Aktualizacja: jak wskazuje Paul Whittaker w swojej odpowiedzi , którą należy głosować za pozytywem :), możesz to zobaczyć, odwracając znaczenie różnicy z git diff -R.)

Więcej dokumentacji na temat tych opcji konfiguracyjnych można znaleźć na stronie podręcznika git config

Jeśli nie chcesz używać -Rkludge, możesz użyć opcji WhiteSpace Error Highlight ze strony podręcznika diff .

--ws-error-highlight =

Podświetlaj błędy białych znaków w liniach określonych przez w kolorze określonym przez color.diff.whitespace. jest rozdzieloną przecinkami listą starego, nowego kontekstu. Gdy ta opcja nie jest podana, podświetlane są tylko białe znaki w nowych wierszach. Np. --Ws-error-highlight = new, stare podświetla błędy białych znaków w usuniętych i dodanych wierszach. wszystko może służyć jako krótka ręka dla starego, nowego kontekstu.

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

lub

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

Nie wiem, jak to na stałe włączyć i zapisać to w konfiguracji, oprócz używania aliasu:

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

Teraz możesz użyć:

git df <file>

Aby zobaczyć zmiany na czerwono.

Zauważ, że w Git 2.11 (Q4 2016) ten alias może zostać zastąpiony przez:

git config diff.wsErrorHighlight all

Zobacz dokument dalejgit diff i dalejgit config .

Mark Longair
źródło
33
„Możliwym źródłem nieporozumień jest to, że w danych wyjściowych git diff błędy białych znaków są podświetlane tylko w wprowadzanych wierszach, a nie w usuwanych”. Dokładnie! I nie ma sposobu, aby pokazać to również dla usuniętych linii? (hej, to różnica :))
radarek
6
Dodaj --global do ustawienia w swoim ~ / .gitconfig
simlmx
17
@radarek: możesz użyć opcji odwrotnej:git diff -R
niebieskawy
6
Czy jest dla tego raport o błędzie? Jeśli nie, wydaje się, że powinno.
Ajedi32
3
to zadziałało git config diff.wsErrorHighlight all. Służy git config --global [...]do wprowadzania zmian globalnych (tj. Mających wpływ na wszystkie repozytoria).
Felipe Alvarez
141

Służy git diff -Rdo przekształcania usuniętych linii w dodane linie. Następnie końcowe białe znaki zostaną podświetlone.

(Zakłada się, że masz już włączone podświetlanie białych znaków, zgodnie z ustawieniami kolorów z odpowiedzi Marka. Kredyt za tę metodę należy do posta Junio ​​pod adresem http://git.661346.n2.nabble.com/Highlighting-whitespace-on-removal- with-git-diff-td5653205.html .)

Na przykład, podczas konwersji pliku z końcówek linii DOS do Uniksa, git diff -Rwyraźnie pokazuje mi ^Mznaki (dis) pojawiające się na końcach linii. Bez -R(i bez -witd.) Pokazuje, że cały plik się zmienił, ale nie pokazuje, jak.

Paul Whittaker
źródło
4
Oczywiście możesz to zrobić, git diff | cat -A | less -Sjeśli jesteś zdesperowany, ale oprócz powrotu karetki catwyświetli również dowolny kolor, podświetlając kody ucieczki dosłownie.
Paul Whittaker,
3
@Paul_Whittaker cat -Anie jest przenośny. W kotach BSD nie ma takiej opcji. Użyj cat -vetzamiast tego.
7heo.tk
9

Użyj git diff --color | less -R. Dzięki -Rtemu kody kontroli kolorów są przyjazne dla człowieka.

Następnie możesz skorzystać z lesswyszukiwania wyrażeń regularnych, np

/[[:space:]]+$
kelwin
źródło
Nawiasem vimmówiąc, to wyrażenie regularne również działa .
Jose Alban
Ten ostatni pomysł less -Rwłaśnie ułatwił mi ls --colorprzejście less.
Menachem
0

git diffWydaje się, że moja wersja już to robi - mam git 1.7.4.1 i ustawiłem color.ui = auto.

nickgrim
źródło
12
Właśnie przetestowałem git 1.7.5.1 i na pewno nie wyróżnia on końcowych białych znaków w usuwanych wierszach.
Infiltrator