2009-06-19 17 views
57

Sto monitorando un progetto con git. Ci sono alcuni file di progetto Xcode nella copia di lavoro che voglio tenere traccia, ma non voglio vedere in diffs, perché ci sono sempre dozzine di linee modificate a cui non sono mai interessato. C'è un modo semplice per avere git-diff skip questi file? Ho cercato di creare un custom “silenziosa” strumento diff:Esclusione di file da git-diff

 
$ cat .gitattributes 
Project.xcodeproj/* diff=nodiff 

$ cat ~/.gitconfig 
[diff "nodiff"] 
    command = /bin/true 

Ma:

 
$ git diff 
external diff died, stopping at Project.xcodeproj/zoul.mode1v3. 

Che cosa sto facendo di sbagliato?

risposta

80

Il problema è che /bin/true tornerà immediatamente senza leggere il suo input. git diff pensa quindi, abbastanza ragionevolmente, che sia morto prematuramente.

Quello che si vuole veramente è disattivare l'attributo diff, non impostarlo su un comando falso. Prova questo nella vostra .gitattributes:

Project.xcodeproj/* -diff 
+0

Sì, questo funziona bene, grazie mille. – zoul

+5

Escludere l'intera directory non ha funzionato per me, perché molti file si trovano in sottodir più profondi. Invece * .xcuserstate -diff è stato utile per ignorare il file che cambia spesso. – Bemmu

+0

@Bemmu: Per essere onesti, stavo usando lo stesso schema della domanda. Non c'era alcun suggerimento che il modello non stesse funzionando nella situazione originale dei richiedenti. –

6

È possibile utilizzare un alias nel .git/config

[alias] 
     mydiff = !git diff | filterdiff -x "*/Project.xcodeproj/*" 

È necessario filterdiff (da patchutils) per questo trucco.

sudo apt-get install patchutils 

Ancora il diff non è perfetto, lascia un po 'di spazzatura:

[email protected]:~/git-filter-test$ git mydiff 
diff --git a/Project.xcodeproj/dummy.txt b/Project.xcodeproj/dummy.txt 
index 3e1f9e6..89dfed9 100644 
diff --git a/dummy2.txt b/dummy2.txt 
index 91966ce..d9588a9 100644 
--- a/titi.txt 
+++ b/titi.txt 
@@ -1,3 +1,3 @@ 
aaaaaaaaaa 
-bbbbbbbbb 
cccccc 
+ddd 
+0

Questo è molto bello, grazie. La spazzatura va bene, almeno so che quei file sono cambiati. Ma perdo la colorazione, c'è un modo per riaverlo? Ho provato git diff --color per forzarlo, ma poi filterdiff viene confuso dal colore e sfugge al filtro. – zoul

+0

Oh sì, | colordiff | meno -r. – zoul

+0

Grazie per le risposte a questa domanda - filterdiff è quasi soddisfare le mie esigenze - tuttavia, la "spazzatura" rimanente mi sta causando problemi - c'è un modo per dire "rimuovere completamente tutto il riferimento a un file" usando filterdiff? – Michael

0

Solo in caso qualcun altro ha lo stesso dolore che abbiamo avuto. Volevamo escludere un file che era già stato eseguito il commit.

Questo post è stato qualcosa di più utile: working with .git/info/exclude too late

In particolare ciò che è necessario per ignorare un file è in realtà usare il comando git rimuovere Vedi git rm (http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

si prova andando

git rm --dry-run *.log
(se si dice volesse escludere ogni i file di registro)

emetterà ciò che sarebbe escluso se lo si è eseguito.

poi

lo si esegue andando

git rm *.log
(o qualunque sia il nome del file path/espressione da)

7

Un'altra soluzione che produce output pulito senza strumenti esterni (aggiungi a .git/config):

[alias] 
    mydiff = !git diff -- $(git diff --name-only | grep -Ev "Project.xcodeproj/") 

quindi eseguirlo con:

git mydiff 

noti che git diff --name-only è meglio di git ls-files perché passerà un elenco più breve di file da git diff, dal momento che solo i file che vengono modificati saranno inclusi. Ho avuto problemi con il superamento del numero massimo di argomenti nei progetti di grandi dimensioni quando si utilizza git ls-files.

+0

Mi sono imbattuto in problemi con percorsi complessi con questo. Sospetto che sarebbe meglio se usassi l'opzione -z: "non scrivere nomi di percorso e utilizzare NUL come terminatori di campi di output". –