Come posso dire a Git di ignorare tutto tranne una sottodirectory?


218

Voglio ignorare tutti i file nel mio repository tranne quelli presenti nella binsottodirectory. Ho provato ad aggiungere quanto segue al mio .gitignore:

*
!bin/*

Questo non ha l'effetto desiderato, tuttavia: ho creato un nuovo file all'interno di bin/, ma facendo git statuscomunque spettacoli nothing to commit (working directory clean).

Eventuali suggerimenti?


Risposte:


273

Ciò ignora i file di root e le directory di root, quindi annulla l'annullamento della directory del bin root:

/*
/*/
!/bin/

In questo modo ottieni tutta la directory bin, comprese le sottodirectory e i loro file.


25
Per qualche motivo questo non funziona in modo coerente per me. Ho le due righe /stuff/e !/stuff/specific/, ma ignora ancora / stuff / specific / /
LB

1
@ LB-- Ho avuto un problema simile e git check-ignore -vmi ha detto che era a causa di~/.gitignore
gurney alex

@gurneyalex Ho scoperto che si risolve da solo se elimino il repository locale e lo clono di nuovo, deve essere un bug.
LB--

2
Il / * / è necessario?
Alex Baker,

3
Questo non ha funzionato per me. Ho dovuto aggiungere !/bin/al mio .gitignorefile root , ma poi ho dovuto aggiungere un /bin/.gitignorefile con !*... Apportare solo una di quelle modifiche non ha funzionato. Ha funzionato solo dopo aver combinato entrambe le modifiche.
Felipe Brahm,

113

Ecco come ignorare tutto tranne una directory " MY_SUPER_DUPER_TEMPLATE_directory " in alcune directory

Struttura: / bitrix / templates / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore

1
Questo ha funzionato a meraviglia per l'ignoramento di un pacchetto fornitore Laravel che avevo modificato! Grazie, mi hai risparmiato un sacco di mal di testa
Maria Vilaró,

Questo dovrebbe essere selezionato come la migliore risposta.
Bahman.

63

È necessario escludere tutto sulla strada per le destinazioni, ma è necessario includere le destinazioni:

Nota: questo è un file di esclusione (ad es. .Gitignore) quindi la logica è invertita. Ignora tutto, tranne la directory tsp, ignora tutto nella directory tsp, tranne la directory src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore

11
+1 per il principio di includere una directory, quindi, escludendo i suoi contenuti, quindi, inclusa la sottodirectory desiderata, ecc. Ho finito per usare questa risposta sui miei progetti.
Giovanni Gesù,

40

L'unico problema che hai è che la bindirectory stessa non corrisponde al bin/*modello, quindi git non è nemmeno cercare nella bindirectory.

Ci sono due soluzioni che mi vengono in mente.

.gitignore :

*
!/bin/
!bin/*

o

.gitignore :

*
!/bin/

bin/.gitignore :

!*

Preferisco la seconda soluzione poiché la prima soluzione non smetterà di ignorare i file nella bindirectory che si trovano nelle sottodirectory che non vengono chiamate bin. Questo può o meno avere importanza nella tua situazione.


2
Non ha funzionato per me. Devo avere un .gitignore come questo per farlo funzionare: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* Nessun codice di blocco nei commenti?
xlttj,

1
La risposta di Tyler ha una soluzione a file singolo migliore
Yarin,

19

Dal documento ufficiale di git , uno degli esempi dice:

Esempio per escludere tutto tranne una specifica directory foo / bar (nota / / - senza la barra, il carattere jolly escluderebbe anche tutto all'interno di foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Per una spiegazione della barra iniziale: quando utilizzare la barra iniziale in gitignore .


Grazie mille, questo ha funzionato per me! Nota ad altri che l'ordine delle linee qui è importante, per esempio non puoi avere! / Foo / bar prima di / foo / *.
Iamsodarncool,

13

Prova a seguire nell'ultima versione di GIT.

*
!*/
!/path/to/your/dir/**

in realtà dovrebbe essere! / path / to / your / dir / ** per l'ultima riga
faham

@faham, sì, l'ho appena aggiunto.
Kirby,

11

Penso che un modo migliore sarebbe quello di ancorare ogni modello alla directory git superiore avviando il modello con una barra:

/*
!/public_html
!/.gitignore

Invece di ignorare tutti i file, ignorerà solo i file di livello superiore, non quelli nella directory che non si desidera ignorare.



5

prova questo oscuro bug git.

!bin**/**

Spero che sia d'aiuto :)

Documenti di supporto git esempio di bug

PS: provalo prima di commentare.


0

Ho dovuto farlo di recente:

*
!sub-dir/
!sub-dir/*

Non sono sicuro del motivo per cui ho bisogno di due righe per escludere una cartella, ma questo è ciò che ha funzionato per me e macos.

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.