web-dev-qa-db-fra.com

Mettez en surbrillance les lignes modifiées et les octets modifiés dans chaque ligne modifiée

Le projet Open Source Trac a un excellent surligneur diff - il met en évidence les lignes modifiées et les octets modifiés dans chaque ligne modifiée! Voir - ici ou ici pour des exemples.

Est-il possible d'utiliser la même surbrillance de couleur (c'est-à-dire des lignes modifiées et des octets modifiés également ) dans le terminal bash, git ou vim pour la sortie diff (fichier patch)?

82
Nikolay Frantsev

Le diff-highlight Script contrib Perl produit une sortie si similaire à celle des captures d'écran de Trac qu'il est probable que Trac l'utilise:

enter image description here

Installer avec:

wget https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight && chmod +x diff-highlight

Déplacer le fichier diff-highlight à la ~/bin/ répertoire (ou partout où votre $PATH is), puis ajoutez ce qui suit à votre ~/.gitconfig:

[pager]
        diff = diff-highlight | less
        log = diff-highlight | less
        show = diff-highlight | less

Installation de copier-coller simple suggérée par @cirosantilli:

cd ~/bin
curl -O https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight
chmod +x diff-highlight
git config --global pager.log 'diff-highlight | less'
git config --global pager.show 'diff-highlight | less'
git config --global pager.diff 'diff-highlight | less'
53
Sina Samavati

