Coloration des espaces blancs dans la sortie de git-diff

151

En ce qui concerne le formatage du code, je suis un peu puriste :). Je supprime très souvent les espaces blancs inutiles (lignes avec seulement ws, ws à la fin des lignes, etc.). J'ai même configuré vim pour afficher ce genre de lignes colorées en rouge.

Mon problème est qu'en utilisant git-diff, je vois souvent quelque chose comme ceci:

-      else{ 
+      else{

Même si j'ai git-diff coloré, je ne vois pas la différence (dans cette situation particulière, j'ai supprimé 1 ws à la fin de la ligne). Existe-t-il un moyen de dire à git-diff de montrer que ws est coloré en rouge? (par exemple ceux qui correspondent à / \ s + $ / regexp).

Radarek
la source
4
Si vous inversez les couleurs (permutez le premier plan et l'arrière-plan), les changements d'espaces comme celui-ci apparaîtront. Un moyen simple d'y parvenir dans de nombreux terminaux est de surligner le texte en question avec la souris. Cette astuce ne fonctionne qu'avec un diff coloré, bien sûr.
Phlarx

Réponses:

172

Vous devrez peut-être définir le paramètre de configuration color.diff.whitespace, par exemple avec:

 git config color.diff.whitespace "red reverse"

(Je suppose que vous avez déjà color.diffou color.uimis à autopuisque vous dites que vous voyez des taches de couleur de git difftoute façon.)

Si vous souhaitez affiner le type d'erreurs d'espaces qui sont surlignées en rouge, vous pouvez ensuite le modifier core.whitespace, mais il blank-at-eolest activé par défaut, vous n'aurez donc probablement pas besoin de le changer pour l'exemple que vous mentionnez.

Une source possible de confusion est que dans la sortie de git diff, les erreurs d'espace blanc ne sont mises en évidence que dans les lignes qui sont introduites, pas dans celles qui sont supprimées. ( Mise à jour: comme le souligne Paul Whittaker dans sa réponse , que vous devriez voter à la hausse :), vous pouvez les voir en inversant le sens de la différence avec git diff -R.)

Vous pouvez trouver plus de documentation sur ces options de configuration dans la page de manuel git config

Si vous ne souhaitez pas utiliser -Rkludge, vous pouvez utiliser l' option WhiteSpace Error Highlight de la page de manuel de diff .

--ws-error-highlight =

Mettez en surbrillance les erreurs d'espaces sur les lignes spécifiées par dans la couleur spécifiée par color.diff.whitespace. est une liste de l'ancien, du nouveau contexte, séparés par des virgules. Lorsque cette option n'est pas donnée, seules les erreurs d'espacement dans les nouvelles lignes sont mises en surbrillance. Par exemple, --ws-error-highlight = new, old met en évidence les erreurs d'espace blanc sur les lignes supprimées et ajoutées. tout peut être utilisé comme un raccourci pour l'ancien, le nouveau, le contexte.

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

ou

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

Je ne connais pas de moyen de l'activer de manière permanente et de le stocker dans la configuration en dehors de l'utilisation d'un alias:

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

Vous pouvez maintenant utiliser:

git df <file>

Pour voir les changements en rouge.

Notez qu'avec Git 2.11 (Q4 2016) , cet alias peut être remplacé par:

git config diff.wsErrorHighlight all

Voir doc surgit diff et surgit config .

Mark Longair
la source
34
"Une source possible de confusion est que dans la sortie de git diff, les erreurs d'espace blanc ne sont mises en évidence que dans les lignes introduites, pas dans celles qui sont supprimées." Exactement! Et il n'y a aucun moyen de le montrer également pour les lignes supprimées? (hey, it's diff :))
radarek
6
Ajouter --global à définir dans votre ~ / .gitconfig
simlmx
17
@radarek: vous pouvez utiliser l'option inverse:git diff -R
blueyed
6
Y a-t-il un rapport de bogue pour cela? Sinon, il semble qu'il devrait y en avoir.
Ajedi32
3
cela a fonctionné git config diff.wsErrorHighlight all. Utilisez git config --global [...]pour rendre les modifications globales (c'est-à-dire affectant tous les dépôts).
Felipe Alvarez
141

Utilisez git diff -Rpour transformer les lignes supprimées en lignes ajoutées. Ensuite, les espaces blancs de fin seront mis en évidence.

(Cela suppose que vous avez déjà activé la mise en évidence des espaces blancs, conformément aux paramètres de couleur de la réponse de Mark. Le crédit de cette méthode va à l'article de Junio ​​à http://git.661346.n2.nabble.com/Highlighting-whitespace-on-removal- avec-git-diff-td5653205.html .)

Par exemple, lors de la conversion d'un fichier des fins de ligne DOS vers Unix, git diff -Rme montre clairement les ^Mcaractères (dis) apparaissant à la fin des lignes. Sans -R(et aussi sans -wetc.), cela montre que le fichier entier a changé, mais ne montre pas comment.

Paul Whittaker
la source
4
Bien sûr, vous pouvez également le faire git diff | cat -A | less -Ssi vous êtes désespéré, mais en plus des retours chariot, le cataffichera également toute couleur mettant en évidence les codes d'échappement littéralement.
Paul Whittaker
3
@Paul_Whittaker cat -An'est pas portable. Sur BSD cat, une telle option n'existe pas. Veuillez utiliser à la cat -vetplace.
7heo.tk
9

Utilisez git diff --color | less -R. Le -Rrend les codes de contrôle de couleur conviviaux.

Ensuite, vous pouvez utiliser lessla recherche par expression régulière, par exemple

/[[:space:]]+$
Kelvin
la source
Cette expression régulière fonctionne également vim, d'ailleurs.
Jose Alban du
Cette dernière idée de less -Rjuste il est plus facile pour moi de tuyaux à ls --colortravers less.
Menachem le
0

Ma version de git diffsemble déjà le faire - j'ai git 1.7.4.1 et j'ai défini color.ui = auto.

Nickgrim
la source
12
Je viens de tester avec git 1.7.5.1 et il ne met certainement pas en évidence les espaces de fin dans les lignes supprimées.
Infiltrator