Come colorare diff sulla riga di comando?


Risposte:


608

Le pagine man per diffnon suggeriscono alcuna soluzione per la colorazione dall'interno di se stesso. Si prega di considerare l'utilizzo colordiff. È un wrapper diffche produce lo stesso output di diff, tranne per il fatto che aumenta l'output usando l'evidenziazione della sintassi colorata per aumentare la leggibilità:

diff old new | colordiff

o semplicemente:

colordiff old new

Installazione:

  • Ubuntu / Debian: sudo apt-get install colordiff
  • OS X: brew install colordiffoport install colordiff

45
Ho appena scoperto che :-). Può essere convogliato in meno utilizzando less -R, che visualizza correttamente le sequenze di escape per i colori.
Daniel Kullmann,

34
Può semplicemente usare la sintassi: colordiff file1 file2
Felipe Alvarez,

3
Ahimè, non funziona per l'output side-by-side ( -yopzione da abilitare) ☹ Il vimdiffsuggerimento che segue probabilmente è un modo migliore
Hi-Angel

8
colordifffunziona bene per svn diff | colordiff(cioè in situazioni in cui hai solo il diff, non i due file da diffondere).
Cornstalks,

8
Come aggiornamento al commento di @ Hi-Angel: colordiff è stato aggiornato e ora include il -ysupporto side by side ( ).
Bailey Parker,

333

Usa Vim :

diff /path/to/a /path/to/b | vim -R -

O ancora meglio, VimDiff (o vim -d, che è più breve da digitare) mostrerà differenze tra due, tre o quattro file fianco a fianco.

Esempi:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

7
@Jichao: preferisco imparare i comandi piuttosto che alias. In questo modo posso usarli ovunque, anche quando i miei dotfile non sono disponibili.
Johnsyweb,

1
@AquariusPower: ctrl-ce ctrl-xhanno altri usi in Vim. ctrl-qviene catturato da molti terminali. Vedi Scrivere e smettere per trovare il modo più adatto alle tue esigenze.
Johnsyweb,

1
Innanzitutto, che tipo di shell è questo? zsh? Non riconosco il =(...)costrutto. Secondo, avevo diff -ur a bin mente.
x-yuri,


1
Questa soluzione è migliore della risposta accettata, in quanto non richiede di disporre dei diritti di amministratore di sistema e di installare alcuno strumento aggiuntivo
amanzoor

173

In realtà sembra esserci ancora un'altra opzione (che ho notato solo di recente, quando ho riscontrato il problema sopra descritto):

git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>

Se hai Git in giro (che potresti già utilizzare comunque), sarai in grado di usarlo per il confronto, anche se i file stessi non sono sotto controllo della versione. Se non abilitato per impostazione predefinita, l'abilitazione del supporto colore qui sembra essere notevolmente più semplice di alcune delle soluzioni alternative menzionate in precedenza.


19
Questo è pulito, ma purtroppo non funziona quando gli input sono pipe. Ad esempio, il confronto dei file binari tramite git diff <(xxd file1) <(xxd filed)non funziona.
Michael Anderson,

8
Stranamente, almeno uno dei file deve essere "esterno al repository corrente", secondo git help diff. Quindi, se il tuo git diff sta diventando vuoto, prova cdda dove ti trovi.
Richiesta

7
Per abilitare i colori per git diff:git config color.diff auto
Perché il

2
super semplice e veloce
EE33

31
Se entrambi i file si trovano all'interno del repository corrente, utilizzare git diff --no-indexper confrontare due file.
Olivier "Ölbaum" Scherler,

95

diff --color opzione è stata aggiunta a GNU diffutils 3.4 (08-08-2016)

Questa è l' diffimplementazione predefinita sulla maggior parte delle distribuzioni, che presto la riceveranno.

Ubuntu 18.04 ha diffutils3.6 e quindi ce l'ha .

Su 3.5 sembra così:

inserisci qui la descrizione dell'immagine

