web-dev-qa-db-fra.com

Comment faire fonctionner diff comme git-diff?

J'aime le format de sortie de git diff. La couleur et la représentation +/- des modifications entre les lignes sont plus faciles à lire que GNU diff.

Je peux exécuter git diff en utilisant le drapeau --no-index en dehors d'un dépôt git et cela fonctionne bien. Cependant, il semble manquer l'option --exclude pour exclure des fichiers ou des sous-répertoires d'une variable __ récursive diff

Y a-t-il un moyen d'obtenir le meilleur des deux mondes? (options de couleur et format +/- de git diff et option --exclude de GNU diff). 

J'ai expérimenté avec colordiff , mais je préfère quand même le format de sortie de git diff

108
Mzzzzzz

Je ne sais pas comment faire de la couleur mais cela fera le +/- plutôt que < et >.

diff -u file1 file2
129
jonescb

Vous pouvez également utiliser git diff --no-index -- A B (via manpage ).

78
eacousineau
  1. Installez colordiff .

  2. Mettez à jour votre ~/.colordiffrc (en copiant d'abord/etc/colordiffrc, si nécessaire):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Utilisez colordiff -u file1 file2 pour deux fichiers ou colordiff -ruN path1 path2 pour comparer récursivement les chemins.

Ce n'est pas exactement la même chose, mais c'est très proche.

23
Steve

C'est ce que je suggère et c'est assez proche

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Vous devrez installer ceci
  • -R: ceci indique à Less d'afficher les couleurs au lieu des codes bruts.

J'ai finalement utilisé -w parce que je ne voulais pas voir les différences d'espaces.

diff -w -u FILE1 FILE2 | colordiff | less -R

Edit: Comme suggéré par @Ciprian Tomoiaga dans le commentaire, vous pouvez en faire une fonction et la placer également dans votre fichier ~/.bashrc.

function gdiff () { diff -u $@ | colordiff | less -R; }
15
Nate

En utilisant uniquement bash, diff, tput et less, nous pouvons nous approcher de la sortie de git diff. Cependant, il y aura des différences notables en raison de la vision à court terme des programmeurs diff.

Placez la définition de la fonction Bash suivante dans un fichier généré automatiquement par votre compte utilisateur. Vous pourrez y accéder à partir de la ligne de commande:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

Cette fonction fonctionne comme suit:

  1. En fin de compte, diff est appelé avec différentes options de formatage pour spécifier le mode d'affichage des modifications dans les fichiers.
  2. tput est utilisé pour insérer des codes de couleur ANSI dans ces options de formatage. Notez que lorsque vous utilisez des terminaux non-ANSI, vous devrez peut-être remplacer tput setaf par tput setf.
  3. La sortie de diff est transférée dans less. -R permet de conserver les couleurs ANSI. -X empêche less d'effacer l'écran lors de la sortie. -F empêche less de fonctionner comme un pageur si la sortie tient dans un seul écran.
  4. Si le premier paramètre est @full, la fonction affichera toutes les lignes non modifiées en plus des lignes ajoutées et supprimées.

Notez les différences suivantes entre cette approche et git diff:

  1. git diff rapporte trois lignes de contexte entourant chaque changement. Malheureusement, diff semble se plaindre et se fermer si vous souhaitez spécifier le nombre de lignes de contexte tout en spécifiant simultanément les options de formatage. (Au moins c'est le cas dans Mac OS X Yosemite). Merci diff programmeurs. Par conséquent, vous pouvez soit ne demander aucune ligne de contexte entourant chaque modification (comportement par défaut), soit demander que toutes les lignes non modifiées du fichier soient également signalées en spécifiant @full en tant que premier paramètre.
  2. Comme les lignes de contexte sont différentes de git diff, les numéros de ligne indiqués par cette fonction seront également différents de ceux indiqués par git diff.
  3. Vous constaterez peut-être la présence de modifications d'une seule ligne signalées, ce qui constitue le comportement correct, mais gênant lorsque votre fichier modifié contient l'insertion de lignes vides uniques. Je pense que git diff traite mieux cela, via ses lignes de contexte. Vous pouvez essayer de passer différentes options à diff afin de mieux gérer les espaces, si vous préférez.
2
Dejay Clayton

Vous recherchez colordiff :

Sudo apt-get install colordiff
2

GNU diff a une option --color depuis la version 3.4 fin 2016 selon cette réponse sur Unix SE. Cela devrait suffire, à côté de -u, à reproduire le résultat de git diff:

diff -u --color=always file1 file2 | less -r

--color doit être always lorsqu'il est utilisé dans un tuyau, auto désactive la couleur dans les tuyaux.

Je n'ai essayé cela qu'avec Git Bash sous Windows, où less -R ne ferait que colorer la première ligne d'un morceau. less -r l'a corrigé pour moi dans ce cas.

1
codehearts

Utilisez colordiff :

Installation:

Sudo apt-get install colordiff

Utilisation:

colordiff -u file_one file_two

Donne exactement la même différence que celle indiquée par git diff.

0
Omkar Deshpande

L'autre option consiste à le faire depuis l'extérieur du référentiel afin que git sache qu'il existe une différence entre les fichiers. par exemple. une fonction Shell quelque chose comme:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}
0
Karl