2013-03-08 14 views
22

Sto tentando di autorizzare la directory (e il suo contenuto) SupplierName nella mia directory del fornitore Zend Framework 2..gitignore whitelist sulla directory e il suo contenuto

Il file originale in .gitignore/vendor si presenta così:

# Add here the vendor path to be whitelisted 
# Ex: for composer directory write here "!composer" (without quotes) 
!.gitignore 
* 

Ora mi piacerebbe whitelist il SupplierName directory che non dovrebbe essere troppo difficile ho pensato. Ho read the docs on gitignore e ho cercato le seguenti configurazioni:

primo tentativo, aggiungere SupplierName subito dopo il commento che dice che devo aggiungere il percorso whitelist qui!.

# Add here the vendor path to be whitelisted 
!SupplierName 
# Ex: for composer directory write here "!composer" (without quotes) 
!.gitignore 
* 

Subito dopo che ho eseguito git status che non ha mostrato la cartella vendor/SupplierName. git add vendor/SupplierName ha mostrato il seguente messaggio:

i seguenti percorsi vengono ignorati da uno dei vostri file .gitignore: vendor/SupplierName

secondo tentativo

# Add here the vendor path to be whitelisted 
# Ex: for composer directory write here "!composer" (without quotes) 
!SupplierName 
!.gitignore 
* 

Subito dopo ho eseguito git status che non ha mostrato la directory del fornitore/fornitoreName. git add vendor/SupplierName ha mostrato il seguente messaggio:

i seguenti percorsi vengono ignorati da uno dei vostri file .gitignore: vendor/SupplierName

terzo tentativo

# Add here the vendor path to be whitelisted 
# Ex: for composer directory write here "!composer" (without quotes) 
!.gitignore 
* 
!SupplierName 

Subito dopo ho eseguito git status che non ha mostrato la directory del fornitore/fornitoreName. git add vendor/SupplierNamesembra funzionare. Ma ora, quando voglio aggiungere il file Module.php (e altri file, sottodirectory, ecc.) Succede quanto segue. git add vendor/SupplierName/Module.php ->

i seguenti percorsi vengono ignorati da uno dei vostri file .gitignore: vendor/SupplierName/Module.php

