2012-05-02 13 views
100

Sto cercando di escludere un file (db/irrelevant.php) da un diff Git. Ho provato a mettere un file nella sottodirectory db chiamata .gitattributes con la riga irrelevant.php -diff e ho anche provato a creare un file chiamato .git/info/attributes contenente db/irrelevant.php.Vuoi escludere il file da "git diff"

In tutti i casi, il file db/irrelevant.php è incluso nel diff come patch binaria Git. Quello che voglio è che le modifiche a quel file vengano ignorate dal comando diff. Che cosa sto facendo di sbagliato?

risposta

93

OMG, driver e awk per escludere un file scadente? Dal momento che git 1.9 something è possibile:

git diff -- . ':(exclude)db/irrelevant.php' 

Ah, eleganza!Vedere la risposta citata e per i dettagli this answer da @torek

+5

Cosa devo fare se devo escludere più file? – itsashis4u

+4

@ itsashis4u 'git diff -. ': (exclude) db/irrelevant.php' ': (exclude) db/another_irrelevant.php'' – tokland

+0

NOTA: se si desidera escludere un nome file specifico, è necessario prefisso con asterisco, diverso dal file '.gitignore' sintassi. Per esempio. ':! * shrinkwrap.yaml' invece di':! shrinkwrap.yaml'. – vaughan

30

È inoltre possibile utilizzare il programma filterdiff della raccolta programmi patchutils per escludere alcune parti di una diff. Per esempio:

git diff | filterdiff -p 1 -x db/irrelevant.php 
+3

Si noti che '-p', dalla pagina di manuale (1), è" -p n, --strip-match = n Durante la corrispondenza, ignora i primi n componenti del nome del percorso. " Mi ci è voluto un po 'per capire che '-p 1' stava rimuovendo la parte' db' dal percorso dell'OP. Se vuoi solo specificare un nome di file e ignorare tutte le possibilità di percorso/dir, puoi usare '-p 99'. –

51

È possibile impostare un driver diff personalizzato con un comando senza op e assegnarlo a quei file che devono essere ignorati.

creare un repository conducente diff specifico con questo comando

git config diff.nodiff.command /bin/true 

o per tutte le operazioni pronti contro termine con --global.

(Se /bin/true non esiste in MacOS, le alternative potrebbero utilizzare /usr/bin/true o echo).

Quindi, assegnare il nuovo driver diff ai file che si desidera ignorare nel file .git/info/attributes.

irrelevant.php diff=nodiff 

Se questo stato dovrebbe essere condivisi con altri sviluppatori che potreste usare .gitattributes invece di .git/info/attributes e condividere il comando git config con i vostri coetanei (tramite un file di documentazione o qualcosa del genere).

+2

Questo è esattamente quello che stavo cercando - come descritto in http://kerneltrap.org/mailarchive/git/2008/10/17/3711254 ho modificato ~/.gitconfig aggiungendo: '[diff "nodiff"] '' comando =/bin/true' e poi ho creato un file chiamato .git/informazioni/attributi in cui ho aggiunto: ' irrelevant.php diff = nodiff' – Michael

+8

Questa risposta lavorato molto meglio per me: http://stackoverflow.com/questions/1016798/excluding-files-from-git-diff –

+3

È interessante notare che questo approccio non funziona con 'git diff --stat'. In tal caso, si potrebbe usare 'git diff ... | diffstat' come soluzione alternativa. – ddkilzer

17

Questa soluzione one-line non richiede altri utils/download:

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-` 

Dove file/to/exclude.txt è il nome del file che si desidera escludere, naturalmente.

Modifica: credito ksenzee per il fissaggio di file cancellati che infrangono il diff.

+0

Sto cercando di adattare il tuo liner a 'git diff --stat master' senza molto successo - potresti aiutarmi? –

0

simile a Ben Roux's soluzione, ma la condivisione in ogni caso:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff 

o, se i cambiamenti sono già essere impegnato a livello locale:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master 

Esempi:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master 

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master 
2

Questo metodo è più breve di quello accettato.

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs' 

Per ulteriori informazioni sulle diverse possibilità di inclusione/esclusione leggere this other post

0

Se si vuole fare questo solo per ispezionare visivamente il diff, uno strumento di diff visivo (come Meld) ti consente di fare con un breve comando facile da ricordare.

Innanzitutto, impostare uno strumento di diff se non lo si è già fatto.

$ git config --global diff.tool = meld 

Quindi, è possibile eseguire una directory diff.

Potrai sfogliare le differenze (per file) in Meld (o il tuo strumento di scelta). Semplicemente non aprire il file che vuoi ignorare.