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.