Vuoi escludere il file da "git diff"


229

Sto cercando di escludere un file ( db/irrelevant.php) da un diff Git. Ho provato a mettere un file nella dbsottodirectory chiamato .gitattributescon la linea irrelevant.php -diff e ho anche provato a creare un file chiamato .git/info/attributescontenendo db/irrelevant.php.

In tutti i casi, il db/irrelevant.phpfile è 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?

Risposte:


325

Omg, driver e awk per escludere un file scadente? Da git 1.9 qualcosa puoi:

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

Ah, eleganza! Vedi la risposta citata e per i dettagli questa risposta di @torek


4
NOTA: se si desidera escludere un nome file specifico, è necessario aggiungere il prefisso con un asterisco, diverso dalla .gitignoresintassi del file. Ad esempio :!*shrinkwrap.yamlinvece di :!shrinkwrap.yaml.
vaughan,

7
Escludere più file, ad esempio ho file * .min.css e * .min.js da evitare dal diff git. Quindi, uso il comandogit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare

4
sintassi di windows : git diff -- . ":(exclude)db/irrelevant.php"(virgolette doppie anziché virgolette singole)
cnlevy

4
Grazie! Una sintassi così esoterica .. Devo cercare ogni volta.
Daniel Waltrip,

1
@cnlevy o nessuna virgoletta! git diff -- . :(exclude)db/irrelevant.php
Matthias,

62

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

Creare un driver diff specifico del repository con questo comando

git config diff.nodiff.command /bin/true

o per tutti i tuoi repository con --global.

(Se /bin/truenon esiste in MacOS, le alternative potrebbero utilizzare /usr/bin/trueo echo).

Quindi, assegnare il nuovo driver diff a quei file che si desidera ignorare nel .git/info/attributesfile.

irrelevant.php    diff=nodiff

Se si suppone che questo stato sia condiviso con altri sviluppatori, è possibile utilizzare .gitattributesinvece .git/info/attributese condividere il git configcomando con i propri colleghi (tramite un file di documentazione o qualcosa del genere).


2
Questo è esattamente quello che stavo cercando - come descritto in kerneltrap.org/mailarchive/git/2008/10/17/3711254 Ho modificato ~ / .gitconfig aggiungendo: [diff "nodiff"] `command = / bin / true` e ho quindi creato un file chiamato .git / info / attributi in cui ho aggiunto: irrelevant.php diff=nodiff
Michael,

12
Questa risposta ha funzionato molto meglio per me: stackoverflow.com/questions/1016798/…
Neil Forrester

3
È interessante notare che questo approccio non funziona git diff --stat. In tal caso, si potrebbe usare git diff ... | diffstatcome soluzione alternativa.
ddkilzer,

@Michael quel link sembra essere interrotto, ce n'è un altro?
DickieBoy,

3
solo un'aggiunta: se vuoi forzare git diff a visualizzarlo comunque, usa--no-ext-diff
Florian Klein il

35

È inoltre possibile utilizzare filterdiff programma della patchutils programma di raccolta di escludere alcune parti di un diff. Per esempio:

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

4
Si noti che -p, dalla manpage (1), è "-pn, --strip-match = n Durante la corrispondenza, ignora i primi n componenti del nome percorso." Mi ci è voluto un po 'per capire che -p 1stava rimuovendo la dbparte dal percorso del PO. Se si desidera solo specificare un nome file e ignorare tutte le possibilità di percorso / directory, è possibile utilizzare -p 99.
Tyler Collier,

32

Questo metodo è più breve delle risposte accettate.

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

Per maggiori informazioni sulle diverse possibilità di inclusione / esclusione leggi questo altro post


Tenere presente che il filtro si applica solo a tutti i file sotto la directory corrente.
Chiel ten Brinke,

Questa è stata la risposta migliore. Sono stato in grado di semplificare un po 'di più: stackoverflow.com/a/58845608/3886183
dlsso

