Come far funzionare diff come git-diff?


148

Mi piace la formattazione dell'output di git diff. Il colore e la +/ -rappresentazione delle variazioni tra le righe sono più facili da leggere rispetto a GNU diff.

Posso correre git diffusando --no-indexflag al di fuori di un repository git e funziona benissimo. Tuttavia, sembra mancare l' --excludeopzione per escludere file o sottodirectory da un ricorsivo diff.

C'è un modo per ottenere il meglio da entrambi i mondi? (opzioni di colore e +/ -formato di git diffe --excludeopzione di GNU diff).

Ho provato colordiff, ma preferisco ancora il formato di output digit diff


1
Per rendere verde il blu per le aggiunte, cambia newtextin /etc/colordiff. Penso che git usi il verde?
Rudie

1
Fino ad ora non avevo mai sentito parlare della bandiera --no-index. L'ho appena usato per confrontare l'output di git show con il diff di due file - grazie per quello!
AJM-Reinstate-Monica,

Risposte:


175

Non so come fare il colore, ma questo farà +/-piuttosto che <e >.

diff -u file1 file2

6
Fantastico, questo combinato con Colordiff mi avvicina abbastanza a ciò che voglio. Immagino che dovrò scorrere più in basso la pagina man la prossima volta ... Grazie!
Mzzzzzz,

13
Un modo semplice per ottenere la colorazione con diff -u, è anche quello di inviare l'output a tig, la riga di comando git repo spettatore: diff -u file1 file2 | tig.
Samuel Lampa,

3
Installa colordiffdal tuo repository apt / yum / pacman e usalo.
iBug

Necessario per abilitare i pacchetti extra per Enterprise Linux (EPEL) su Amazon Linux per l'installazione colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
Pat Myron,

1
Inoltre colordiff, puoi anche ottenere il colore vimdefinendo cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major

94

Puoi anche usare git diff --no-index -- A B(via manpage ).


1
+1, ma purtroppo non funziona se uno dei file è un collegamento simbolico.
Emil Lundberg,

2
1 Questo è molto utile in quanto mostra come fare rapporto git dove due monitorati i file Ae Bsi differenziano per il confronto con l'altro , invece di cui ogni file è stato modificato rispetto al loro ultimo rispettiva revisione.
J. Katzwinkel,

@EmilLundberg: funziona per me con collegamenti simbolici in git 1.9.1 su Linux. Non so se le versioni precedenti sono rotte.
kkm

3
git diff --no-indexè fantastico, ma come ha sottolineato l'OP, manca la --excludebandiera, quindi è spesso di utilità molto limitata.
Ken Williams

25
  1. Installa colordiff .

  2. Aggiorna ~ / .colordiffrc (copiando prima / etc / colordiffrc, se necessario):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Utilizzare colordiff -u file1 file2per due file o colordiff -ruN path1 path2per confrontare ricorsivamente percorsi.

Non è esattamente lo stesso, ma è molto vicino.


18

Questo è quello che suggerisco ed è abbastanza vicino

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Dovrai installare questo
  • -R: questo dice a Less di mostrare i colori anziché i codici grezzi.

Alla fine l'ho usato -wperché non volevo vedere differenze di spazi bianchi.

diff -w -u FILE1 FILE2 | colordiff | less -R

Modifica: come suggerito da @Ciprian Tomoiaga nel commento, puoi renderlo una funzione e inserirlo anche nel tuo ~/.bashrcfile.

function gdiff () { diff -u $@ | colordiff | less -R; }

4
Per avere una sola funzione bash per questo aggiungi a .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă,

4

GNU diffha --colorun'opzione dalla versione 3.4 alla fine del 2016 secondo questa risposta su Unix SE. Questo a fianco -udovrebbe essere sufficiente per imitare l'output di git diff:

diff -u --color=always file1 file2 | less -r

--colordeve essere alwaysusato in un tubo, autodisattiverà il colore nei tubi.

