2010-05-12 10 views
59

Sto tentando di utilizzare un file .gitignore con pattern negati (righe che iniziano con!), Ma non funziona come mi aspetto.Come funzionano i pattern negati in .gitignore?

Come esempio minimo, ho la struttura di directory folllowing:

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

e nel mio file gitignore, ho questo:

aaa/ 
!aaa/ccc/ 

mia comprensione (sulla base di this doc page) è che il il file aaa/ccc/otherfile.txt non dovrebbe essere ignorato, ma in effetti git sta ignorando tutto sotto aaa.

Sto fraintendendo questa frase: "Un prefisso opzionale! Che annulla il modello, qualsiasi file di abbinamento escluso da un modello precedente verrà incluso di nuovo."?

BTW, questo è su Windows con msysgit 1.7.0.2.

risposta

104

Penso che ciò che si vuole realmente fare è:

aaa/* 
!aaa/ccc 

Stai dicendo che "non guardare in aaa" in modo che non prende in esame anche il percorso aaa/ccc. Se si utilizza il jolly, si legge ancora il contenuto del aaa, quindi ogni voce corrisponde al carattere jolly e viene ignorato, salvo aaa/ccc che viene rimesso in.

+2

che non ha funzionato per me .... – iconoclast

+2

@iconoclast: Quindi probabilmente stai facendo qualcosa di diverso. Pubblica un'altra domanda (con informazioni complete) se vuoi aiuto. – Cascabel

+0

Questo non ha funzionato neanche per me: /apps/* !/Apps/myApps/FluidTest/bin/ –

10

Se si desidera escludere tutto in aaa, ma includere aaa/ccc e tutto sotto di esso, si dovrebbe usare:

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

la prima riga dice a Git di ignorare everthing sotto aaa, la seconda dice che non ignorare la cartella aaa/ccc che in realtà "consente" la terza linea che poi dice che non ignorare tutto sotto aaa/ccc.

+1

La terza linea non ha fatto alcuna differenza per me. –

+1

Per poter includere tutto in qualsiasi sottodirectory di 'aaa/ccc' a qualsiasi livello, ciò che ha funzionato per me era'! Aaa/ccc/** 'invece di'! Aaa/ccc/* ' – boclodoa

1

Se qualcuno continua a non vedere elementi appena ignorati in un git status in esecuzione a git update-index in anticipo può aiutare git a vedere le modifiche (almeno nella versione 1.9.x di gitbash).