2
Rimuoverei la parte --stat, o almeno spiegherei cosa fa, dato che nessuna delle altre risposte la include.
mix3d

Il flag stat mostra i file e i loro totali diff, che consente di verificare facilmente se il filtro ha funzionato come previsto.
Chiel tenne Brinke il

17

Questa soluzione a una riga non richiede altri programmi di utilità / download:

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

Dov'è file/to/exclude.txtovviamente il nome del file che si desidera escludere.

Modifica: credito ksenzee per la correzione di file cancellati rompendo il diff.


Sto cercando di adattare la tua unica fodera git diff --stat mastersenza molto successo - potresti aiutarmi?
Mr_and_Mrs_D,

13

Davvero una buona risposta da KurzedMetal per quello che dovevo fare, che era la capacità di vedere che il file è cambiato, ma non di generare il diff, che nel mio caso avrebbe potuto essere enorme.

Ma un mio collega mi ha suggerito un approccio ancora più semplice e ha funzionato per me:

l'aggiunta di .gitattributesfile nella directory in cui il file da ignorare git diffrisiede con il seguente contenuto:

file-not-to-diff.bin -diff

Ciò consente ancora di git status"vedere" se il file è cambiato. git diff"vedrà" anche che il file è stato modificato, ma non genererà il file diff.

Quell'estensione .binper il file nell'esempio era intenzionale. Mi rendo conto che questo è il comportamento predefinito di git per i file binari e non richiede una gestione speciale con .gitattributes. Ma nel mio caso, questi file sono stati riconosciuti come file di testo da git e dall'utilità "file" e questo ha funzionato.


11

Risposta più semplice

git diff ':!db/irrelevant.php'

È subito ':!<path to file>'dopo il tuo comando diff. Il comando diff può essere complicato a piacere e, se lo si desidera, è possibile utilizzare caratteri jolly come *.min.jso aggiungere più esclusi (lo spazio separa i blocchi tra virgolette).


5

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"

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 -- ":(exclude)*/$1/*"
}

questo per me non funziona, non ho alcuna differenza, con entrambe le sintassi, usando (exclude) o!. Ho git 2.21.0
Olivvv

È possibile eseguire il gitaggio dei file diff non in scena o in fasi. Se li hai aggiunti, vengono messi in scena. Se sono messi in scena puoi fare git diff --stagedSpero che questo ti aiuti.
Jasonleonhard,

Sintatticamente, che cosa stanno facendo i due punti?
Giona,

2

È molto semplice, puoi escludere ciò che desideri utilizzando i comandi unix standard, tali comandi sono disponibili in git bash anche in ambiente Windows. L'esempio di seguito mostra come escludere diff per i file pom.xml, prima controlla diff per master solo per i nomi di file, quindi usando 'grep -v' escludi i file che non vuoi e quindi esegui di nuovo diff per master con elenco prepapred:

git diff master `git diff --name-only master | grep -v pom.xml`

1

simile alla soluzione di Ben Roux , ma condividendo comunque:

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

oppure, se le modifiche sono già state eseguite localmente:

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

1

Faccio quanto segue:

git add *pattern_to_exclude*
git diff
git reset HEAD .

So che non è una soluzione elegante e a volte non può essere utilizzata (ad esempio se hai già messo in scena roba), ma fa il trucco senza dover digitare un comando complicato


0

Se vuoi farlo solo per ispezionare visivamente il diff, uno strumento di visual visual (come Meld ) ti permetterà di farlo con un breve comando che è facile da ricordare.

Innanzitutto, imposta uno strumento diff se non l'hai già fatto.

$ git config --global diff.tool = meld

Quindi, è possibile eseguire una directory diff.

$ git difftool --dir-diff

Sarai in grado di sfogliare le differenze (per file) in Meld (o il tuo strumento preferito). Semplicemente non aprire il file che si desidera ignorare.

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.