gitignore tutti i file di estensione nella directory


Risposte:


123

Mai provato, ma git help ignoresuggerisce che se si mette una .gitignorecon *.jsin /public/static, farà quello che vuoi.

Nota: assicurati di controllare anche la risposta di Joeys qui sotto: se vuoi ignorare i file in una specifica sottodirectory, un .gitignore locale è la soluzione giusta (la località è buona). Tuttavia, se è necessario applicare lo stesso modello all'intero repository, la soluzione ** è migliore.


19
Non è necessaria la soluzione migliore. Potenzialmente le persone dovranno scavare tra diversi file .gitignore per scoprire perché il loro file viene ignorato. Alcuni preferiscono avere tutte queste informazioni in un file .gitignore archiviato nella directory principale dei repository.
haren,

1
@haren non è l'unica soluzione - anche la risposta di Joey è certamente valida. Scegli quello che funziona meglio per te. Direi che ignorare le regole locali in una directory dovrebbe essere in quella directory e che le regole globali dovrebbero essere globali. (Inoltre, questa risposta è antica e non credo che ** fosse supportato al momento).
ptyx,

211

Sembrerebbe che la **sintassi sia supportata dalla gitversione in 1.8.2.1base alla documentazione .

Due asterischi consecutivi (" **") in schemi abbinati a un percorso completo possono avere un significato speciale:

  • Un " **" iniziale seguito da una barra indica la corrispondenza in tutte le directory. Ad esempio, " **/foo" corrisponde a file o directory " foo" ovunque, uguale a modello " foo". " **/foo/bar" corrisponde al file o alla directory " bar" ovunque si trovi direttamente nella directory " foo".

  • Un " /**" finale " corrisponde a tutto dentro. Ad esempio, " abc/**" corrisponde a tutti i file all'interno della directory " abc", relativamente alla posizione del .gitignorefile, con profondità infinita.

  • Una barra seguita da due asterischi consecutivi, quindi una barra corrisponde a zero o più directory. Ad esempio, " a/**/b" corrisponde " a/b", " a/x/b", " a/x/y/b" e così via.

  • Altri asterischi consecutivi sono considerati non validi.


1
qual è la differenza tra xxx/**e xxx/?
thuzhf,

9
xxx/**prende di mira tutti i file e le directory all'interno di xxxmentre è xxx/indirizzata xxxdirettamente alla directory. Questo in realtà è importante solo quando si negano i modelli con !"Non è possibile includere nuovamente un file se una directory padre di quel file è esclusa", quindi utilizzare xxx/*o xxx/**sarebbe necessario in quel caso.
Joeyhoer,

4
Tutti i file con .meta finale devono essere ignorati da git. Come funziona? **.js?
Nero,

"Altri asterischi consecutivi sono considerati non validi." somma tutto
imrok

68

AGGIORNAMENTO: Dai un'occhiata alla risposta di @ Joey : Git ora supporta la **sintassi negli schemi. Entrambi gli approcci dovrebbero funzionare bene.


La pagina man gitignore (5) afferma:

I pattern letti da un file .gitignore nella stessa directory del percorso o in qualsiasi directory padre, con i pattern nei file di livello superiore (fino al livello superiore dell'albero di lavoro) vengono sovrascritti da quelli nei file di livello inferiore fino alla directory contenente il file.

Ciò significa che i pattern in un .gitignorefile in una determinata directory del repository influiranno su quella directory e su tutte le sottodirectory .

Lo schema che hai fornito

/public/static/**/*.js

non è del tutto corretto, in primo luogo perché (come hai notato correttamente) la **sintassi non è utilizzata da Git. Inoltre, i principali si /ancorano a quel modello all'inizio del percorso. (Quindi, /public/static/*.jscorrisponderà /public/static/foo.jsma non /public/static/foo/bar.js .) Rimuovere la derivazione /non funzionerà neanche, abbinando percorsi come public/static/foo.jse foo/public/static/bar.js. EDIT: Anche la semplice rimozione della barra iniziale non funzionerà - poiché il modello contiene ancora una barra, viene trattato da Git come un semplice guscio di shell non ricorsivo (grazie a @Joey Hoer per averlo sottolineato).

Come suggerito da @ptyx, quello che devi fare è creare il file <repo>/public/static/.gitignoree includere solo questo modello:

*.js

Non c'è alcun inizio /, quindi corrisponderà a qualsiasi parte del percorso e quel modello sarà sempre e solo applicato ai file nella /public/staticdirectory e nelle sue sottodirectory.


2
Questo non è del tutto vero, in particolare la parte "La rimozione del lead /non funzionerà neanche, abbinando percorsi come public/static/foo.jse foo/public/static/bar.js". è falso. Per citare la documentazione "Se il modello non contiene una barra /, Git lo considera come un modello glob shell e verifica una corrispondenza con il nome percorso relativo alla posizione del file .gitignore (rispetto al livello superiore dell'albero di lavoro se non da un file .gitignore). " foo/public/static/bar.jsnon sarebbe abbinato perché il modello contiene a /.
Joeyhoer,

@JoeyHoer grazie del suggerimento, ho aggiornato la mia risposta di conseguenza.
Adam Sharp,

9

Per ignorare i file non tracciati basta andare su .git / info / exclude. Escludi è un file con un elenco di estensioni o file ignorati.


2
Ciò non si ripercuoterebbe su altri cloni del repository come .gitignore (dopo essere stato impegnato, ovviamente).
jpmc26,

3

Credo che la soluzione più semplice sarebbe quella di utilizzare find. Non mi piace avere più in .gitignoregiro nelle sottodirectory e preferisco gestire un livello unico e di alto livello .gitignore. Per fare ciò potresti semplicemente aggiungere i file trovati al tuo .gitignore. Supponendo che /public/static/sia il tuo progetto / git home userei qualcosa del tipo:

find . -type f -name *.js | cut -c 3- >> .gitignore

Ho scoperto che tagliare ./all'inizio è spesso necessario per git per capire quali file evitare. Pertanto il cut -c 3-.

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.