'veja git log' com as cores corretas

1

Eu quero watch a saída de git log --oneline --graph com todas as cores e tentei adaptar a solução de Por que as cores git não aparecem ao usar o relógio? , mas apenas renderiza (quase) toda a saída em laranja:

Saída usando watch -c

$ watch -c git -c color.diff=always log --graph --oneline

Observecomodesdeoprimeirohashdeconfirmaçãoemtudoéimpressoemlaranja.Estaéasaídadewatchfromprocps-ng3.3.10noUbuntu16.04.

Saídanormal=meta

$gitlog--graph--oneline

A saída com um -c color.diff=always adicional é a mesma, cat -A mostra as seqüências de cores ANSI em uso:

$ git -c color.diff=always log --graph --oneline | cat -A
* ^[[33m8ccd905^[[m L
* ^[[33me4ad4f6^[[m E
* ^[[33mf427d2a^[[m U
* ^[[33me8351c8^[[m Z
* ^[[33mf06747c^[[m I

Pergunta

Como posso obter watch git log para mostrar as cores como git log ?

    
por dessert 22.10.2017 / 11:13

3 respostas

3

Este foi um bug em procps-ng (nome do pacote do Ubuntu procps ), corrigido na versão 3.3.11.

O último Ubuntu LTS (16.04 Xenial) ainda contém o bug, enquanto as versões regulares atuais (17.04 Zesty e 17.10 Artful) já possuem a versão corrigida.

    
por egmont 22.10.2017 / 13:52
1

O comentário de egmont conta sobre watch não reconhecer ANSI 39 (redefinir somente a cor de primeiro plano). É ^[[39m , conforme indicado por WJAndrea . Outros responderam que é um erro em procps-ng .

Em outros comandos git, como diff , é notório que cores strongs funcionam, mas qualquer texto não colorido que se segue mantém a cor anterior, até que uma nova cor em negrito apareça. A razão é que as cores strongs especificam '^ [[ 1; ## m'.

Então sabíamos onde nos concentrar.

Primeiro fiz um regex rápido com sed para substituir todas as cores em negrito e estava funcionando bem. Exigia apenas uma cor em negrito principal, porque alguns comandos git não são iniciados em cores e havia um texto regular inicial até o primeiro código de cor.

Eu testei durante esta tarde, e aquele texto em negrito massivo estava chamando minha atenção.

% bl0ck_qu0te%

Outro problema é que codifiquei uma cor cinza claro em negrito para substituir o texto sem cor: as pessoas que usam outros esquemas de cores podem gritar comigo.

Para resolver tudo, mudei minha ideia inicial para algo mais simples. Em vez de negrito o texto, só preciso adicionar um 0 para tornar o código de cor válido para watch . Mudou alguns personagens e voilà! As cores aparecem como esperado, os textos em negrito mantêm o significado e a janela fica mais bonita.

Testei o desempenho com um histórico de confirmação enorme (> 90k confirmações) e há um atraso considerável de alguns milissegundos, se você usar os --graph ou --date-order sinalizadores e talvez outros, mas --oneline parece seguro. Mesmo pedindo para registrar apenas alguns commits, o Git precisa processar todo o histórico para gerar o gráfico.

Mas esse caso foi extremo. E você não precisa de uma atualização de 0,1s. 3 ou 4s parece ser bom. watch -n #

Meu código atual é o seguinte:

#!/bin/bash
git -c color.ui=always "$@" | sed -r $'s/3\[([[:digit:]][[:digit:]])m/3\[0;\1m/g; s/3\[m/3\[0m/g'

Eu salvei em ~/bin/git-colored com permissão + x e ele pode ser usado com git colored <git command>

Resolvendo o post principal: watch -c 'git colored log --oneline --graph'

Eu criei um gist com esse arquivo, onde você pode ver o histórico de códigos.

TL; DR

Existe um bug em um pacote do Ubuntu. O código de uma linha acima é uma solução alternativa para quem não pode / não deseja atualizar o sistema, basicamente fazendo o que está em aqui .

    
por Aryel Góis 17.01.2018 / 14:49
1

Uma solução rápida que fiz se você não tiver procps-ng 3.3.11: canalize sua saída do git por sed "s/\x1b\[m/\x1b\[00m/" , por exemplo. para git status :

watch -c 'git -c color.ui=always status | sed "s/\x1b\[m/\x1b\[00m/"'

Isso substitui as fugas ANSI vazias ( [m , não reconhecidas por watch ) pelas zeradas ( [00m , totalmente reconhecidas por watch ).

    
por The Guy with The Hat 19.09.2018 / 22:16