L'ho provato solo con Git Bash su Windows, dove less -Ravrebbe colorato solo la prima riga di un pezzo. less -rriparato per me in quel caso.


3

Utilizzando solo bash, diff, tput, e less, siamo in grado di approssimare strettamente l'uscita di git diff. Ci saranno alcune differenze notevoli, tuttavia, dovute alla miopia dei diffprogrammatori.

Inserisci la seguente definizione della funzione Bash in alcuni file che provengono automaticamente dal tuo account utente e sarai in grado di accedere alla funzione dalla riga di comando:

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
}

Questa funzione funziona come segue:

  1. Alla fine, diffviene invocato con varie opzioni di formattazione per specificare come verranno visualizzate le modifiche all'interno dei file.
  2. tputviene utilizzato per inserire codici colore ANSI in tali opzioni di formattazione. Si noti che quando si utilizzano terminali non ANSI, potrebbe essere necessario sostituirlo tput setafcon tput setf.
  3. L'output di diffviene convogliato in less. -Rconsente di conservare i colori ANSI. -Ximpedisce lessdi cancellare lo schermo all'uscita. -Fimpedisce lessdi funzionare come cercapersone se l'output si adatta a una schermata.
  4. Se il primo parametro è @full, la funzione visualizzerà tutte le linee invariate oltre alle linee aggiunte e rimosse.

Nota le seguenti differenze tra questo approccio e git diff:

  1. git diffriporta tre linee di contesto che circondano ogni modifica. Sfortunatamente, diffsembra lamentarsi ed uscire se si desidera specificare il numero di righe di contesto specificando contemporaneamente anche le opzioni di formattazione. (Almeno lo fa in Mac OS X Yosemite). Grazie diffprogrammatori. Pertanto, non è possibile richiedere nessuna riga di contesto che circonda ogni modifica, che è il comportamento predefinito, oppure è possibile richiedere che vengano riportate anche tutte le righe invariate all'interno del file, specificando @fullcome primo parametro.
  2. Poiché le linee di contesto sono diverse da git diff, anche i numeri di riga riportati da questa funzione varieranno da quelli riportati da git diff.
  3. È possibile che venga visualizzata la presenza di modifiche a riga singola, il che è il comportamento corretto, ma fastidioso quando il file modificato contiene l'inserimento di singole righe vuote. Penso che lo git diffaffronti meglio, attraverso le sue linee di contesto. Puoi provare a passare diverse opzioni per diffgestire meglio gli spazi bianchi, se preferisci.


2

Metti questo nel tuo .bashrco .zshrc:

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

requisiti: gite colordiffdevono essere installati in anticipo.

utilizzo: diff file1 file2

esempio: per $diff .tmux.conf .zshrc.pre-oh-my-zsh

esempio di funzione diff


0

L'altra opzione è farlo dall'esterno del repository in modo che git sappia differire tra i file. per esempio. una funzione shell simile a:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

Usa colordiff :

Installazione:

sudo apt-get install colordiff

Uso:

colordiff -u file_one file_two

Dà esattamente la stessa differenza di quella mostrata da git diff.


0

Se non hai colordiffo git diff, puoi ottenere il colore vim.

cdiff() { diff -u $@ | vim -R -; }

o semplicemente

cdiff() { diff -u $@ | view -; }

0

Dato che bat ha una bella colorazione, ho testato se funziona difftroppo e sorprendentemente ha funzionato davvero bene fuori dalla scatola.

$ diff file1 file2 | bat o $ diff -u file1 file2 | bat

Quindi suppongo che potresti fare una funzione come questa sotto per essere più efficiente:

function bdiff () { diff -u $@ | bat;}


-2

Penso che l'impostazione di configurazione:

[color]
     ui = true

combinato con l' --relative=<path>opzione del comando "diff" farebbe quello che volevi. Hai provato ?


3
Questo è per il diff git. Stava chiedendo le diffopzioni del programma
tr33hous
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.