Colorir nomes de arquivos baseados em status para git diff --name-status

3

Costumo usar git diff --name-status BRANCH_NAME para obter a lista de arquivos modificados. É possível colorir a saída desse comando semelhante à saída de git status - verde para arquivos adicionados, azul para modificado, vermelho para excluído e assim por diante.

Não é uma duplicata de Como colorir a saída do git? desde que eu quero colorir parte diferente da saída e mudanças nos arquivos de configuração propostos não são aplicáveis

    
por Grief 16.11.2015 / 11:40

3 respostas

3

Eu não conheço nenhuma maneira oficial de fazer isso, mas eu escrevi isso agora e funciona para mim.
Coloque o script abaixo em um arquivo chamado: color_git_diff.sh (ou o que você quiser)

#!/usr/bin/env bash

for i in "$@"
do
    if  grep -q "^M" <<< "$i"
    then
        echo -e "\e[33m $i \e[0m"
    elif  grep -q "^D" <<< "$i"
    then
        echo -e "\e[31m $i \e[0m"
    fi
done

para aplicar o script com o qual você chamaria:

git diff --name-status | xargs --delimiter="\n" ./color_git_diff.sh

Obviamente, você não iria querer chamar isso toda vez, então você precisaria colocá-lo em seu bashrc e atribuir uma função ou um alias a ele - ou algo assim.
Isso só produz saída colorida para arquivos modificados ou excluídos e eu fiz arquivos modificados amarelo - Eu não sei o que o código de escape ansi é para azul fora do topo da minha cabeça - Eu acho que talvez \e[36m ? de qualquer maneira, se você quiser usá-lo, você pode adicioná-lo você mesmo-

    
por 16.11.2015 / 14:09
2

Eu queria fornecer um método um pouco mais atualizado para fazer isso pela simples razão de que, quando tentei a resposta principal, era insuportavelmente lenta, quase um segundo entre as linhas geradas. Isso pode ser devido à execução do git para windows em oposição a uma máquina * nix, mas o comando 'grep' demora muito para ser válido. Dito isto, o mesmo efeito pode ser alcançado, dado que a saída do parâmetro "--name-status" para ambos git log e git diff são strings simples, e assim usando a correspondência de strings simples em vez da ferramenta 'grep', minha saída foi quase imediata.

for i in "$@"
do
    if  [[ ${i:0:1} == "M" ]] #grep -q "^M" <<< "$i"
    then echo -e "\e[34m $i \e[0m"
    elif [[ ${i:0:1} == "D" ]] #grep -q "^D" <<< "$i"
    then echo -e "\e[31m $i \e[0m"
    elif [[ ${i:0:1} == "A" ]] #grep -q "^A" <<< "$i"
    then echo -e "\e[32m $i \e[0m"
    else echo -e "$i"
    fi
done

Eu também adicionei o código para "adicionado", bem como um padrão, por isso, se houver outro texto (como git log --pretty), ele não será ignorado. espero que isso ajude.
Jaeden "Sifo Dyas" al'Raec Ruiner
PS - use o mesmo comando xargs com o delimitador, mas o script acima é mais rápido na análise do que o grep (em uma caixa do windows)

    
por 07.12.2015 / 22:28
-1

Tente o próximo comando:

vimdiff [file1] [file2]
    
por 16.11.2015 / 12:28