Colorindo o espaço em branco na saída do git-diff

151

Em relação à formatação do código, sou meio que purista :). Costumo remover espaços em branco desnecessários (linhas com apenas ws, ws no final das linhas, etc.). Eu até configurei o vim para mostrar esse tipo de linhas coloridas em vermelho.

Meu problema é que, usando o git-diff, muitas vezes vejo algo assim:

-      else{ 
+      else{

Mesmo que eu tenha a cor git-diff, não vejo diferença (nessa situação em particular, removi 1 ws no final da linha). Existe alguma maneira de dizer ao git-diff para mostrar que foi colorido de vermelho? (por exemplo, aqueles combinados com / \ s + $ / regexp).

radarek
fonte
4
Se você inverter as cores (trocar primeiro plano e plano de fundo), as alterações de espaço em branco serão exibidas. Uma maneira fácil de fazer isso em muitos terminais é realçar o texto em questão com o mouse. Esse truque só funciona com um diff colorido, é claro.
Phlarx

Respostas:

172

Pode ser necessário definir a configuração color.diff.whitespace, por exemplo, com:

 git config color.diff.whitespace "red reverse"

(Suponho que você já tenha definido color.diffou color.uidefinido, autopois diz que vê manchas coloridas de git diffqualquer maneira.)

Se você deseja ajustar com precisão o tipo de erros de espaço em branco destacados em vermelho, é possível alterar core.whitespace, mas blank-at-eolestá ativado por padrão, para que você provavelmente não precise alterar isso no exemplo mencionado.

Uma possível fonte de confusão é que, na saída de git diff, os erros de espaço em branco são destacados apenas nas linhas que são introduzidas, não nas que são removidas. ( Atualização: como Paul Whittaker aponta em sua resposta , que você deve votar novamente :), você pode vê-las revertendo o sentido da diferença git diff -R.)

Você pode encontrar mais documentação sobre essas opções de configuração na página de manual do git config

Se você não quiser usar o -Rkludge, poderá usar a opção WhiteSpace Error Highlight na página do manual diff .

--ws-erro-destaque =

Destaque erros de espaço em branco nas linhas especificadas na cor especificada por color.diff.whitespace. é uma lista separada por vírgula de contexto antigo e novo. Quando essa opção não é fornecida, apenas os erros de espaço em branco nas novas linhas são realçados. Por exemplo, --ws-error-highlights = new, old destaca erros de espaço em branco nas linhas excluídas e adicionadas. tudo pode ser usado como uma abreviação para o contexto antigo e novo.

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

ou

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

Eu não sei de uma maneira de permanentemente ativar isso e armazenar isso na configuração além de usar um alias:

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

Agora você pode usar:

git df <file>

Para ver as mudanças em vermelho.

Observe que, com o Git 2.11 (quarto trimestre de 2016) , esse alias pode ser substituído por:

git config diff.wsErrorHighlight all

Veja doc sobregit diff e sobregit config .

Mark Longair
fonte
33
"Uma possível fonte de confusão é que, na saída do git diff, os erros de espaço em branco são destacados apenas nas linhas que são introduzidas, não nas que são removidas." Exatamente! E não há como mostrá-lo também para linhas removidas? (hey, é diff :))
radarek
6
Adicionar --global ao set em seu ~ / .gitconfig
simlmx
17
@radarek: você pode usar a opção reversa:git diff -R
blueyed:
6
Existe um relatório de bug para isso? Caso contrário, parece que deveria haver.
precisa saber é o seguinte
3
isso funcionou git config diff.wsErrorHighlight all. Use git config --global [...]para tornar as alterações globais (isto é, afetando todos os repositórios).
Felipe Alvarez
141

Use git diff -Rpara transformar linhas removidas em linhas adicionadas. O espaço em branco à direita será destacado.

(Isso pressupõe que você já tenha a iluminação de espaços em branco ativada, de acordo com as configurações de cores da resposta de Mark. O crédito para esse método está na publicação de Junio ​​em http://git.661346.n2.nabble.com/Highlighting-whitespace-on-removal- com-git-diff-td5653205.html .)

Por exemplo, ao converter um arquivo de finais de linha do DOS para Unix, git diff -Rmostra-me claramente os ^Mcaracteres (des) que aparecem no final das linhas. Sem -R(e também sem -wetc.) mostra que o arquivo inteiro foi alterado, mas não mostra como.

Paul Whittaker
fonte
4
Obviamente, você também pode fazer isso git diff | cat -A | less -Sse estiver desesperado, mas, além dos retornos de carro, catele também exibirá qualquer cor destacando códigos de escape literalmente.
Paul Whittaker
3
@Paul_Whittaker cat -Anão é portátil. No gato BSD, não existe essa opção. Por favor, use em seu cat -vetlugar.
7heo.tk
9

Use git diff --color | less -R. Isso -Rtorna os códigos de controle de cores compatíveis com humanos.

Em seguida, você pode usar lessa pesquisa de expressões regulares, por exemplo

/[[:space:]]+$
Kelvin
fonte
Essa expressão regular também funciona vim, a propósito.
21715 Jose Jose Alban
Essa última idéia less -Rapenas facilitou a ls --colorpassagem less.
Menachem
0

Minha versão do git diffjá parece fazer isso - eu tenho o git 1.7.4.1 e configurei color.ui = auto.

nickgrim
fonte
12
Acabei de testar com o git 1.7.5.1 e certamente não destaca espaços em branco finais nas linhas que estão sendo removidas.
Infiltrador