Come ottenere git diff con contesto completo?


114

Come creare un cerotto adatto per la revisione nel crogiolo?

git diff branch master --no-prefix > patch

Questo genera solo 3 righe di contesto. Quindi faccio quanto segue

git diff --unified=2000 branch master --no-prefix > patch

Si spera che tutti i file abbiano meno di 2000 righe. C'è un modo per dire a git di includere tutte le righe nel file per la patch senza dover specificare il numero massimo di righe?


3
Ho pubblicato l'opzione -U <infinito> per mostrare l'intero file, come una questione separata stackoverflow.com/questions/28727424/...
Aleksandr Levchuk

Risposte:


54

So che questo è vecchio, ma non mi piacciono anche le soluzioni hardcoded, quindi ho provato questo:

git diff -U$(wc -l MYFILE)

L'uso di -U sembra essere l'unico modo per affrontare il problema, ma l'utilizzo di un conteggio di riga promette che funzionerà anche per una piccola modifica in un file molto grande.


1
<non è necessario. git diff -U$(wc -l MYFILE) MYFILE
balki

2
Grazie @balki, ho provato il tuo suggerimento e ho notato che <pre> $ (wc -l MYFILE) </pre> si espande al conteggio delle righe seguito dal nome del file, quindi anche il secondo utilizzo del nome del file può essere omesso. Sto aggiornando la mia risposta per riflettere questo.
Ezra

4
È un diff, ci sono due versioni del file. E se la versione non sul disco fosse lunga il doppio? -U con un numero davvero grande non è davvero più sicuro?
Eloff

@ Eloff, è vero, il modo migliore sarebbe quello di massimizzare le lunghezze, dal momento che i numeri davvero grandi hanno ancora il problema opposto. Questa soluzione presuppone che non siano state effettuate eliminazioni contigue superiori alla dimensione del file corrente sul disco.
Ezra

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEè una risposta migliore che analizza correttamente l'output di wcottenendo solo il numero di righe senza spazi, non facendo affidamento sull'output non quotato di una subshell per creare due argomenti e funziona su macOS / BSD.
anishpatel

94

Questo sembra funzionare abbastanza bene:

git diff --no-prefix -U1000

Con l'avvertenza:

Il -Uflag specifica le linee di contesto. Potrebbe essere necessario aumentarlo se sono presenti più di 1000 righe tra le modifiche.


16
L' -Uopzione che suggerisci è la stessa --unified=dell'opzione usata dal richiedente. L'unica differenza è che specifichi meno righe di contesto, 1000, rispetto al richiedente utilizzato, 2000. @balki voleva sapere come aumentare il numero all'infinito, tuttavia suggerisci di dimezzare il numero. Perché?
LS

4
@LS: sì, ora me ne rendo conto, ma l'ho trascurato un paio di anni fa. Tuttavia, è un po 'più evidente cosa sta succedendo rispetto alla domanda e sembra aiutare la strana persona che atterra qui.
c24w

Grazie per questo, funziona benissimo anche con git show!
Shakeel

@ c24w D'accordo, mi dà ancora quello che voglio vedere sullo schermo.
Chef Pharaoh

1
L' --no-prefixopzione elimina i prefissi di destinazione "/ a /" e "/ b /" visualizzati per impostazione predefinita. (pagina collegata)
luckydonald

10

Nota: l'annuncio di git1.8.1rc1 (8 dicembre 2012) include:

Una nuova variabile di configurazione " diff.context" può essere utilizzata per fornire il numero predefinito di righe di contesto nell'output della patch, per sovrascrivere il valore predefinito hardcoded di 3 righe.

in modo che possa aiutare, qui, a generare un contesto più completo.


7
Eppure questo non ha un'opzione per dire "Tutte le righe nel file"
balki

3
Ho il sospetto che mettere un numero elevato simulerebbe "tutte le linee"
VonC

7
"Ho il sospetto che mettere un numero grande, simulerebbe" tutte le linee "" ... tranne quando non lo fa e poi le cose si rompono. Tutto è sinonimo di infinito e un numero molto grande è proprio questo: un numero, non infinito.
Trenton

4

Ho avuto l'ispirazione e quindi ho aggiunto un alias git.

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

Aggiornare:

Ho appena trovato "git df" a volte non funziona, a causa del cambio di directory durante l'esecuzione di git alias. (Vedi gli alias git operano nella directory sbagliata ). Quindi questa è la versione aggiornata:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0


0

Le soluzioni accettate in precedenza non funzionano per me quando visualizzo un file / commit specifico (l' -Uopzione sembra interferire con l'analisi di rev / path), ma --inter-hunk-context=in questo caso funziona su git version 2.24.0:

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

Se non conosci la dimensione del file, puoi ovviamente trovarla con wc -linvece di codificarla a livello di codice:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
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.