it-swarm.com.de

Wie bekomme ich diff wie git-diff?

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

108
Mzzzzzz

Ich weiß nicht, wie man Farbe macht, aber dies wird den +/- und nicht < und > tun.

diff -u file1 file2
129
jonescb

Sie können auch git diff --no-index -- A B verwenden (über manpage ).

78
eacousineau
  1. Installieren Sie colordiff .

  2. Aktualisieren Sie Ihre ~/.colordiffrc (kopieren Sie ggf. zuerst/etc/colordiffrc):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. 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.

23
Steve

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
    • Laden Sie für andere Plattformen die Quelle von der Hauptseite oder GitHub herunter und befolgen Sie die Installationsanweisungen
  • -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; }
15
Nate

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:

  1. Letztendlich wird diff mit verschiedenen Formatierungsoptionen aufgerufen, um anzugeben, wie Änderungen in den Dateien angezeigt werden.
  2. 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.
  3. Die Ausgabe von 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.
  4. Wenn der erste Parameter @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:

  1. 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.
  2. Da sich die Kontextzeilen von git diff unterscheiden, unterscheiden sich auch die von dieser Funktion gemeldeten Zeilennummern von denen, die von git diff gemeldet werden.
  3. Es wird möglicherweise das Vorhandensein von einzeiligen Änderungen angezeigt. Dies ist das korrekte Verhalten. Es ist jedoch ärgerlich, wenn in Ihrer geänderten Datei einzelne leere Zeilen eingefügt werden. Ich denke, 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.
2
Dejay Clayton

Sie suchen nach colordiff :

Sudo apt-get install colordiff

Fügen Sie dies in Ihren .bashrc Oder .zshrc Ein:

diff() { git diff --no-index "$1" "$2" | colordiff; }

voraussetzungen: git und colordiff sollten vorher installiert werden.

verwendung: diff file1 file2

beispiel: für $ diff .tmux.conf .zshrc.pre-oh-my-zsh

diff function example

2
himanshuxd

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.

1
codehearts

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.

0
Omkar Deshpande

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
    )
}
0
Karl