Ich mag die Ausgabeformatierung von git diff
. Die Farbe und die +
/-
-Darstellung von Änderungen zwischen Zeilen ist einfacher zu lesen als GNU diff.
Ich kann git diff
mit --no-index
-Flag außerhalb eines Git-Repos ausführen, und es funktioniert einwandfrei. Es scheint jedoch die --exclude
-Option zu fehlen, um Dateien oder Unterverzeichnisse von einer rekursiven diff
auszuschließen.
Gibt es eine Möglichkeit, das Beste aus beiden Welten zu bekommen? (Farboptionen und +
/-
Format von git diff
und --exclude
Option von GNU diff).
Ich habe mit colordiff
experimentiert, aber ich bevorzuge das Ausgabeformat von git diff
Ich weiß nicht, wie man Farbe macht, aber dies wird den +/-
und nicht <
und >
tun.
diff -u file1 file2
Sie können auch git diff --no-index -- A B
verwenden (über manpage ).
Installieren Sie colordiff .
Aktualisieren Sie Ihre ~/.colordiffrc (kopieren Sie ggf. zuerst/etc/colordiffrc):
# be more git-like:
plain=off
newtext=darkgreen
oldtext=darkred
diffstuff=darkcyan
Verwenden Sie colordiff -u file1 file2
für zwei Dateien oder colordiff -ruN path1 path2
für einen rekursiven Vergleich von Pfaden.
Es ist nicht genau das Gleiche, aber es ist sehr nahe.
Dies ist, was ich vorschlage und es ist ziemlich nahe
diff -u FILE1 FILE2 | colordiff | less -R
colordiff
: Sie müssen dieses installieren brew install colordiff
auf meinem Mac.port install colordiff
auf einigen Macs.Sudo apt-get install colordiff
unter Debian oder Ubuntu-R
: Dies bedeutet, dass Less Farben anstelle der Rohcodes anzeigt.Letztendlich habe ich -w
verwendet, weil ich keine Whitespace-Diffs sehen wollte.
diff -w -u FILE1 FILE2 | colordiff | less -R
Bearbeiten: Wie von @ Ciprian Tomoiaga im Kommentar vorgeschlagen, können Sie diese Funktion als Funktion definieren und auch in Ihre ~/.bashrc
-Datei einfügen.
function gdiff () { diff -u [email protected] | colordiff | less -R; }
Wenn Sie nur bash
, diff
, tput
und less
verwenden, können wir die Ausgabe von git diff
sehr gut approximieren. Aufgrund der Kurzsichtigkeit der diff
-Programmierer wird es jedoch einige bemerkenswerte Unterschiede geben.
Fügen Sie die folgende Bash-Funktionsdefinition in eine Datei ein, die automatisch von Ihrem Benutzerkonto abgerufen wird, und Sie können über die Befehlszeile auf die Funktion zugreifen:
function gdiff()
{
local REG=`tput op`
local GRP=`tput setaf 6`
local ADD=`tput setaf 2`
local REM=`tput setaf 1`
local NL=$'\n'
local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"
local UNCH_GRP_FMT=''
[[ "${1}" == '@full' ]] && {
UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
shift
}
diff \
--new-line-format="${ADD}+%L${REG}" \
--old-line-format="${REM}-%L${REG}" \
--unchanged-line-format=" %L${REG}" \
--new-group-format="${GRP_LABEL}${NL}%>" \
--old-group-format="${GRP_LABEL}${NL}%<" \
--changed-group-format="${GRP_LABEL}${NL}%<%>" \
--unchanged-group-format="${UNCH_GRP_FMT}" \
"${@}" | less -FXR
}
Diese Funktion funktioniert wie folgt:
diff
mit verschiedenen Formatierungsoptionen aufgerufen, um anzugeben, wie Änderungen in den Dateien angezeigt werden.tput
wird verwendet, um ANSI-Farbcodes in diese Formatierungsoptionen einzufügen. Beachten Sie, dass Sie bei Verwendung von Nicht-ANSI-Terminals möglicherweise tput setaf
durch tput setf
ersetzen müssen.diff
wird an less
weitergeleitet. Mit -R
können ANSI-Farben beibehalten werden. -X
hindert less
daran, den Bildschirm nach dem Beenden zu löschen. -F
verhindert, dass less
als Pager fungiert, wenn die Ausgabe in einen Bildschirm passt.@full
ist, zeigt die Funktion neben den hinzugefügten und entfernten Zeilen alle unveränderten Zeilen an.Beachten Sie die folgenden Unterschiede zwischen diesem Ansatz und git diff
:
git diff
gibt drei Kontextzeilen für jede Änderung an. Leider scheint sich diff
zu beschweren und zu beenden, wenn Sie die Anzahl der Kontextzeilen angeben und gleichzeitig Formatierungsoptionen angeben möchten. (Zumindest unter Mac OS X Yosemite). Vielen Dank diff
Programmierer. Daher können Sie entweder keine Kontextzeilen für jede Änderung anfordern. Dies ist das Standardverhalten. Sie können auch anfordern, dass alle unveränderten Zeilen in der Datei gemeldet werden, indem Sie @full
als ersten Parameter angeben.git diff
unterscheiden, unterscheiden sich auch die von dieser Funktion gemeldeten Zeilennummern von denen, die von git diff
gemeldet werden.git diff
geht das besser über seine Kontextlinien an. Sie können versuchen, verschiedene Optionen an diff
zu übergeben, um mit Whitespace besser umgehen zu können, wenn Sie dies vorziehen.Sie suchen nach colordiff
:
Sudo apt-get install colordiff
GNU diff
hat seit Version 3.4 Ende 2016 eine --color
-Option, laut dieser Antwort auf der Unix SE. Das neben -u
sollte ausreichen, um die Ausgabe von git diff
nachzuahmen:
diff -u --color=always file1 file2 | less -r
--color
muss always
sein, wenn er in einer Pipe verwendet wird. auto
schaltet die Farbe in Pipe-Farben aus.
Ich habe dies nur mit Git Bash unter Windows ausprobiert, wobei less -R
nur die erste Zeile eines Hunks färben würde. less -r
hat es in diesem Fall für mich behoben.
Verwenden Sie colordiff :
Installation:
Sudo apt-get install colordiff
Verwendungszweck:
colordiff -u file_one file_two
Gibt genau die gleiche Differenz wie bei git diff
.
Die andere Möglichkeit besteht darin, es von außerhalb des Repositorys auszuführen, so dass git weiß, dass es zwischen den Dateien Unterschiede gibt. z.B. eine Shell-Funktion etwa:
gdiff() {
(
dir=`pwd`
cd ./$(git rev-parse --show-cdup)/..
git diff $dir/$1 $dir/$2
)
}