Wie färbe ich Diff in der Kommandozeile ein?

503

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.

Daniel Kullmann
quelle
6
Ein bestimmtes Betriebssystem / eine bestimmte Shell?
Rowland Shaw
4
Versuchen Sie es mit github.com/walles/riff . Als zusätzlichen Bonus wird hervorgehoben, welche Teile der Linien sich geändert haben.
Johan Walles

Antworten:

608

Manpages für diffschlagen keine Lösung für die Kolorierung aus sich heraus vor. Bitte erwägen Sie die Verwendung colordiff. Es handelt sich um einen Wrapper diff, der dieselbe Ausgabe wie diff erzeugt, außer dass die Ausgabe mithilfe farbiger Syntaxhervorhebungen erweitert wird, 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 colordiffoderport install colordiff
Kaji
quelle
45
Hab das gerade selbst gefunden :-). Es kann mit using in weniger geleitet werden less -R, wodurch die Escape-Sequenzen für Farben korrekt angezeigt werden.
Daniel Kullmann
34
Kann nur die Syntax verwenden: Colordiff Datei1 Datei2
Felipe Alvarez
3
Leider funktioniert es nicht für die Side-by-Side-Ausgabe ( -yOption zum Aktivieren) ☹ Der vimdiffVorschlag unten wahrscheinlich ein besserer Weg
Hi-Angel
8
colordifffunktioniert gut für svn diff | colordiff(dh in Situationen, in denen Sie nur den Unterschied haben, nicht die beiden Dateien, die unterschieden werden).
Cornstalks
8
Als Update zu @ Hi-Angels Kommentar: colordiff wurde aktualisiert und bietet jetzt Side-by-Side ( -y) -Unterstützung.
Bailey Parker
333

Verwenden Sie Vim :

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

Oder noch besser, VimDiff (oder vim -d, dessen Eingabe kürzer ist) zeigt Unterschiede zwischen zwei, drei oder vier Dateien nebeneinander an.

Beispiele:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4
Johnsyweb
quelle
7
@Jichao: Ich lerne die Befehle lieber, als sie wegzugeben. Auf diese Weise kann ich sie überall verwenden, auch wenn meine Punktedateien nicht verfügbar sind.
Johnsyweb
1
@AquariusPower: ctrl-cund ctrl-xhaben andere Verwendungszwecke in Vim. ctrl-qwird von vielen Terminals erfasst. Unter Schreiben und Beenden finden Sie den Weg, der Ihren Anforderungen am besten entspricht.
Johnsyweb
1
Was ist das für eine Muschel? zsh? Ich erkenne kein =(...)Konstrukt. Zweitens hatte ich diff -ur a bim Sinn.
X-Yuri
1
Diese Lösung ist besser als die akzeptierte Antwort, da Sie keine Systemadministratorrechte benötigen und kein zusätzliches Tool installieren müssen
amanzoor
173

