Come filtrare git diff in base alle estensioni dei file?


152

Esiste un'opzione per limitare git diffa un determinato set di estensioni di file?

Risposte:


227

Sì, se ti assicuri che git espanda un glob piuttosto che la tua shell, allora corrisponderà a qualsiasi livello, quindi qualcosa del genere (le virgolette sono importanti) dovrebbe funzionare bene.

git diff -- '*.c' '*.h'

1
Ok, la mia versione git era troppo vecchia. Funziona come pubblicizzato con 1.7.8. Eccellente.
Mat

3
Il mio ha funzionato con espansione di parentesi graffa, a lagit diff -- *.{c,h,etc}
Matt Fletcher il

9
il doppio trattino è importante, ad es. git diff master HEAD -- "*filename.txt"utile anche lagit diff master HEAD --name-only
neaumusica del

Anche le virgolette singole ( '') sono importanti! git diff -- src/*.jsdovrebbe esseregit diff -- 'src/*.js'
Nickofthyme,

1
Inoltre, è necessario farlo nella directory principale del repository git.
John Jiang,

10

Per includere i file in modo ricorsivo (inclusa la directory corrente), questo ha funzionato per me:

git diff -- '***.py'

1
Per me è la soluzione migliore. È inoltre possibile escludere alcuni file / directory. Ad esempio:git diff -- '***.py' ':!.Trashes'
Bartosz,

Cosa fanno gli asterischi tripli (rispetto al singolo asterisco)?
Jann Poppinga,

IIRC il doppio asterisco significa (possibilmente) directory nidificate (anche vuote) e il singolo asterisco e .py indicano il nome del file. Quindi dovrebbe essere un file * .py nella directory corrente o qualsiasi nidificata.
Bohumir Zamecnik,

8

Utilizza la globstar della shell (che esegue una ricerca ricorsiva) 1 , 2 :

shopt -s globstar 
git diff -- *.py **/*.py

o usa trova:

find -name '*.py' -print0 | xargs -0 git diff --

Entrambi sono nomi speciali e a prova di spazi bianchi. Anche se potresti voler filtrare le directory con l'estensione .py :)


1 Mi piace fare di git diff -- {.,**}/*.pysolito

2 Quando globstar è abilitato, git diff -- **/*.pyinclude già ./*.py. Nella manpage di Bash: "Se seguito da un /, due * adiacenti corrisponderanno solo alle directory e alle sottodirectory".


4

Per semplici schemi di file, questo sembra funzionare:

$ git ls-files -zm '*.txt' | xargs --null git diff

Spazio bianco sicuro e puoi avere anche più estensioni:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff

3

Argomento della riga di comando per l'estensione.

git diff *.py

In alternativa, puoi eseguire il pipe findin git diff:

find . -name '*.py' -type f | git diff --

si prega di rendere la risposta un po 'più leggibile. Avresti potuto bastare con git diff *.pye senza i titoli delle urla
vedi il

1
I "titoli delle urla" erano # -commenti in uno script di shell.
Hughdbrown,

Questa è l'unica soluzione che ha funzionato per me, le virgolette (ecc.) Non hanno funzionato sul prompt dei comandi di Windows.
Ed Bayiates,

1

Come testato sulla versione 2.18.0 di git, l'estensione del file deve essere citata tra virgolette doppie. Se vuoi trovare le ultime differenze tra il tuo repository locale e quello remoto, dopo averlo estratto, puoi usare:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

Per esempio:

git diff master@{1} origin/master --name-only "*.cs"

1
Ha funzionato per me quando ho fornito - prima dell'estensione, in questo modogit diff master@{1} origin/master --name-only -- "*.cs"
333

0

Nessuna delle risposte sopra sembra funzionare git bashsu Windows. Non sono sicuro che si tratti di una versione (sto usando 1.8.4) o Windows / bash; inoltre, nel mio caso, volevo diffondere due rami in cui ogni ramo aveva file aggiuntivi non presenti nell'altro ramo (quindi quelli basati su 'trova' sono remissivi).

Comunque questo ha funzionato per me (nel mio esempio, cercando un diff tra i file Python):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`

Questo stackoverflow.com/a/8554987/4233229 funziona, ma è necessario utilizzare virgolette doppie anziché singole per Windows
lcnittl

0

git diff mostrerà solo differenze nei file non messi in scena.

Ho trovato questa domanda perché volevo escludere i .infofile da git diff. Ho raggiunto questo con la messa in scena con git add *.info, che riduce i file rimasti.


0

Ho finito con questo:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

Ciò mostra le differenze per il commit specificato solo se il nome file contiene la parola 'test' (senza distinzione tra maiuscole e minuscole) e non termina con .sql, modifica la pipeline secondo necessità per il tuo caso.

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.