Provato:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

Apparentemente aggiunto in commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (mar 2015).

Diff. A livello di parola

Come diff-highlight. Sembra impossibile, richiesta di funzionalità: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

Discussioni correlate:

ydiff lo fa però, vedi sotto.

ydiff diff a livello di parola fianco a fianco

https://github.com/ymattw/ydiff

Questo è il Nirvana?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

Risultato:

inserisci qui la descrizione dell'immagine

Se le linee sono troppo strette (80 colonne predefinite), adatta allo schermo con:

diff -u a b | ydiff -w 0 -s

Contenuto dei file di test:

un'

1
2
3
4
5 the original line the original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the original line
16
17
18
19
20

B

1
2
3
4
5 the original line teh original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the origlnal line
16
17
18
19
20

ydiff Integrazione Git

ydiff si integra con Git senza alcuna configurazione richiesta.

Dall'interno di un repository git, invece di git diff, puoi fare solo:

ydiff -s

e invece di git log:

ydiff -ls

Vedi anche: Come posso ottenere una differenza side-by-side quando faccio "git diff"?

Testato su Ubuntu 16.04, git 2.18.0, ydiff 1.1.


Ecco la documentazione
Alexey,

1
In quel thread della mailing list: There is no word-highlighting, yet- eventuali aggiornamenti? Questo è ciò per cui sono arrivato a questa domanda (voglio un grep --coloroutput diff simile a quello).
i336_

@ i336_ purtroppo nessun aggiornamento, se ne ricevo uno, aggiornerò la domanda. Ping me se trovi qualcosa.
Ciro Santilli 15 冠状 病 六四 事件 法轮功

A proposito git diff --colorfunziona anche. Utile quando si lavora su ssh.
Nagev,

Diff troppo grande? usediff --color=always | less -R
inetphantom,

69

E per quelle occasioni in cui a yum install colordiffo an apt-get install colordiffnon è un'opzione a causa di un vincolo folle al di là del tuo controllo immediato, o ti senti semplicemente pazzo , puoi reinventare la ruota con una linea di sed:

sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'

Lancialo in uno script di shell e inoltra un output diff unificato attraverso di esso.

Rende i marcatori di hunk blu e mette in risalto i nomi di file nuovi / vecchi e le linee aggiunte / rimosse sullo sfondo verde e rosso, rispettivamente. 1 E renderà lo spazio di trascinamento 2 cambiamenti più evidenti di quanto possa fare Colordiff.


1 Per inciso, la ragione per evidenziare i nomi dei file come le linee modificate è che per differenziare correttamente tra i nomi dei file e le linee modificate è necessario analizzare correttamente il formato diff, che non è qualcosa da affrontare con una regex. Evidenziando loro lo stesso funziona "abbastanza bene" visivamente e rende il problema banale. Detto questo, ci sono alcune sottigliezze interessanti .

2 Ma non le schede finali. Apparentemente le schede non ottengono lo sfondo impostato, almeno nel mio xterm. Fa tuttavia risaltare un po 'i cambiamenti tra tabulazione e spazio.


5
@Matt: ecco un approccio a forza bruta per un Mac: sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"(anche se mi aspetto che esista un modo migliore).
retracile

1
Hmm, ha funzionato ... ha dato uno sfondo rosa ai 3 trattini tra ogni blocco.
Matt Montag,

Modo manuale illeggibile, non realizzabile senza un'opzione per cambiare facilmente i colori per esempio.

1
Amico, questo è fantastico! Ben fatto! Questa è una bella magia di sed.
pensare il

6
sed 's / ^ - / \ x1b [31m - /; s / ^ + / \ x1b [32m + /; s / ^ @ / \ x1b [34m @ /; s / $ / \ x1b [0m /' è anche bello
Yura,

16

È possibile modificare la configurazione di sovversione per usare colordiff