Eigentlich scheint es noch eine andere Option zu geben (die ich erst kürzlich bemerkt habe, 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 bereits 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.

Lars Baehren
quelle
19
Das ist ordentlich, aber leider funktioniert das nicht, wenn die Eingänge Pipes sind. Zum Beispiel git diff <(xxd file1) <(xxd filed)funktioniert das Vergleichen von Binärdateien über nicht.
Michael Anderson
8
Seltsamerweise muss sich mindestens eine der Dateien "außerhalb des aktuellen Repositorys" befinden git help diff. Wenn Ihr Git-Diff leer ist, probieren Sie cdaus, wo Sie sind.
Schlechte Anfrage
7
So aktivieren Sie Farben für Git Diff:git config color.diff auto
Warum
2
super einfach und schnell
EE33
31
Wenn sich beide Dateien im aktuellen Repository befinden, git diff --no-indexvergleichen Sie zwei Dateien.
Olivier 'Ölbaum' Scherler
94

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

Dies ist die Standardimplementierung difffür die meisten Distributionen, die bald verfügbar sein wird.

Ubuntu 18.04 hat diffutils3.6 und hat es daher.

Auf 3.5 sieht es so aus:

Geben Sie hier die Bildbeschreibung ein

Geprüft:

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

Anscheinend hinzugefügt in Commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (März 2015).

Diff auf Wortebene

Wie diff-highlight. Möglicherweise nicht möglich, Funktionsanforderung: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

Verwandte Themen:

ydiff tut es aber, siehe unten.

ydiff Side-by-Side-Wortebene diff

https://github.com/ymattw/ydiff

Ist das Nirvana?

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

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Wenn die Linien zu schmal sind (Standard 80 Spalten), passen Sie sie an:

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 lässt sich ohne Konfiguration in Git integrieren.

Stattdessen git diffkönnen Sie in einem Git-Repository Folgendes tun:

ydiff -s

und statt git log:

ydiff -ls

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

Getestet unter Ubuntu 16.04, Git 2.18.0, Ydiff 1.1.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
Hier ist die Dokumentation.
Alexey
1
In diesem Mailinglisten-Thread: There is no word-highlighting, yet- Irgendwelche Updates? Dafür bin ich auf diese Frage gekommen (ich möchte eine grep --colorähnliche Diff-Ausgabe).
i336_
@ i336_ leider keine Updates, wenn ich welche bekomme, werde ich die Frage aktualisieren. Pingen Sie mich an, wenn Sie etwas finden.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
Funktioniert übrigens git diff --colorauch. Nützlich bei der Arbeit über ssh.
Nagev
Diff zu groß? usediff --color=always | less -R
inetphantom
69

Und für die Fälle, in denen ein yum install colordiffoder ein apt-get install colordiffaufgrund einer wahnsinnigen Einschränkung, die außerhalb Ihrer unmittelbaren Kontrolle liegt, keine Option ist oder Sie sich nur verrückt fühlen , können Sie das Rad mit einer Reihe von Sed neu erfinden:

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

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

Es macht Hunk-Marker blau und hebt neue / alte Dateinamen und hinzugefügte / entfernte Linien in grünem bzw. rotem Hintergrund hervor. 1 Und es macht Änderungen des nachgestellten Raums 2 leichter sichtbar als Colordiff.


1 Der Grund für das Hervorheben der Dateinamen, die mit den geänderten Zeilen identisch sind, besteht im Übrigen darin, dass zur korrekten Unterscheidung zwischen den Dateinamen und den geänderten Zeilen das Diff-Format ordnungsgemäß analysiert werden muss, was mit einem regulären Ausdruck nicht zu bewältigen ist. Das Hervorheben derselben funktioniert visuell "gut genug" und macht das Problem trivial. Trotzdem gibt es einige interessante Feinheiten .

2 Aber keine nachgestellten Tabulatoren. Anscheinend bekommen Tabs ihren Hintergrund nicht eingestellt, zumindest in meinem xterm. Dadurch werden Änderungen an Tabulatoren und Leerzeichen jedoch etwas hervorgehoben.

retracile
quelle
5
@Matt: Hier ist ein Brute-Force-Ansatz für einen Mac: sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"(obwohl ich davon ausgehe, dass es einen besseren Weg gibt).
Retracile
1
Hmm, es hat irgendwie funktioniert ... gab den 3 Strichen zwischen jedem Stück einen rosa Hintergrund.
Matt Montag
Manuelle unlesbare, nicht wartbare Methode ohne die Möglichkeit, beispielsweise die Farben einfach zu ändern.
1
Alter, das ist großartig! Gut gemacht! Das ist eine nette Zauberei.
Denker
6
sed 's / ^ - / \ x1b [31m - /; s / ^ + / \ x1b [32m + /; s / ^ @ / \ x1b [34m @ /; s / $ / \ x1b [0m /' sieht ebenfalls gut aus
Yura
16

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

Azd325
quelle
svn: Prozess 'colordiff' kann nicht gestartet werden: Ressource vorübergehend nicht verfügbar
niken
Hast du colordiff installiert?
Azd325
Ja, ich habe auch versucht, den Pfad fest zu codieren (läuft in Cygwin)
niken
IDK könnte versuchen, diese superuser.com/questions/635995/...
Azd325
12

Farbige Ausgabe auf diff Wortebene

Folgendes können Sie mit dem folgenden Skript und dem Diff-Highlight tun :

Farbiger Diff Screenshot

#!/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

( Dank an die Antwort von @ retracile für die sedHervorhebung)

Tom Hale
quelle
Wie verwende ich diese Ausgabe in GVim?
Hemant Sharma
Für vimein Plugin verwenden, zB diffchar .
Tom Hale
10

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

Es ist ein Python-Skript, das um jeden Befehl gewickelt werden kann. Anstatt also aufzurufen diff file1 file2, würden Sie aufrufen grc diff file1 file2, um die farbige Ausgabe anzuzeigen. Ich habe aliased diffzu grc diffes einfacher zu machen.

Dogbane
quelle
Funktioniert unter Windows mit mingw / cygwin aufgrund von fork()Aufrufen nicht, obwohl es wahrscheinlich mit WSL funktioniert.
Gabriel Devillers
6

Hier ist eine andere Lösung vor, dass Invokes seddie entsprechenden ANSI - Escape - Sequenzen zum Einsatz für die Farben zu zeigen +, -und @Linien in Rot, Grün und Cyan sind.

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 setafund tput sgr0aufgerufen, um die ANSI-Escape-Sequenzen zu generieren, um eine geeignete Farbe festzulegen und die Terminalattribute zurückzusetzen.

tput setafVerwenden Sie diesen Befehl, um die verfügbaren Farben für jedes Argument anzuzeigen:

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

So sieht die Ausgabe aus:

Geben Sie hier die Bildbeschreibung ein

Hier ist der Beweis, dass die Befehle tput setafund tput sgr0die 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
Susam Pal
quelle
5

Da wdiffArgumente akzeptiert werden, die die Zeichenfolge am Anfang und Ende von Einfügungen und Löschungen angeben, können Sie ANSI-Farbsequenzen als folgende 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 Ausgabe von CSV-Dateien

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

jcomeau_ictx
quelle
1
colordiffjetzt (1.0.16) versteht wdiff, so kann man auch einfach pfeifen : wdiff -n f1 f2 | colordiff. wdiffsollte in diffutils zusammengeführt werden ...
Ciro Santilli 法轮功 冠状 病 六四 六四 20
3

Ich würde Ihnen empfehlen, es mit Diff-So-Fancy zu versuchen. Ich benutze es während meiner Arbeit und es scheint ab sofort sicher großartig zu sein. Es ist mit vielen Optionen ausgestattet und es ist wirklich einfach, Ihre Unterschiede so zu konfigurieren, wie Sie es möchten.

Sie können es installieren durch:

sudo npm install -g diff-so-fancy

oder auf dem Mac:

brew install diff-so-fancy

Anschließend können Sie Ihre Unterschiede wie folgt hervorheben:

diff -u file1 file2 | diff-so-fancy
Naveen
quelle
1

Mit Fledermausbefehl :

diff file1 file2 | bat -l diff
Jian Weihang
quelle
0

In neueren Versionen von git unter Ubuntu können Sie die Diff-Hervorhebung aktivieren mit:

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

Und dann füge dies zu deinem hinzu .gitconfig:

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

Möglicherweise befindet sich das Skript an einer anderen Stelle in anderen Distributionen, mit denen Sie locate diff-highlightherausfinden können, wo.

naught101
quelle
0

Farbdifferenz auf Zeichenebene : Installieren Sie ccdiff

ccdiff -r /usr/share/dict/words /tmp/new-dict

Ausgabe von ccdiff

Aprikose
quelle