O projeto de código aberto Trac tem um excelente iluminador de diferenças - ele destaca as linhas alteradas e os bytes alterados em cada linha alterada! Veja aqui ou aqui para exemplos.
Existe uma maneira de usar o mesmo destaque de cor (ou seja, linhas alteradas e bytes alterados também ) no terminal bash,, git
ou vim
para saída diff (arquivo de patch)?
Respostas:
O
diff-highlight
script Perl contrib produz uma saída tão semelhante às capturas de tela do Trac que é provável que o Trac o esteja usando:Instale com:
Mova o arquivo
diff-highlight
para o~/bin/
diretório (ou onde quer que você$PATH
esteja) e, em seguida, adicione o seguinte ao seu~/.gitconfig
:Instalação de colagem de cópia única sugerida por @cirosantilli:
fonte
git add -p
. Por favor, adicione também:git config --global interactive.diffFilter diff-highlight
Enquanto estiver usando
git diff
ougit log
e possivelmente outros, use a opção--word-diff=color
(também existem outros modos para diferenças de palavras BTW)fonte
--word-diff=color
é realmente melhor (especialmente comgit config color.diff.old "red reverse"
egit config color.diff.new "green reverse"
), mas não é o que eu quero :(git add --patch
: stackoverflow.com/questions/10873882/…diff-highlight
é que funciona bem com diffs de palavras e diffs de linha.diff-so-fancy
é umdiff
-highlighter projetado para olhos humanos.Ele remove o
+
/-
que é irritante para recortar / colar e torna claras as seções entre os arquivos.Colorido
git
(esquerda) xdiff-so-fancy
(direita - observe os destaques no nível do personagem):Se quiser a
diff-so-fancy
saída (lado direito), mas não restrita a arquivos em umgit
repositório, adicione a seguinte função ao seu.bashrc
para usá-la em qualquer arquivo:Por exemplo:
Destaque de nível de caractere e
diff
formato padrãoSe você não gosta da formatação fora do padrão
diff-so-fancy
, mas ainda desejagit
realce no nível do caractere , use odiff-highlight
que pegarágit
a saída de e produzirá umadiff
saída de formato padrão realmente bonita :Para usá-lo por padrão
git
, adicione ao seu.gitconfig
:A
[pager]
seção dizgit
para canalizar sua saída já colorida paradiff-highlight
que colore no nível do caractere, e então pagina a saída em menos (se necessário), ao invés de apenas usar o padrãoless
.fonte
gitconfig
opções?dsf()
.O comportamento que você deseja agora está disponível no próprio git (como foi apontado em um comentário por naught101). Para habilitá-lo, você precisa definir seu pager para
onde
/usr/share/doc/git/contrib/diff-highlight/diff-highlight
está a localização do script do marcador no Ubuntu 13.10 (não tenho ideia de por que está em umadoc
pasta). Se não estiver lá em seu sistema, tente usarlocate diff-highlight
para encontrá-lo. Observe que o script de realce não é executável (pelo menos na minha máquina), daí o requisito paraperl
.Para sempre usar o realce para os vários comandos do tipo diff, basta adicionar o seguinte ao seu
~/.gitconfig
arquivo:Eu adicionei isso como uma nova resposta, o comentário de naught101 está enterrado e porque a configuração não é tão trivial quanto deveria ser e pelo menos na versão do Ubuntu que tenho as instruções no README não funcionam.
fonte
git add -p
(modo interativo). Não sei como isso pode ser consertado, porém, simplesmente adicionar add à lista faz com que ele trave.git config interactive.diffFilter diff-highlight
diff-highlight
não estava no meu caminho, então tive que localizá-lo primeiro. Detalhes na minha resposta abaixo.Um utilitário para diffs baseado em bytes foi distribuído com o Git oficial desde v1.7.8 1 . Você só precisa localizar onde está instalado em sua máquina e habilitá-lo.
Descubra onde o Git está instalado
/usr/local/opt/git
cd / && pwd -W
para localizar o diretório de instalação.ll $(which git)
oulocate git
deve ajudar.Link
diff-highlight
para o diretório bin para que seu PATH possa encontrá-loHabilite em sua configuração Git
1 Aqui está a versão v1.7.8 , mas muitas mudanças foram feitas desde então.
fonte
which git
requer que esteja no PATH em primeiro lugar, então não funcionará se não estiver :-)diff-highlight
, na verdade não o instala , então a etapa do link simbólico é realmente necessária (pelo menos no macOS). Se você achar que não é necessário para sua plataforma, fique à vontade para atualizar a resposta novamente. Enquanto isso,which git
normalmente não funciona, porque o Git faz instalar agit
algum lugar binário no caminho..perl
. A compilação é trivial: basta executarsudo make
nodiff-highlight
diretório.Eu uso a
--color-words
opção e funciona bem para mim:fonte
como @dshepherd diz :
Mas
diff-highlight
está localizado no DOC e não está disponível no shell.Para instalar
diff-highlight
em seu~/bin
diretório, siga as próximas etapas (isso salvará sua digitação):Em seguida, configure seu
.gitconfig
como documento oficial diz:UPD
Além disso, você pode tentar o próximo no último
git
sem qualquer instalação:Mais complexo:
fonte
O Emacs tem a função ediff-patch-buffer que deve atender às suas necessidades.
Abra o arquivo sem patch no emacs digite ESC-x, ediff-patch-buffer.
Siga as instruções e você verá uma comparação destacada das versões com patch e original do seu arquivo.
De acordo com seu comentário, o seguinte fornecerá uma solução bash que requer apenas dwdiff:
fonte
colordiff -u <(patch original_file -i patch_file -o -) <(cat original_file)
mas isso só vai destacar as linhas alteradas, não as mordidas ...dwdiff -c --diff-input diff_file
Diffy
GitLab está usando Diffy https://github.com/samg/diffy (Ruby) para obter uma saída semelhante ao GitHub e diff-highlight:
O Diffy faz o próprio diff usando o mesmo algoritmo do Git e oferece suporte a diferentes tipos de saídas, incluindo a saída HTML que o GitLab usa:
Resultado:
Observe como
strong
foi adicionado aos bytes alterados.fonte
Sim, o Vim faz isso incluindo o destaque do texto alterado dentro de uma linha.
Veja
:h diff
e:h 08.7
para mais detalhes sobre como comparar arquivos.O Vim usa um algoritmo bastante simples para realçar. Ele procura na linha o primeiro caractere alterado e, em seguida, o último caractere alterado, e simplesmente destaca todos os caracteres entre eles.
Isso significa que você não pode ter vários destaques por linha - muitas decisões de design no Vim priorizam a eficiência.
fonte
vimdiff file1 file2
irá mostrar a diferença entre dois arquivos.vimdiff é uma ferramenta diff incluída no vim. (O Vim deveria ter sido compilado com a opção + diff, para ter certeza de que você pode verificar
:version
)Você também pode iniciá-lo de dentro do vim. Veja
:help diff
para mais informações e comandos.fonte
vimdiff file.old file.new -c 'FormatCommand diffformat' -c 'w! file.diff.html' -c 'qa!'
.screen -D -m
ou acrescentar&>/dev/null
(a variante / dev / null às vezes produz bugs estranhos) se você não quiser ver o terminal piscando) e sair do vim após a formatação, mas é puro vimscript e mesmo com minhas otimizações, é muito lento para arquivos grandes.Nota : esta é uma duplicata do que é encontrado aqui: Como melhorar o realce de diff do git?. Postando minha resposta aqui também, pois pode ser útil para algumas pessoas que encontram este tópico diretamente :)
Como dito em algumas respostas anteriores, isso é possível apenas com o material git. Eu posto isso porque as instruções podem ser um pouco mais fáceis de seguir dependendo do seu sistema, mas isso é semelhante a várias outras respostas.
Uma solução que depende puramente do git e de seus contributos. Isso não requer nenhum arquivo adicional do que o git . Todas as explicações são para o Ubuntu (testado em 18.04LTS), deve funcionar da mesma forma em outros sistemas Linux:
no meu sistema, a única resposta válida é:
~/.gitconfig
para obter o resultado desejado, adicionando (observe que são TABS, não 4 espaços):fonte