Come funzionano i pattern negati in .gitignore?


93

Sto tentando di utilizzare un file .gitignore con pattern negati (righe che iniziano con!), Ma non funziona nel modo previsto.

Come esempio minimo, ho la seguente struttura di directory:

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt

e nel mio file gitignore, ho questo:

aaa/
!aaa/ccc/

La mia comprensione (basata su questa pagina del documento ) è che il file aaa / ccc / otherfile.txt non dovrebbe essere ignorato, ma in realtà git ignora tutto sotto aaa.

Sto fraintendendo questa frase: "Un prefisso opzionale! Che nega il pattern; qualsiasi file corrispondente escluso da un pattern precedente verrà incluso di nuovo."?

BTW, questo è su Windows con msysgit 1.7.0.2.

Risposte:


159

Penso che quello che vuoi veramente fare sia:

aaa/*
!aaa/ccc

Gli dici "non guardare dentro aaa", quindi non esamina nemmeno il percorso aaa/ccc. Se usi il carattere jolly, legge ancora il contenuto di aaa, quindi ogni voce corrisponde al carattere jolly e viene ignorata, tranne quella aaa/cccche viene rimessa.


2
@iconoclast: Allora probabilmente stai facendo qualcosa di diverso. Pubblica un'altra domanda (con informazioni complete) se desideri aiuto.
Cascabel

Anche questo non ha funzionato per me: / apps / *! / Apps / myApps / FluidTest / bin /
Jarrod Smith

5
@Jarrod Funziona; stai solo facendo qualcosa di diverso. Dovrai usare questo metodo in modo ricorsivo, esattamente per le ragioni fornite nella risposta. ! apps / myApps, apps / myApps / * e così via.
Cascabel

Ahh scusa ora capisco. Ma SO non mi permetterà di votare di nuovo.
Jarrod Smith

Mi chiedo perché non funziona per aaa / ** / *! Aaa / ccc / eee (ignora tutto, tranne i file in un determinato percorso)
Phương Nguyễn

21

Se vuoi escludere tutto in aaa, ma includere aaa/ccce tutto ciò che c'è sotto, dovresti usare:

aaa/*
!aaa/ccc
!aaa/ccc/*

La prima riga dice a git di ignorare tutto ciò che c'è sotto aaa, la seconda gli dice di non ignorare la cartella aaa/cccche effettivamente "abilita" la terza riga che poi gli dice di non ignorare tutto ciò che c'è sotto aaa/ccc.


1
La terza riga non ha fatto differenza per me.
James Hopkin

3
Per essere in grado di includere tutto in qualsiasi sottodirectory di aaa/cccqualsiasi livello, ciò che ha funzionato per me è stato !aaa/ccc/**invece di!aaa/ccc/*
boclodoa

3

Se qualcuno continua a non vedere gli elementi appena ignorati durante l' git statusesecuzione di una git update-indexmano precedente, può aiutare git a vedere le modifiche (almeno nella versione 1.9.x di gitbash).

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.