Whitelist e sottodirectory in Git


91

Ho creato una lista bianca solo per i file di testo.

*
!*.txt

Ora, ho un file di testo non tracciato in una sottodirectory - sub/dir/file.txte questo NON viene mostrato (viene ignorato). Tuttavia, vengono visualizzati i file di testo nella directory principale.

Perché e come lo risolvo?



I file che desideri includere in una sottodirectory? In tal caso, questa sottodirectory potrebbe essere già ignorata dalla prima stella nel file .gitignore.
fajran

Sì. Questi file saranno bassi nella struttura della directory come la cartella 11.1.102.55 nel mio esempio. L'annidamento non è sempre lo stesso tra cartelle / prodotti.
Nate

1
Conosco questa funzionalità. Abbiamo centinaia di directory. Sarebbe più veloce ignorare esplicitamente i tipi di file che non vogliamo che creare un gitignore per ogni directory. Sto davvero cercando un modo per ottenere la funzionalità di whitelist dal file .gitignore.
Nate

1
Non vedo come questo sia un duplicato. L'altra domanda chiede come inserire nella whitelist determinati file, mentre questa domanda come inserire nella whitelist determinati tipi di file, comprese le sottocartelle. In realtà, è più simile a un duplicato di stackoverflow.com/questions/8024924/… .
Big McLargeHuge

Risposte:


146

Se lo provi in ​​questo modo, fallirà, perché finirai per inserire nella lista nera le directory nella tua struttura.

Per risolvere, si desidera inserire nella blacklist tutto ciò che non è una directory e non è uno dei tipi di file che si desidera eseguire il commit, senza però inserire nella blacklist le directory .

Il .gitignorefile che farà questo:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

Testato questo in una struttura a tre livelli bianco-elenco per .txti file in presenza di *.one, *.twoe *.threefile utilizzando un .gitignoresi trovano nella directory radice del repository - funziona per me. Non dovrai aggiungere .gitignorefile a tutte le directory nella tua struttura.

Le informazioni che ho usato per capire la risposta provenivano, tra le altre cose, da questo (stackoverflow.com).


18
Hai anche bisogno della voce !.gitignore, quando usi *, vero?
sjas

2
Vedi la mia risposta qui: stackoverflow.com/questions/987142/… Potrebbe essere più utile usare /*per inserire nella lista nera solo la cartella di primo livello, ma non tutte le cartelle in modo ricorsivo, il che in realtà significa .gitignoreche non dovrebbe guardare nelle sottocartelle di una cartella autorizzata.
Ryan Taylor

2

Un modo più semplice per ottenere questo risultato è:

# Ignore all files...
*.*

# ...except the ones we want
!*.txt

Funziona perché gitignoreapplica modelli che non iniziano con /a tutti i livelli sotto il .gitignorefile:

Se è presente un separatore all'inizio o al centro (o entrambi) del pattern, il pattern è relativo al livello di directory del particolare file .gitignore stesso. Altrimenti il ​​pattern potrebbe corrispondere anche a qualsiasi livello al di sotto del livello .gitignore.

Se si desidera eseguire questa operazione sui file all'interno di una directory , le cose diventano più complesse:

# Ignore all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

Funziona perché gitignoreha regole speciali per **:

Due asterischi consecutivi (" **") nei modelli confrontati con il nome del percorso completo possono avere un significato speciale:

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

Il punto chiave è assicurarsi di non ignorare le directory, perché in tal caso ogni file all'interno di quella directory viene ignorato indipendentemente dalle altre regole.


0

Ho cercato a lungo:

  1. Supponiamo di avere una struttura di cartelle di grandi dimensioni con ~ 100.000 directory annidate ricorsivamente. In quelle cartelle ci sono circa 30.000 file di tipo .txt(nel mio caso: tipo *.md). Accanto a questi *.mdfile, ci sono, diciamo, 500 GB di (più di un milione) di file che non voglio tenere traccia.

  2. Voglio che git tenga traccia solo .txt(o *.md) dei file in tutte le cartelle e sottodirectory.

La risposta corretta dovrebbe essere: questo non è possibile in Git.

Cosa ho fatto invece:

[modifica: anche non ha funzionato - ho provato a creare una cartella con collegamenti simbolici (o collegamenti fisici) e utilizzare git lì, ma git non segue i collegamenti simbolici e sovrascrive i collegamenti fisici. Doh!]

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.