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.
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.
Antworten:
Manpages für diff
schlagen 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:
sudo apt-get install colordiff
brew install colordiff
oderport install colordiff
less -R
, wodurch die Escape-Sequenzen für Farben korrekt angezeigt werden.
-y
Option zum Aktivieren) ☹ Der vimdiff
Vorschlag unten wahrscheinlich ein besserer Weg
colordiff
funktioniert gut für svn diff | colordiff
(dh in Situationen, in denen Sie nur den Unterschied haben, nicht die beiden Dateien, die unterschieden werden).
-y
) -Unterstützung.
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.
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
ctrl-c
und ctrl-x
haben andere Verwendungszwecke in Vim. ctrl-q
wird von vielen Terminals erfasst. Unter Schreiben und Beenden finden Sie den Weg, der Ihren Anforderungen am besten entspricht.
zsh
? Ich erkenne kein =(...)
Konstrukt. Zweitens hatte ich diff -ur a b
im Sinn.
=(...)
durch den Namen einer Datei ersetzt, die seine Ausgabe enthält.
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.
git diff <(xxd file1) <(xxd filed)
funktioniert das Vergleichen von Binärdateien über nicht.
git help diff
. Wenn Ihr Git-Diff leer ist, probieren Sie cd
aus, wo Sie sind.
git config color.diff auto
git diff --no-index
vergleichen Sie zwei Dateien.
diff --color
Option wurde zu GNU diffutils 3.4 (08.08.2016) hinzugefügt
Dies ist die Standardimplementierung diff
für die meisten Distributionen, die bald verfügbar sein wird.
Ubuntu 18.04 hat diffutils
3.6 und hat es daher.
Auf 3.5 sieht es so aus:
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:
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 diff
kö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.
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).
git diff --color
auch. Nützlich bei der Arbeit über ssh.
diff --color=always | less -R
Und für die Fälle, in denen ein yum install colordiff
oder ein apt-get install colordiff
aufgrund 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.
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).
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
Farbige Ausgabe auf diff
Wortebene
Folgendes können Sie mit dem folgenden Skript und dem Diff-Highlight tun :
#!/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 sed
Hervorhebung)
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 diff
zu grc diff
es einfacher zu machen.
fork()
Aufrufen nicht, obwohl es wahrscheinlich mit WSL funktioniert.
Hier ist eine andere Lösung vor, dass Invokes sed
die 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 setaf
und tput sgr0
aufgerufen, um die ANSI-Escape-Sequenzen zu generieren, um eine geeignete Farbe festzulegen und die Terminalattribute zurückzusetzen.
tput setaf
Verwenden 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:
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
Da wdiff
Argumente 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:
Beispiel von https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
colordiff
jetzt (1.0.16) versteht wdiff
, so kann man auch einfach pfeifen : wdiff -n f1 f2 | colordiff
. wdiff
sollte in diffutils zusammengeführt werden ...
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
Mit Fledermausbefehl :
diff file1 file2 | bat -l diff
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-highlight
herausfinden können, wo.
Farbdifferenz auf Zeichenebene : Installieren Sie ccdiff
ccdiff -r /usr/share/dict/words /tmp/new-dict