it-swarm.com.de

Wie färbe ich diff in der Kommandozeile ein?

Wie kann ich ein Diff einfärben, damit es gut aussieht? Ich möchte es für die Kommandozeile, also bitte keine GUI-Lösungen.

459
daniel kullmann

Manpages für diff schlagen keine Lösung für das Einfärben aus sich heraus vor. Bitte erwägen Sie die Verwendung von colordiff. Es ist ein Wrapper um diff, der die gleiche Ausgabe wie diff erzeugt, außer dass er die Ausgabe mit farbiger Syntaxhervorhebung erweitert, um die Lesbarkeit zu verbessern:

diff old new | colordiff

oder nur:

colordiff old new

Installation:

  • Ubuntu/Debian: Sudo apt-get install colordiff
  • OS X: brew install colordiff oder port install colordiff
571
kaji

Benutze Vim :

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

Oder noch besser, VimDiff (oder vim -d (kürzere Schreibweise) zeigt Unterschiede zwischen zwei, drei oder vier Dateien nebeneinander an.

Beispiele:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4
321
Johnsyweb

Tatsächlich scheint es noch eine andere Option zu geben (die mir erst kürzlich aufgefallen ist, als ich auf das oben beschriebene Problem gestoßen bin):

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

Wenn Sie Git in der Nähe haben (das Sie möglicherweise ohnehin schon verwenden), können Sie es zum Vergleich verwenden, auch wenn die Dateien selbst nicht der Versionskontrolle unterliegen. Wenn dies nicht standardmäßig für Sie aktiviert ist, scheint die Aktivierung der Farbunterstützung hier erheblich einfacher zu sein als bei einigen der zuvor genannten Problemumgehungen.

163
Lars Baehren

diff --color Option wurde hinzugefügt zu GNU diffutils 3.4 (2016-08-08)

Dies ist die Standard-Implementierung von diff in den meisten Distributionen, die in Kürze verfügbar sein wird.

Ubuntu 18.04 hat diffutils 3.6 und hat es daher.

Auf 3.5 sieht es so aus:

enter image description here

Geprüft:

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

Angeblich in commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (März 2015) hinzugefügt.

Unterschied auf Wortebene

Mögen diff-highlight. Nicht möglich, Feature-Anfrage: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

Verwandte Themen:

ydiff macht es aber, siehe unten.

ydiff nebeneinander Wortebenendifferenz

https://github.com/ymattw/ydiff

Ist das Nirvana?

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

Ergebnis:

enter image description here

Wenn die Zeilen zu schmal sind (Standard 80 Spalten), passen Sie sie an den Bildschirm an mit:

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

Inhalt der Testdateien:

ein

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 Git-Integration

ydiff kann ohne Konfiguration in Git integriert werden.

Aus einem Git-Repository heraus, anstelle von git diff können Sie einfach tun:

ydiff -s

und anstelle von git log:

ydiff -ls

Siehe auch: Wie kann ich ein Side-by-Side-Diff erhalten, wenn ich "Git Diff" mache?

Getestet auf Ubuntu 16.04, Git 2.18.0, YDIFF 1.1.

Und für jene Gelegenheiten, wenn ein yum install colordiff oder ein apt-get install colordiff ist keine Option, da Sie eine irrsinnige Einschränkung haben, auf die Sie keinen direkten Einfluss haben. Oder Sie fühlen sich einfach verrückt . Mit können Sie das Rad neu erfinden eine Zeile von sed:

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

Werfen Sie das in ein Shell-Skript und leiten Sie eine einheitliche diff Ausgabe durch.

Dadurch werden Stückmarkierungen blau und neue/alte Dateinamen sowie hinzugefügte/entfernte Linien auf grünem bzw. rotem Hintergrund hervorgehoben.1 Und es wird Leerzeichen machen2 Veränderungen sind leichter zu erkennen als bei Colordiff.


1 Im Übrigen ist der Grund für das Hervorheben der Dateinamen und der geänderten Zeilen der, dass zur korrekten Unterscheidung zwischen den Dateinamen und den geänderten Zeilen das Diff-Format ordnungsgemäß analysiert werden muss. Das gleiche Hervorheben funktioniert "gut genug" und macht das Problem trivial. Das heißt, es gibt einige interessante Feinheiten .

2 Aber keine nachgestellten Tabs. Anscheinend wird der Hintergrund für Tabs nicht festgelegt, zumindest in meinem xterm. Dadurch stechen Änderungen zwischen Tabulator und Speicherplatz jedoch etwas hervor.

68
retracile

Sie können die Subversion-Konfiguration ändern, um Colordiff zu verwenden

~/.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

via: https://Gist.github.com/westonruter/846524

16
Azd325

Ich verwende grc (Generic Colouriser), mit dem Sie die Ausgabe einer Reihe von Befehlen einschließlich diff einfärben können.

Es ist ein python Skript, das um jeden Befehl gewickelt werden kann. Anstatt also diff file1 file2 Aufzurufen, würden Sie grc diff file1 file2 Aufrufen, um die farbige Ausgabe zu sehen. Ich habe einen Alias diff zu grc diff, um es einfacher zu machen.

10
dogbane

Bunt, Wortebenediff Ausgabe

Folgendes können Sie mit dem folgenden Skript und diff-highlight tun:

Coloured diff screenshot

#!/bin/sh -eu

# Use diff-highlight to show Word-level differences

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

(Dank an @retraciles Antwort für die sed Hervorhebung)

10
Tom Hale

Hier ist eine andere Lösung, die sed aufruft, um die entsprechenden ANSI-Escape-Sequenzen für Farben einzufügen, um die Zeilen +, - Und @ In Rot, Grün anzuzeigen bzw. Cyan.

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

Im Gegensatz zu den anderen Lösungen für diese Frage werden in dieser Lösung die ANSI-Escape-Sequenzen nicht explizit angegeben. Stattdessen werden die Befehle tput setaf Und tput sgr0 Aufgerufen, um die ANSI-Escape-Sequenzen zum Festlegen einer geeigneten Farbe bzw. zum Zurücksetzen der Terminalattribute zu generieren.

Verwenden Sie diesen Befehl, um die verfügbaren Farben für jedes Argument für tput setaf Anzuzeigen:

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

So sieht die Ausgabe aus:

enter image description here

Hier ist der Beweis, dass die Befehle tput setaf Und tput sgr0 Die entsprechenden ANSI-Escape-Sequenzen generieren:

$ 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
Susam Pal

Da wdiff Argumente akzeptiert, die die Zeichenfolge am Anfang und am Ende von Einfügungen und Löschungen angeben, können Sie ANSI-Farbsequenzen als diese Zeichenfolgen verwenden:

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

Dies ist beispielsweise die Ausgabe des Vergleichs zweier CSV-Dateien:

diff output of CSV files

Beispiel aus https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html

5
jcomeau_ictx

Ich würde vorschlagen, dass Sie diff-so-Phantasie einen Versuch geben. Ich benutze es während meiner Arbeit und es scheint von jetzt an großartig zu sein. Es wird mit vielen Optionen geliefert und es ist wirklich einfach, Ihre Diffs so zu konfigurieren, wie Sie es möchten.

Sie können es installieren, indem Sie:

Sudo npm install -g diff-so-fancy
1
Naveen