~ / .Subversion / config.diff

 ### Set diff-cmd to the absolute path of your 'diff' program.
 ###   This will override the compile-time default, which is to use
 ###   Subversion's internal diff implementation.
-# diff-cmd = diff_program (diff, gdiff, etc.)
+diff-cmd = colordiff

tramite: https://gist.github.com/westonruter/846524


svn: Impossibile avviare il processo 'colordiff': risorsa temporaneamente non disponibile
niken

Hai installato colordiff?
Azd325,

Sì, ho provato anche a codificare il percorso (in esecuzione su Cygwin)
niken


12

Colorato, word-livello di diff ouput

Ecco cosa puoi fare con lo script seguente e diff-highlight :

Schermata diff colorata

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

( Ringraziamo la risposta di @ retracile per l' sedevidenziazione)


Come posso usare questo output in GVim?
Hemant Sharma,

Per vim, usa un plugin, ad esempio diffchar .
Tom Hale,

10

Uso grc(Colorizer generico), che consente di colorare l'output di un numero di comandi incluso diff.

È uno script Python che può essere avvolto attorno a qualsiasi comando. Quindi, invece di invocare diff file1 file2, invocheresti un grc diff file1 file2output colorato. Ho alias diffper grc diffper rendere più facile.


Non funziona su Windows con mingw / cygwin a causa delle fork()chiamate, sebbene probabilmente funzioni con WSL.
Gabriel Devillers,

6

Ecco un'altra soluzione che invoca sedl'inserimento delle sequenze di escape ANSI appropriate affinché i colori mostrino +, rispettivamente -, e le @linee in rosso, verde e ciano.

diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"

A differenza delle altre soluzioni a questa domanda, questa soluzione non spiega esplicitamente le sequenze di escape ANSI. Invece, invoca i comandi tput setafe tput sgr0per generare le sequenze di escape ANSI per impostare un colore appropriato e ripristinare gli attributi del terminale, rispettivamente.

Per visualizzare i colori disponibili per ciascun argomento tput setaf, utilizzare questo comando:

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo

Ecco come appare l'output:

inserisci qui la descrizione dell'immagine

Ecco le prove che i comandi tput setafe tput sgr0generano le sequenze di escape ANSI appropriate:

$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d                                   .[31m
$ tput setaf 2 | xxd -g1
00000000: 1b 5b 33 32 6d                                   .[32m
$ tput setaf 6 | xxd -g1
00000000: 1b 5b 33 36 6d                                   .[36m
$ tput sgr0 | xxd -g1
00000000: 1b 28 42 1b 5b 6d                                .(B.[m

5

Poiché wdiffaccetta args che specifica la stringa all'inizio e alla fine di entrambi gli inserimenti e le eliminazioni, è possibile utilizzare sequenze di colori ANSI come tali stringhe:

wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2

Ad esempio, questo è l'output del confronto tra due file CSV:

output diff di file CSV

Esempio da https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html


1
colordiffora (1.0.16) comprende wdiff, in modo da poter anche solo del tubo: wdiff -n f1 f2 | colordiff. wdiffdovrebbe essere unito in diffutils ...
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

3

Ti suggerirei di provare diff-so-fancy . Lo uso durante il mio lavoro e sicuramente mi sembra fantastico da ora. Viene fornito con molte opzioni ed è davvero facile configurare i tuoi diff come preferisci.

Puoi installarlo tramite:

sudo npm install -g diff-so-fancy

o su Mac:

brew install diff-so-fancy

Successivamente, puoi evidenziare le tue differenze in questo modo:

diff -u file1 file2 | diff-so-fancy


0

Nelle versioni recenti di git su Ubuntu, puoi abilitare l'evidenziazione diff con:

sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin
sudo chmod a+x /usr/share/doc/git/contrib/diff-highlight/diff-highlight

E quindi aggiungendo questo al tuo .gitconfig:

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

È possibile che lo script si trovi da qualche altra parte in altre distro, è possibile utilizzare locate diff-highlightper scoprire dove.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.