Escludere una directory da git diff


179

Mi chiedo come posso escludere un'intera directory dal mio diff Git. (In questo caso / specifiche). Sto creando un diff per tutta la nostra versione del software usando il comando git diff. Tuttavia, le modifiche alle specifiche sono irrilevanti per questa procedura e creano solo mal di testa. ora so che posso fare

git diff previous_release..current_release app/

Ciò creerebbe un diff per tutte le modifiche nella directory dell'app, ma non ad esempio nella directory lib /. Qualcuno sa come svolgere questo compito? Grazie!

Modifica: voglio solo essere chiaro, so che posso semplicemente mettere insieme i parametri di tutte le mie directory alla fine, meno / spec. Speravo ci fosse un modo per escludere veramente una singola directory nel comando.


4
Ho trovato questa fantastica domanda perché volevo ignorare i sottomoduli . In questo caso, se sei ingenuo quanto me, questa domanda può essere più utile.
brandizzi,

È strano che non abbiamo ancora switch Git nativo per farlo nel settembre 2016
Michael Z,

Risposte:


138

Supponendo che tu usi bash e che tu abbia abilitato il globbing esteso ( shopt -s extglob), potresti gestirlo dal lato shell:

git diff previous_release current_release !(spec)

Ti evita di dover elencare tutte le altre cose.

Oppure, agnostico delle coperture:

git diff previous_release current_release --name-only | grep -v '^spec/' \
    | xargs git diff previous_release current_release --

Potresti racchiuderlo in uno script shell di una riga per evitare di dover digitare nuovamente gli argomenti.


1
PS globbing non corrisponde ai file nascosti, quindi se sei ossessivo, potresti voler attaccare .!(.|)per abbinare tutto a partire da un .oltre .e ...
Cascabel,

Questo non sembra funzionare per i file nuovi di zecca o eliminati tra i vari rami. Ottengo errori che interrompono l'esecuzione dello script, dicendo che non può differire.
Graham Christensen,

2
@Graham: credo che l' --ho appena aggiunto dovrebbe risolverlo.
Cascabel,

1
Risposta fantastica. Volevo solo mostrare i nomi (non l'attuale differenza), quindi ho dovuto aggiungere anche --name-onlyalla fine.
Agosto

1
Dopo aver giocato con esso, voglio solo aggiungere che se cambi il nome di un file, genererà un errore ma tutto ciò che devi fare è aggiungere -- path/of/new/filee lo
capirà

321

Sulla base di questa risposta puoi anche usare:

git diff previous_release..current_release -- . ':!spec'

Questa è una nuova funzionalità git che consente di escludere determinati percorsi. Dovrebbe essere più affidabile di vari oneliners shell.

Sto pubblicando questo qui perché questa domanda è ancora l'hit numero 1 per "git diff exclude path".


4
Adoro questa risposta. Se aggiungi opzioni, fallo prima del doppio trattino. Ad esempio: git diff previous_release current_release --name-status -- . ':!spec'
liamvictor

Non avevo capito che avrei potuto usare i nomi delle filiali per current_releasee previous_release- mi hanno fatto sorridere quando l'ho capito.
trueheart78,

2
Cosa ha funzionato per me git diff --stat dev -- . ':!/Mopy/Docs/*'. Cosa non ha funzionato per me git diff dev --stat -- . ':!('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'e variazioni
Mr_and_Mrs_D

Davvero utile. Ecco la sintassi per vedere se qualche file viene modificato, tranne database.yml:git diff --check -- . ':!config/database.yml'
Dan Kohn

17
Puoi anche escludere più elementi in questo modo:git diff previous_release current_release -- . ':!file_a' ':!file_b'
PseudoNoise,

37

Se si desidera specificare più di un percorso da escludere in un git diff, è sufficiente aggiungere ulteriori parametri di esclusione alla fine, ad esempio per escludere tutto dalle directory del fornitore e del bin dalle statistiche: -

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'

33

Puoi provare a deselezionare l'attributo diff per qualsiasi file nella directory lib.
.gitattributes:

lib/* -diff

racl101 aggiunge nei commenti :

Solo per aggiungere a questo, per quelli di voi che vogliono limitare l' git diffoutput di file di un tipo specifico, all'interno di una directory specifica e delle sue sottodirectory, come tutto il JavaScript generato dal raggruppamento dei .jsfile di Webpack , ad esempio, è possibile aggiungere questo a .gitattributes:

dist/js/**/*.js -diff

Quindi non vedi tutto quel rumore nel tuo output git diff e mostra solo come: Binary files ... differche è più utile.


questo eliminerebbe però le specifiche da tutti i miei diff. Voglio ancora vedere i miei diff nella cartella delle specifiche normalmente, ma non quando
eseguo

2
@Mystr: è possibile impostare quel .gitattributesfile in un ramo speciale creato solo per questo tipo di 'release' diff;) Rebase quel ramo speciale sopra current_releasee fare il tuo diff da lì.
VonC,

Anche questo non sembra funzionare per i file che vengono eliminati tra i rami. I file che sono stati rimossi mostrano ancora il diff completo.
Graham Christensen,

Non funziona per me. _ Percorsi sono speciali? _site/* -diff
Marius,

@MariusAndreiana No, '_' non è speciale. Puoi controllare quale regola gitattributes si applica per un file di quella cartella con: git-scm.com/docs/git-check-attr
VonC

22

Git diff ora accetta un formato di esclusione personalizzato: git diff -- ':(exclude)lib/*'

Fai attenzione se hai molti nomi di cartelle ripetitivi ('/ app', '/ lib', ecc.), In quanto ciò escluderà i file relativi alla directory di lavoro corrente E alla directory radice git.


1
ti manca un punto, non dovrebbe piuttosto essere git diff -- . ':(exclude)lib/*'?
Nicolas Dermine,

1
@NicolasDermine No, anche se ciò che hai scritto è equivalente. Anche la parte "include" del percorso è facoltativa. Ecco perché puoi semplicemente fare git difftutto ciò che riguarda il tuo percorso attuale, piuttosto che richiederegit diff -- .
MaxPRafferty

Nota: su macchine Windows, usa virgolette doppie, comegit diff -- ":(exclude)lib/*"
cnlevy,

Non ho idea del perché, ma per me funziona solo con il punto, come suggerito da @NicolasDermine. Uso Cmder su win10.
Olivvv,

3

Relativo alla directory principale di git

git diff accetta un'esclusione facoltativa

git diff -- ":(exclude)thingToExclude"

Potresti voler aggiungere alcuni caratteri jolly

git diff -- ":(exclude)*/thingToExclude/*"

Targeting di tipi di file specifici

git diff -- ":(exclude)*/$1/*.png"

Alcuni zucchero sintattico applicato

git diff -- ":!/\$1/"

Oppure rilascia una piccola sceneggiatura per i tuoi dotfile

Come .bash_profileo.zshrc

gde() {
    : '
        git diff exclude files or folders
        usage:
        gde fileOrFolderNameToExclude
    '
    git diff -- ":!/\$1/"
}

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.