Comment faire fonctionner diff comme git-diff?

148

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

Je peux exécuter en git diffutilisant un --no-indexdrapeau en dehors d'un dépôt git et cela fonctionne bien. Cependant, il semble manquer l' --excludeoption d'exclusion de fichiers ou de sous-répertoires d'un récursif diff.

Existe-t-il un moyen d'obtenir le meilleur des deux mondes? (options de couleur et +/ -format git diffet --excludeoption de diff GNU).

J'ai expérimenté colordiff, mais je préfère toujours le format de sortie degit diff

Mzzzzzz
la source
1
Pour le bleu pour les ajouts verts, le changement newtextdans /etc/colordiff. Je pense que git utilise le vert?
Rudie
1
Je n'avais jamais entendu parler de l'indicateur --no-index jusqu'à présent. Je viens de l'utiliser pour comparer la sortie de git show au diff de deux fichiers - merci pour cela!
AJM-Reinstate-Monica le

Réponses:

175

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

diff -u file1 file2
jonescb
la source
6
Cool, cela combiné avec colordiff me rapproche suffisamment de ce que je veux. Je suppose que j'ai besoin de faire défiler plus bas la page de manuel la prochaine fois ... Merci!
Mzzzzzz
13
Un moyen simple d'obtenir la colorisation avec diff -u, est également redirigez la sortie de tig, le spectateur repo git commandline: diff -u file1 file2 | tig.
Samuel Lampa
3
Installez à colordiffpartir de votre référentiel apt / yum / pacman et utilisez-le.
iBug
Nécessaire pour activer les packages supplémentaires pour Enterprise Linux (EPEL) sur Amazon Linux à installer colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide
Pat Myron
1
En outre colordiff, vous pouvez également obtenir de la couleur vimen définissant cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major le
94

Vous pouvez également utiliser git diff --no-index -- A B(via la page de manuel ).

eacousineau
la source
1
+1, mais malheureusement cela ne fonctionne pas si l'un des fichiers est un lien symbolique.
Emil Lundberg
2
+1 Ceci est très utile car cela montre comment créer un rapport git où deux fichiers suivis Aet Bdiffèrent par rapport à l'autre au lieu de l'endroit où chaque fichier a été modifié par rapport à leur dernière révision respective.
J. Katzwinkel
@EmilLundberg: fonctionne pour moi avec des liens symboliques dans git 1.9.1 sous Linux. Je ne sais pas si les versions antérieures sont cassées.
kkm
3
git diff --no-indexC'est génial, mais comme le PO l'a souligné, il n'a pas le --excludedrapeau, donc c'est souvent d'une utilité très limitée.
Ken Williams
25
  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. À utiliser colordiff -u file1 file2pour deux fichiers ou colordiff -ruN path1 path2pour comparer récursivement les chemins.

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

Steve
la source
18

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: cela indique à Less d'afficher les couleurs au lieu des codes bruts.

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

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 mettre également dans votre ~/.bashrcfichier.

function gdiff () { diff -u $@ | colordiff | less -R; }
Nate
la source
4
Pour avoir une seule fonction bash pour cela, ajoutez au .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă
4

GNU diffa une --coloroption depuis la version 3.4 fin 2016 selon cette réponse sur Unix SE. Cela -udevrait suffire à imiter la sortie de git diff:

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

--colordoit être alwaysutilisé dans un tuyau, autodésactivera la couleur dans les tuyaux.

Je n'ai essayé cela qu'avec Git Bash sur Windows, où less -Rne colorerait que la première ligne d'un morceau. less -rcorrigé pour moi dans ce cas.

coeurs codés
la source
3

En utilisant seulement bash, diff, tputet less, nous pouvons suivre de près les sortie git diff. Il y aura cependant des différences notables en raison de la myopie des diffprogrammeurs.

Placez la définition de fonction Bash suivante dans un fichier qui est automatiquement généré par votre compte d'utilisateur, et vous pourrez accéder à la fonction à 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, diffest appelé avec diverses options de formatage pour spécifier comment les modifications dans les fichiers seront affichées.
  2. tputest 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 setafpar tput setf.
  3. La sortie de diffest redirigée vers less. -Rpermet de conserver les couleurs ANSI. -Xempêche lessde vider l'écran en sortant. -Fempêche lessde fonctionner comme un téléavertisseur si la sortie tient dans un écran.
  4. Si le premier paramètre est @full, la fonction affichera toutes les lignes inchangées en plus des lignes ajoutées et supprimées.

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

  1. git diffrapporte trois lignes de contexte entourant chaque changement. Malheureusement, diffsemble se plaindre et quitter si vous souhaitez spécifier le nombre de lignes de contexte tout en spécifiant simultanément les options de formatage. (Du moins, c'est le cas dans Mac OS X Yosemite). Merci aux diffprogrammeurs. Par conséquent, vous pouvez demander aucune ligne de contexte autour de chaque modification, ce qui est le comportement par défaut, ou vous pouvez demander que toutes les lignes inchangées du fichier soient également signalées, en spécifiant @fullcomme 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 varieront également de ceux indiqués par git diff.
  3. Vous pouvez voir la présence de modifications sur une seule ligne signalées, ce qui est le comportement correct, mais gênant lorsque votre fichier modifié contient l'insertion de lignes vides uniques. Je pense qu'il git difftraite mieux cela, via ses lignes de contexte. Vous pouvez essayer de passer différentes options à diffpour mieux gérer les espaces, si vous préférez.
Dejay Clayton
la source
2

Vous recherchez colordiff:

sudo apt-get install colordiff
Davoud Taghawi-Nejad
la source
2

Placez ceci dans votre .bashrcou .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

exigences: gitet colordiffdoit être installé au préalable.

utilisation: diff file1 file2

exemple: pour $diff .tmux.conf .zshrc.pre-oh-my-zsh

exemple de fonction diff

himanshuxd
la source
0

L'autre option est de le faire depuis l'extérieur du référentiel afin que git sache faire des différences 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
    )
}
Karl
la source
0

Utilisez colordiff :

Installation:

sudo apt-get install colordiff

Usage:

colordiff -u file_one file_two

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

Rakmo
la source
0

Si vous n'avez pas colordiffou git diff, vous pouvez obtenir des couleurs vim.

cdiff() { diff -u $@ | vim -R -; }

ou simplement

cdiff() { diff -u $@ | view -; }
Syrtis Major
la source
0

Comme la chauve-souris a une belle coloration, j'ai testé si cela fonctionne diffaussi et, étonnamment, cela fonctionnait très bien dès la sortie de la boîte.

$ diff file1 file2 | bat ou $ diff -u file1 file2 | bat

Donc, je suppose que vous pourriez créer une fonction comme celle-ci ci-dessous pour être plus efficace:

function bdiff () { diff -u $@ | bat;}
Heechul Ryu
la source
0

Testé dans Debian 9 diff -u --color=always file1 file2

NoOneYouKnow
la source
-2

Je pense que le paramétrage de la configuration:

[color]
     ui = true

combiné avec l' --relative=<path>option de la commande "diff" ferait ce que vous vouliez. As-tu essayé ?

Aucun-da
la source
3
Ceci est pour le diff in git. Il demandait les diffoptions du programme
tr33hous