# Add here the vendor path to be whitelisted 
# Ex: for composer directory write here "!composer" (without quotes) 
* 
!.gitignore 
!SupplierName 
!SupplierName/ 
!SupplierName/* 

mi permette di aggiungere i file direttamente in vendor/SupplierName, ma git add vendor/SupplierName/config/module.config.php risultati ancora in

i seguenti percorsi vengono ignorati da uno dei vostri file .gitignore: vendor/SupplierName/config/module.config.php

Ho cercato problemi relativi alla lista bianca ricorsiva, perché questo sembra essere il problema, ma non è venuto fuori nulla.

+0

Perché non semplicemente 'git add -f fornitore/SupplierName' insted di combattere le tue regole di ignorare git – AD7six

+0

Perché questo non è il modo in cui" dovrebbe "essere fatto a mio parere. Oltre a ciò, potrebbe causare problemi quando qualcuno inizia a lavorare sul progetto. –

+0

Che tipo di problemi? Penso che stai 'sistemando' il problema sbagliato qui. – AD7six

risposta

25

È possibile utilizzare 2 .gitignore file per ottenere il risultato desiderato:

# vendor/.gitignore 
* 
!.gitignore 
!SupplierName/ 
!SupplierName/* 

# vendor/SupplierName/.gitignore 
!* 

Ho provato questo con un pronti contro termine di prova e sembra funzionare per me in aggiunta di file, come molti livelli di profondità sotto la directory vendor/SupplierName.

$ git add . 

$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: vendor/.gitignore 
# new file: vendor/SupplierName/.gitignore 
# new file: vendor/SupplierName/a 
# new file: vendor/SupplierName/b 
# new file: vendor/SupplierName/c 
# new file: vendor/SupplierName/d 
# new file: vendor/SupplierName/dir1/d 
# new file: vendor/SupplierName/dir1/dir4/dir5/dir6/dir7/dir8/dir9/dir10/somefile 
# new file: vendor/SupplierName/dir1/dir4/f1 
# new file: vendor/SupplierName/dir1/dir4/f2 
# new file: vendor/SupplierName/dir1/dir4/f3 
# new file: vendor/SupplierName/dir1/dir4/f4 
# new file: vendor/SupplierName/dir1/e 
# new file: vendor/SupplierName/dir1/f 
# new file: vendor/SupplierName/dir3/dir6/f5 
# new file: vendor/SupplierName/dir3/dir6/f6 
# new file: vendor/SupplierName/dir3/dir6/f7 
# new file: vendor/SupplierName/dir3/dir7/f8 
# new file: vendor/SupplierName/e 
# 
+0

Grazie! Questo funziona. Otterrai una taglia quando StackOverflow lo consente .. –

2

Ho avuto un problema simile quando si passa da CVS a Git.

Diversamente da CVS, Git non esamina le directory, ma si concentra sui file.

Per esempio non si può non-ignorare la directory "a", ma non si può ignorare la-tutti i file nella directory "a" in questo modo:! A/*

Lo stesso vale per le sottodirectory.

Se la directory "a" ha una sottodirectory "b" e si ignora "! A/*", si otterranno comunque tutti i file in "a/b".

Quindi è necessario ignorare anche questo "! A/b/*" e così via per tutte le sottodirectory che si desidera elencare.

È necessario solo un file .gitignore.

Così si finisce con qualcosa di simile:

# ignore everything 
* 
# except for .gitignore files in the current directory 
!.gitignore 
# and all files in directory a 
!a/* 
#and all files in subdirectory b 
!a/b/* 

Con questo si potrebbe ancora ottenere i file da A/C e a/b/c. Non sono sicuro se esiste una soluzione alternativa per ricodificare le sottodirectory.

12

È inoltre possibile raggiungere questo obiettivo con un solo .gitignore di file (nella root del progetto):

/* 
!/.gitignore 
!/vendor 
/vendor/* 
!/vendor/SupplierName 
2

Si dovrebbe includere tutto nella lista nera, poi fare ogni directory e subdirctory nella whitelist. Per esempio, voglio solo mettere DIR /opt/source/, DIR /opt/nginx/ e FILE /home/test/.opt/hello.txt in whitelist, sapeva scrivere .gitignore file in questo modo per farlo funzionare:

/* 
!/.gitignore 
!/opt 
/opt/* 
!/opt/source/ 
!/opt/nginx/ 
!/home 
/home/* 
!/home/test 
/home/test/* 
!/home/test/.opt 
/home/test/.opt/* 
!/home/test/.opt/hello.txt 
1

trovato un articolo interessante: https://jasonstitt.com/gitignore-whitelisting-patterns

Tutti i crediti a Jason Stitt. I testi vengono copiati dal sito di cui sopra:

ignorare tutto, quindi aggiungere sottostrutture specifici

# Ignore everything 
* 
# But descend into directories 
!*/ 
# Recursively allow files under subtree 
!/subtree/** 
# You can be specific with these rules 
!/some/other/deep/path/** 
!.gitignore 

Il !*/ regola non-ignora tutte le directory. Ma Git non tiene traccia delle directory, solo i file, quindi !*/ da solo consentirà la discesa nella struttura di directory completa solo per ; in realtà non consente nulla a nel repository. Con questa regola, è necessaria una sola regola utilizzando il carattere jolly ricorsivo ** per includere una sottostruttura.

Se non si utilizza !*/, occorrono regole aggiuntive per ignorare /albero secondario/e le relative directory figlio.

Non a tutti piace !*/ perché significa che se qualsiasi altra regola permette un modello di nome di file trovati all'interno di alcune directory non si vuole in pronti contro termine, la directory stessa non sarà bloccato. È necessario utilizzare le regole specifiche per i file da includere con questo.

Ignora la directory principale, quindi aggiungere sottostrutture interi

# Ignore everything in the root 
/* 
# Un-ignore all of subtree 
!/subtree/ 
!.gitignore 

Questo modello è più scadente di quella precedente. La regola /* ignorerà solo gli elementi nella radice della struttura di directory del pronti contro termine, quindi non appena si White list Un elenco, tutti contenuti della directory sarà consentito così, anche senza utilizzare i * o ** jolly.

ignorare tutto in una directory, ma mantenere la directory vuota

* 
!.gitignore 

Git non vuole includere una directory vuota in un repo, perché tiene traccia dei file. Metti un file nascosto (come .gitignore) nella directory e verrà salvato. Ma per mantenere la directory vuota, anche con se ci sono file per test/sviluppo, è una buona idea ignorare tutto tranne il file .gitignore stesso.

Problemi correlati