Wie färbe ich Diff in der Kommandozeile ein?


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

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

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.


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.


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.


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


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)


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.


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

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


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


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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.