Ignora correttamente tutti i file in modo ricorsivo in una cartella specifica ad eccezione di un tipo di file specifico


89

Ho visto domande simili ( 1 , 2 e 3 ), ma non ottengo una soluzione adeguata.

Devo ignorare tutti i file in una particolare cartella tranne un tipo di file specifico. La cartella è una sottodirectory per il percorso principale. Fammi nominare la cartella Resources. Dal momento che non voglio complicare le cose, lasciami ignorare i file in tutte le cartelle denominate Resourcesovunque si trovino.

Questa è la soluzione più comune (in tutte le domande duplicate)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

Il problema con questa soluzione è che smette di tenere traccia dei file appena aggiunti (poiché *ignora tutti i file). Non voglio continuare a escludere ogni tipo di file. Voglio un comportamento normale in cui se viene aggiunto un nuovo file, lo git statusmostra.

Finalmente ho una soluzione qui . La soluzione è aggiungere un altro .gitignorefile nella Resourcescartella. Funziona correttamente.

Posso ottenere lo stesso risultato con un file ignorato? Trovo un po 'goffo avere molti file ignorati in directory diverse.

Questo è ciò che sto cercando di ottenere:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Ma questo dà l'output opposto. Ignora i *.footipi e tiene traccia di altri file.

Risposte:


108

@SimonBuchan ha ragione.

A partire da git 1.8.2, Resources/** !Resources/**/*.foofunziona.


1
Questo funziona per me, piccolo aggiustamento, ho solo bisogno di rimuovere le directory e tutto ciò che è sotto di loro così ho fatto: DirectoryName1/** DirectoryName1/**/*per ciascuna di esse. Per prima cosa rimuovere le directory ma è necessario il secondo per rimuovere tutti i tipi di file.
Scala Enthusiast

27

La risposta migliore è aggiungere un file Resources / .gitignore in Resources contenente:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

Se non sei disposto o non sei in grado di aggiungere quel file .gitignore, c'è una soluzione inelegante:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Sarà necessario modificare quel modello se si aggiungono directory più profonde di quelle specificate.


2
È triste .. In effetti avrò directory più profonde, quindi
rimarrò

Vedi ulteriori dettagli sulla stessa soluzione qui: stackoverflow.com/questions/7803689/… - anche collegato sopra da OP @nawfal
qui

7

Potrebbe sembrare stupido, ma controlla se non hai già aggiunto la cartella / i file che stai tentando di ignorare all'indice in precedenza. Se lo hai fatto, non importa cosa hai inserito nel tuo file .gitignore, le cartelle / i file verranno comunque messi in scena.


5
Se qualcuno si imbatte in questo caso d'uso specifico, puoi usare git rm --cached <path to files>per cancellare quei file ignorati da git lasciandoli ancora nel filesystem.
slothluvchunk

5

O lo sto facendo in modo sbagliato, o la risposta accettata non funziona più con l'attuale git.

In realtà ho trovato la soluzione corretta e l'ho pubblicata sotto quasi la stessa domanda qui . Per maggiori dettagli vai lì.

Soluzione:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo

2
Sì, questo funziona per me. L'aggiunta di !/Resources/**/era fondamentale per fare in modo che git non ignorasse le sottodirectory.
Johnster
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.