En utilisant git diff ou git log et éventuellement d'autres, utilisez l'option --Word-diff=color (il existe également d'autres modes pour Word diffs BTW)

37
anydot

diff-so-fancy est un diff - surligneur conçu pour les globes oculaires humains.

Il supprime le premier +/- qui sont gênants pour couper/coller et rend les sections claires entre les fichiers.

Couleur git (à gauche) vs diff-so-fancy (à droite - notez les surbrillances au niveau du personnage):

diff-so-fancy output

Si vous voulez le diff-so-fancy (côté droit) mais non limité aux fichiers d'un référentiel git, ajoutez la fonction suivante à votre .bashrc pour l'utiliser sur tous les fichiers:

dsf() { git diff --no-index --color "$@" | diff-so-fancy; }

Par exemple:

dsf original changed-file

Surlignage au niveau des caractères et format standard diff

Si vous n'aimez pas le formatage non standard de diff-so-fancy, mais vous souhaitez toujours mettre en surbrillance au niveau des caractères git, utilisez diff-highlight qui prendra la sortie de git et produira la sortie au format diff vraiment très standard:

diff-highlight screenshot

Pour l'utiliser par défaut à partir de git, ajoutez à votre .gitconfig:

[color "diff-highlight"]
  oldNormal = red bold
  oldHighlight = red bold 52
  newNormal = green bold
  newHighlight = green bold 22

[pager]
  diff = diff-highlight | less -FRXsu --tabs=4

Le [pager] la section indique à git de diriger sa sortie déjà colorisée vers diff-highlight qui se colore au niveau des caractères, puis affiche la sortie en moins (si nécessaire), plutôt que d'utiliser simplement la valeur par défaut less.

15
Tom Hale

Le comportement que vous souhaitez est maintenant disponible dans git lui-même (comme cela a été souligné dans un commentaire de naught101). Pour l'activer, vous devez régler votre téléavertisseur sur

Perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

/usr/share/doc/git/contrib/diff-highlight/diff-highlight est l'emplacement du script de surligneur sur Ubuntu 13.10 (je ne sais pas pourquoi il se trouve dans un dossier doc). Si ce n'est pas le cas sur votre système, essayez d'utiliser locate diff-highlight pour le trouver. Notez que le script de surbrillance n'est pas exécutable (au moins sur ma machine), d'où l'exigence de Perl.

Pour toujours utiliser le surligneur pour les différentes commandes de type diff, ajoutez simplement ce qui suit à votre ~/.gitconfig fichier:

[pager]
    log = Perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    show = Perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    diff = Perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

J'ai ajouté ceci comme une nouvelle réponse Le commentaire de naught101 est enterré et parce que la configuration n'est pas aussi triviale qu'elle devrait l'être et au moins sur la version d'Ubuntu que j'ai les instructions dans le readme ne fonctionne pas.

12
dshepherd

Un utilitaire pour les différences basées sur les octets a été distribué avec Git officiel depuis la v1.7.81. Il vous suffit de localiser où il est installé sur votre machine et de l'activer.

Trouvez où Git est installé

  • MacOS avec Git installé via Homebrew : C'est /usr/local/opt/git
  • Windows avec Git pour Windows : Exécutez cd / && pwd -W Pour trouver le répertoire d'installation.
  • Linux: Nerd. Si vous ne savez pas déjà où Git est installé, alors ll $(which git) ou locate git Devrait vous aider.

Liez diff-highlight À votre répertoire bin afin que votre PATH puisse le trouver

GIT_HOME='/usr/local/opt/git/'  # Use the value from the first step.
ln -s "${GIT_HOME}/share/git-core/contrib/diff-highlight/diff-highlight" \
      '/usr/local/bin/diff-highlight'

Activez-le dans votre configuration Git

git config --global interactive.diffFilter diff-highlight # Use on interactive prompts
git config --global pager.diff "diff-highlight | less"    # Use on git diff
git config --global pager.log  "diff-highlight | less"    # Use on git log
git config --global pager.show "diff-highlight | less"    # Use on git show

1 Voici la version v1.7.8 , mais beaucoup de changements ont été effectués depuis lors.

10
Cory Klein

J'utilise --color-words option et cela fonctionne bien pour moi:

$ git diff --color-words | less -RS
10
amized

comme @ dshepherd dit :

Le comportement que vous souhaitez est maintenant disponible dans git lui-même

Mais diff-highlight se trouve dans DOC et n'est pas disponible auprès de Shell.
À installer diff-highlight Dans votre ~/bin répertoire suivez les étapes suivantes (cela permettra d'économiser votre saisie):

$ locate diff-highlight
$ cd /usr/share/doc/git/contrib/diff-highlight  #or path you locate
$ Sudo make
$ mv diff-highlight ~/bin

Configurez ensuite votre .gitconfig comme le dit le doc officiel:

[pager]
    log  = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

[~ # ~] upd [~ # ~]
Vous pouvez également essayer le dernier git sans aucune installation:

git diff --color-words=.

Plus complexe:

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
4
Eugen Konkov

Diffy

GitLab utilise Diffy https://github.com/samg/diffy (Ruby) pour obtenir une sortie similaire à GitHub et diff-highlight:

enter image description here

Diffy crée le diff lui-même en utilisant le même algorithme et Git, et prend en charge différents types de sorties, y compris la sortie HTML que GitLab utilise:

gem install diffy
echo '
  require "diffy"    
  puts Diffy::Diff.new("a b c\n", "a B c\n").to_s(:html)
' | Ruby

Production:

<div class="diff">
  <ul>
    <li class="del"><del>a <strong>b</strong> c</del></li>
    <li class="ins"><ins>a <strong>B</strong> c</ins></li>
  </ul>
</div>

Notez comment strong a été ajouté aux octets modifiés.

Emacs a la fonction ediff-patch-buffer qui devrait répondre à vos besoins.

Ouvrez le fichier non corrigé dans emacs de type ESC-x, ediff-patch-buffer.

Suivez les invites et vous devriez voir une comparaison en surbrillance des versions corrigées et originales de votre fichier.

Selon votre commentaire, ce qui suit vous donnera une solution bash ne nécessitant que dwdiff:

#!/bin/bash
paste -d'\n' <(dwdiff -2 -L -c <(cat $2) <(patch $2 -i $1 -o -)) <(dwdiff -1 -L -c <(cat $2) <(patch $2 -i $1 -o -))| uniq
1
Finbar Crago

Oui, Vim le fait, y compris la mise en évidence du texte modifié dans une ligne.
Voir :h diff et :h 08.7 pour plus de détails sur la façon de différencier les fichiers.

Vim utilise un algorithme assez simple pour sa mise en évidence. Il recherche dans la ligne le premier caractère modifié, puis le dernier caractère modifié, et met simplement en surbrillance tous les caractères entre eux.
Cela signifie que vous ne pouvez pas avoir plusieurs points forts par ligne - de nombreuses décisions de conception dans Vim priorisent l'efficacité.

0
PDug

vimdiff file1 file2 affichera la différence en caractères entre deux fichiers.

vimdiff est un outil de diff inclus dans vim. (Vim aurait dû être compilé avec l'option + diff, pour être sûr que vous pouvez vérifier avec :version)

Vous pouvez également le lancer depuis l'intérieur de vim. Voir :help diff pour plus d'informations et de commandes.

0
Xavier T.