2010-07-22 9 views
142

A meno che un repository comprendesse diversi progetti indipendenti, sembra che sarebbe più semplice avere un file .gitignore nella directory principale del repository rispetto a vari in tutto. Esiste una best practice standard su questa o alcune analisi online quando un approccio è migliore dell'altro?Più ".gitignore`s è corrugato?

risposta

157

Mi vengono in mente almeno due situazioni in cui si vorrebbe avere più file .gitignore in diverse directory (sotto).

  • Diverse directory hanno diversi tipi di file da ignorare. Ad esempio, lo .gitignore nella directory superiore del progetto ignora i programmi generati, mentre Documentation/.gitignore ignora la documentazione generata.

  • Ignora i file dati solo in una determinata directory (secondaria) (è possibile utilizzare /sub/foo in .gitignore, tuttavia).

Si ricorda che i modelli in .gitignore di file si applicano in modo ricorsivo per la (sub) directory del file è in e tutte le sue sottodirectory, a meno che modello contiene '/' (così ad esempio, modello name vale per qualsiasi file chiamato name in data directory e tutte le sue sottodirectory, mentre /name è più adatto a file con questo nome solo nella directory specificata).

+1

Ah, per qualche ragione pensavo che/Documentation/*.html avrebbe coperto tutto ciò, ma immagino che * la wild card corrisponderà solo alle directory a un livello. –

+6

@ConleyOwens: con Git moderno puoi usare 'Documentation/**/*. Html' (nota che ogni barra ancorata al pattern;'/foo' è usata per ancorare il file direttamente nella directory) –

35

È possibile avere più .gitignore, ognuno naturalmente nella propria directory.
Per verificare quale regola del gitignore è responsabile dell'ignorare un file, utilizzare git check-ignore: git check-ignore -v -- afile.

E si può avere una versione diversa di un file .gitignore per ramo: ho già visto questo tipo di configurazione per garantire che un ramo ignori un file mentre l'altro ramo non lo fa: vedere questo question for instance.

Se il repository include diversi progetti indipendenti, sarebbe meglio farne riferimento come sottomoduli.
Queste sarebbero le migliori pratiche effettive, consentendo a ciascuno di questi progetti di essere clonati in modo indipendente (con i rispettivi file .gitignore), pur facendo riferimento a una revisione specifica in un progetto padre globale.
Vedere true nature of submodules per ulteriori informazioni.


Si noti che, dal momento che Git 1.8.2 (marzo 2013) si può fare un git check-ignore -v -- yourfile al fine di vedere quale gitignore gestito (da cui .gitignore file) viene applicata al 'yourfile', e comprendere meglio il motivo per cui il file ha detto è ignorato
Vedere "which gitignore rule is ignoring my file?"

+0

Sono l'unico che pensa che la prima frase sia divertente? (Perché più file con lo stesso nome non possono essere nella stessa directory.) – TTT

+0

@TTT Sono d'accordo. Ho modificato la prima frase. Fammi sapere se sembra migliore. – VonC

+0

Molto meglio. : D E eccellente aggiunta di check-ignore! – TTT

64

Come nota tangenziale, un caso in cui la possibilità di avere più file .gitignore è molto utile se si desidera una directory aggiuntiva nella propria copia di lavoro che non si intende mai eseguire il commit. Basta mettere un 1 byte .gitignore (che contiene solo un singolo asterisco) in quella directory e non potrà mai presentarsi in git status ecc

+0

puoi anche usare ". git/info/exclude "file per quello – Ayell

+5

Certo, se non ti dispiace la fugacità di dover aprire un file in una posizione fuori dalla radice del repository, quindi scriverci un intero percorso e poi ricordarsi di ripulire il file voce se/quando si elimina la directory. Confrontalo con 'printf \ *> .gitignore' (la pulizia è automatica quando cancelli la directory). Sono certo che ci sono situazioni in cui '.git/info/exclude 'è la scelta più appropriata, ma non molte. –

+0

Sì, quando si desidera escludere un file anziché una cartella, ad esempio: p – Ayell

11

Pro singolo

  • Facile da trovare.

  • Le regole di esclusione delle operazioni di ricerca possono essere piuttosto difficili se ho più gitignore, a diversi livelli nel repository.

  • Con più file, in genere si finisce con un bel po 'di duplicazione.

Pro multipla

  • Scopes "conoscenza" per la parte dell'albero del file dove è necessario.

  • Poiché Git traccia solo i file, un .gitignore vuoto è l'unico modo per eseguire il commit di una directory "vuota".

    (E prima Git 1.8, l'unico modo per escludere un modello come my/**.example era quello di creare my/.gitignore con il modello **.foo. Questa ragione non si applica ora, come si può fare /my/**/*.example.)


Preferisco di gran lunga un singolo file, dove posso trovare tutte le esclusioni. Non mi sono mai perso per-directory .svn, e non perderò neanche per-directory .gitignore.

Detto questo, più gitignores sono abbastanza comuni. Se li usi, almeno è coerente nel loro uso per renderli ragionevoli con cui lavorare. Ad esempio, puoi metterli nelle directory solo a un livello dalla radice.

+0

"un .gitignore vuoto è l'unico modo per commettere una directory" vuota "." In realtà trovo che caricare un singolo file README (o un file chiamato 'empty') sia più comune. –

+0

.gitkeep è un bel modo per farlo anche ... solo un'altra convenzione. Mi piace l'idea di usare un file readme, perché in quel caso potresti spiegare per cosa è usata la directory, nel file mi legge. –

4

Ci sono molti scenari in cui si desidera impegnarsi in una directory a vostra repo Git, ma senza i file in essa contenuti, ad esempio le logs, cache, uploads directory ecc

Quindi quello che faccio sempre è quello di aggiungere un .gitignore file in quelle directory con il seguente contenuto:

* 
!.gitignore 

con questo file .gitignore, Git non si tenere traccia di tutti i file in queste directory ma ancora mi permetterà di aggiungere il file .gitignore e quindi la directory stessa a t lui repo.