615 Stimmen

Einfärben von diff auf der Kommandozeile

Wie kann ich eine Diff. so einfärben, dass sie gut aussieht?

Ich möchte es für die Kommandozeile, also bitte keine GUI-Lösungen.

7 Stimmen

Ein bestimmtes Betriebssystem/Shell?

4 Stimmen

Versuchen Sie github.com/walles/riff . Als zusätzlicher Bonus wird hervorgehoben, welche Teile der Linien sich geändert haben.

0 Stimmen

Emacs macht großartige Farbunterschiede in einem Terminal; ist es das, was Sie mit nicht-GUI meinen? Siehe unix.stackexchange.com/a/613399/80268 .

702voto

kaji Punkte 7559

Man-Seiten für diff keine Lösung für die Färbung aus sich selbst heraus vorschlagen. Bitte erwägen Sie die Verwendung von colordiff . Es ist eine Umhüllung für diff das die gleiche Ausgabe wie diff erzeugt, mit dem Unterschied, dass es die Ausgabe durch farbige Syntaxhervorhebung ergänzt, um die Lesbarkeit zu erhöhen:

diff old new | colordiff

oder einfach:

colordiff old new

Einbau:

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

51 Stimmen

Das habe ich gerade selbst entdeckt :-). Es kann in less eingefügt werden, indem man less -R das die Escape-Sequenzen für Farben korrekt anzeigt.

35 Stimmen

Sie können einfach die folgende Syntax verwenden: colordiff file1 file2

5 Stimmen

Leider funktioniert dies nicht für die Side-by-Side-Ausgabe ( -y Option zu aktivieren) Die vimdiff untenstehender Vorschlag ist wahrscheinlich ein besserer Weg

389voto

Johnsyweb Punkte 128606

Utilice Vim :

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

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

Beispiele:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

0 Stimmen

Funktion ddiff(){ diff $1 $2 | vim -R - } export -f ddiff

8 Stimmen

@Jichao: Ich ziehe es vor, die Befehle zu lernen, anstatt sie mit Aliasen zu versehen. Auf diese Weise kann ich sie überall verwenden, auch wenn meine Dotfiles nicht verfügbar sind.

0 Stimmen

Vim -d hat den Vorteil, dass er sich die zuletzt geöffnete Position merkt, wenn die richtige vimrc-Einstellung verwendet wird. (Wie zum Beispiel これ .)

206voto

Lars Baehren Punkte 2021

Es scheint noch eine weitere Möglichkeit zu geben (die ich erst vor kurzem entdeckt habe, als ich auf das oben beschriebene Problem stieß):

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 zur Verfügung haben (was Sie vielleicht ohnehin schon tun), können Sie es zum Vergleich verwenden, auch wenn die Dateien selbst nicht unter Versionskontrolle stehen. Wenn dies bei Ihnen nicht standardmäßig aktiviert ist, scheint die Aktivierung der Farbunterstützung hier wesentlich einfacher zu sein als einige der zuvor erwähnten Workarounds.

23 Stimmen

Das ist nett, aber leider funktioniert es nicht, wenn die Eingänge Rohre sind. Zum Beispiel der Vergleich von Binärdateien über git diff <(xxd file1) <(xxd filed) funktioniert nicht.

8 Stimmen

Seltsamerweise muss mindestens eine der Dateien "außerhalb des aktuellen Repositorys" liegen, wie es in git help diff . Wenn Ihr Git-Diff also ins Leere läuft, versuchen Sie cd von dort, wo du bist.

0 Stimmen

Danke @kitkat, das war sehr hilfreich.

155voto

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

Dies ist die Standardeinstellung diff Implementierung auf den meisten Distributionen, die sie bald erhalten werden.

Ubuntu 18.04 (Bionic Beaver) hat diffutils 3.6 und hat ihn daher.

Bei 3.5 sieht es so aus:

Enter image description here

Getestet mit:

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).

Unterschied auf Wortebene

Wie diff-highlight . Es ist nicht möglich, es scheint, aber es ist eine Funktion Anfrage: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

Verwandte Fragen:

ydiff tut es aber. Siehe unten.

ydiff Seite-an-Seite-Vergleich auf Wortebene

https://github.com/ymattw/ydiff

Ist das das Nirwana?

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

Das Ergebnis:

Enter image description here

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

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

Inhalt der Testdateien:

a

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

ydiff Git-Integration

ydiff integriert sich in Git, ohne dass eine Konfiguration erforderlich ist.

Innerhalb eines Git-Repositorys können Sie anstelle von git diff können Sie einfach tun:

ydiff -s

und anstelle von git log :

ydiff -ls

Siehe auch: Wie kann ich eine Seite-an-Seite-Diff erhalten, wenn ich "git diff" ausführe?

Getestet am Ubuntu 16.04 (Xenial Xerus), Git 2.18.0 und ydiff 1.1.

0 Stimmen

Hier ist die Dokumentation.

1 Stimmen

In diesem Thread der Mailingliste: There is no word-highlighting, yet - Gibt es Neuigkeiten? Dies ist, was ich kam zu dieser Frage für (Ich möchte grep --color -ähnliche diff-Ausgabe).

0 Stimmen

@i336_ leider keine Updates, wenn ich welche bekomme, werde ich die Frage aktualisieren. Ping mich, wenn Sie etwas finden.

79voto

retracile Punkte 11600

Und für die Fälle, in denen ein yum install colordiff oder ein apt-get install colordiff aufgrund einer irrsinnigen Einschränkung, die sich Ihrer unmittelbaren Kontrolle entzieht, nicht möglich ist, oder du bist einfach nur verrückt können Sie das Rad mit einer Zeile sed neu erfinden:

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

Geben Sie das in ein Shell-Skript ein und leiten Sie Einheitsdiff Ausgabe durch sie.

Sie macht die Hunk-Markierungen blau und hebt neue/alte Dateinamen und hinzugefügte/entfernte Zeilen in grünem bzw. rotem Hintergrund hervor. 1 Und es wird ein Leerzeichen am Ende gemacht 2 Veränderungen leichter erkennbar als bei colordiff.


1 Der Grund für die Hervorhebung der Dateinamen und der geänderten Zeilen liegt übrigens darin, dass die korrekte Unterscheidung zwischen den Dateinamen und den geänderten Zeilen das korrekte Parsen des Diff-Formats erfordert, was mit einer Regex nicht zu bewerkstelligen ist. Die Hervorhebung der gleichen Zeilen ist visuell "gut genug" und macht das Problem trivial. Abgesehen davon gibt es einige interessante Feinheiten .

2 Aber nicht die hinteren Tabs. Anscheinend bekommen Tabs ihren Hintergrund nicht gesetzt, zumindest in meinem xterm . Der Wechsel zwischen Tabulator und Leerzeichen wird dadurch allerdings etwas deutlicher.

5 Stimmen

@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).

1 Stimmen

Hmm, es hat irgendwie funktioniert... gab den 3 Strichen zwischen den einzelnen Brocken einen rosa Hintergrund.

0 Stimmen

Manuell nicht lesbar, nicht pflegbar, ohne die Möglichkeit, z. B. die Farben leicht zu ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X