2012-09-17 16 views
37

C'è un modo per mostrare il git-diff filtrato da un dato pattern.Come annullare il git diff?

Qualcosa di simile

git grepdiff pattern 

changed file 
+++ some sentence with pattern 
changed file 2 
--- some other pattern 

Purtroppo la soluzione più semplice non è abbastanza buono

git diff | grep pattern 

+++ some sentence with pattern 
--- some other pattern 
# not an option as doesn't put the filename close to the match 

Sono venuto con una soluzione utilizzando awk

git diff | awk "/\+\+\+/{f = \$2}; /PATTERN/ {print f \$0} " 

ma mi piacerebbe scoprire che ci è un comando per questo.

+2

Apparentemente il progetto github denominato git-diff-grep fa qualcosa di completamente diverso. – Kuba

risposta

55

Non sicuro ma non è git diff -G <regex> flag OK?

-G < regex>

Look for differences whose added or removed line matches the given <regex>. 
+5

non è esattamente quello che sto cercando, perché voglio vedere solo le linee, che corrispondono al modello - non l'intero diff di un file, che include il cambiamento con il modello – Kuba

+0

quindi immagino non ci sia una soluzione più semplice come la tua – CharlesB

+0

Almeno git diff -G è un primo passo migliore rispetto all'intero git diff. – Kuba

3

Io uso git log -p, che si apre meno (configurabile, però), che a loro volta possono essere cercate con /. C'è anche git log -S <searchword>.

+0

Ho familiarità con quelli - non sto guardando nella cronologia, ma negli attuali cambiamenti di lavoro. – Kuba

+0

Va bene, quindi è possibile utilizzare lo stesso metodo (come descritto da robinst). Se vuoi l'output, potresti probabilmente usare una libreria qualsiasi usando libgit2 o gitgui/gitk. – chelmertz

9

Un'altra possibilità sarebbe quella di visualizzare l'intero diff e verificare l'output utilizzando i normali comandi less (tipo / e quindi il modello).

Quando si dispone di less configurato per mostrare alcune righe prima della partita utilizzando --jump-target=N, questo è piuttosto utile. Prova in questo modo:

PAGER="/usr/bin/less --jump-target=10" git diff 

Ciò significa che la partita dovrebbe essere mostrato sulla linea 10 (spettacoli di 9 linee di contesto di cui sopra), che possono essere abbastanza per vedere anche il nome del file.

È anche possibile utilizzare ad es. --jump-target=.5 per posizionare la corrispondenza al centro dello schermo.

0

Qui è uno strumento diff personalizzata che consente di grep dentro modifiche (ma non il contesto):

Uso

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

Questo stamperà quelle linee nelle modifiche che contengono foo (comprese le linee in cui foo è scomparso a causa delle modifiche). È possibile utilizzare qualsiasi modello di grep al posto di foo.

linea Ciascuna uscita inizia con il seguente prefisso:

filename: oldlinenum: newlinenum| 

Lo script può essere utilizzato anche senza l'opzione --grep, nel qual caso formatta semplicemente il diff completo (cioè fornisce pieno contesto) come descritto sopra.

mydiff

#!/bin/bash 

my_diff() 
{ 
    diff --old-line-format="$1"':%6dn:  |-%L'  \ 
     --new-line-format="$1"':  :%6dn|+%L'  \ 
     --unchanged-line-format="$1"':%6dn:%6dn| %L' \ 
     $2 $3 
} 

if [[ $1 == '--grep' ]] 
then 
    pattern="$2" 
    shift 2 
    my_diff "$1" "$2" "$5"|grep --color=never '^[^|]\+|[-+].\+'"$pattern"'.*' 
else 
    my_diff "$1" "$2" "$5" 
fi 

exit 0 
0

In Windows, una soluzione semplice è:

git diff -U0 | findstr string 

Se si desidera raggruppare per nome del file, utilizzare questo

FOR /F "usebackq delims==" %i IN (`git diff --name-only`) do git diff -U0 %~fi | findstr string 
0

Questo ha fatto il lavoro per io spero che possa aiutare qualcuno:

git diff | grep -P '^\+|^\-'