2013-05-21 11 views
8

Ho la seguente struttura di cartelle:gitignore non funziona

public 
    media 
     catalog 
      product 
      category 
     private 
     tmp 
     var 
     test 

voglio gitignore tutto nella directory media tranne catalog/category e private

mio gitignore che sto cercando è:

public/media/* 
!public/media/catalog/category/ 
!public/media/private 

Ma non funziona. Tutti i nuovi file aggiunti alle directory category o private non sono disponibili per l'aggiunta.

ho potuto solo git aggiungere forza, ma vorrei che questo fatto attraverso il gitignore se possibile

+0

vedere il seguente domanda, che è molto simile: http://stackoverflow.com/questions/7001126/git-ignore-all-except-subfolder – greydet

risposta

7

Di solito è più semplice di mettere solo un .gitignore al livello in cui si inizia alla materia. (Questo aiuta anche se mai dividere un repository o spostare le directory in giro.) In questo caso è necessario ignorare tutto tranne catalog e private nella cartella public/media modo in public/media/.gitignore messo:

/* 
!/catalog/ 
!/private/ 

e in public/media/catalog/.gitignore messo:

/* 
!/category/ 

e 'importante (e la ragione per cui le regole non funzionano) di non ignorare la directory public/media/catalog stesso, altrimenti tutto ciò che viene ignorato, anche se non avete voglia di ignorare una parte specifica del suo contenuto.

Naturalmente, è possibile combinare questo in un unico ignorare a livello public/media se ti piace:

/* 
!/catalog/ 
!/private/ 
/catalog/* 
!/catalog/category/ 
+0

Ok questo funziona. È un po 'un dolore in realtà, dal momento che ho avuto un bel gitignore ma ora ne ho 3. Ma funziona grazie –

+0

@MartyWallace: Puoi avere un singolo ".gitignore" se preferisci (Ho contato solo 2 nella mia risposta) , Ho appena trovato i modelli diventano più complessi. –

2

Soluzione con un .gitignore a livello radice

Si è tentato di utilizzare una .gitignore file al livello di root del repository. Come te, di solito centralizzo anche tutti gli ignori come questo per mantenere le cose in ordine. In questo caso, tuttavia, è difficile, perché "Non è possibile includere nuovamente un file se viene esclusa una directory principale di quel file" [source].

mia brutta soluzione per questa limitazione, che ho anche esploro nelle mie risposte relative here e here: re-includere tutte le directory principali lungo il percorso prima di ri-compreso il file desiderato, mantenendo gli altri file in queste directory padre da ri-escluderli.

Con questo, i tuoi .gitignore modelli sarebbero:

public/media/** 
!public/media/private 
!public/media/catalog/ 

public/media/catalog/** 
!public/media/catalog/category/