Sto cercando di risolvere un problema di gitignore su una struttura di directory di grandi dimensioni, ma per semplificare la mia domanda l'ho ridotto a quanto segue.Come funzionano effettivamente le regole di esclusione di gitignore?
Ho la seguente struttura di directory dei due file (foo, bar) in un nuovo repository git (non impegna finora):
a/b/c/foo
a/b/c/bar
Ovviamente, un 'git stato -u' spettacoli:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
Quello che voglio fare è creare un file .gitignore che ignori tutto dentro a/b/c ma non ignori il file 'pippo'.
Se creo un Gitignore così:
c/
Poi un 'git stato -u' mostra sia foo e bar come ignorato:
# Untracked files:
...
# .gitignore
Che è come mi aspetto.
Ora, se posso aggiungere una regola di esclusione per foo, in tal modo:
c/
!foo
Secondo la pagina di manuale gitignore, mi aspetto questo per funzionare. Ma non lo fa - ignora ancora foo:
# Untracked files:
...
# .gitignore
Questo non funziona neanche:
c/
!a/b/c/foo
Né fa questo:
c/*
!foo
Dà:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
In tal caso, anche se foo non è più ignorante ed, la barra non viene ignorata.
Anche l'ordine delle regole in .gitignore non sembra avere importanza.
Anche questo non fa quello che ci si aspetta:
a/b/c/
!a/b/c/foo
che si ignora sia foo e bar.
Una situazione che funziona è che se creo il file a/b/c/.gitignore e mettere in là:
*
!foo
Ma il problema è che alla fine ci saranno altri sottodirectory sotto un/b/c e non voglio dover mettere un .gitignore separato in ognuno di essi - speravo di creare file ".gitignore" basati su progetto che si possono trovare nella directory principale di ogni progetto e coprire tutti la struttura della sottodirectory "standard".
Questo sembra anche essere equivalente:
a/b/c/*
!a/b/c/foo
Questa potrebbe essere la cosa più vicina a "lavoro" che posso raggiungere, ma i percorsi relativi pieni e le eccezioni esplicite devono essere indicati, che sta per essere un dolore se ho un sacco di file di nome 'pippo' in diversi livelli dell'albero della sottodirectory.
In ogni caso, o io non capisco come funzionano le regole di esclusione, o non funzionano affatto quando le directory (piuttosto che i caratteri jolly) vengono ignorati - da una regola che termina in un/
Qualcuno può far luce su questo?
C'è un modo per far sì che gitignore usi qualcosa di sensato come le espressioni regolari invece di questa goffa sintassi basata su shell?
Sto usando e osservo questo con git-1.6.6.1 su Cygwin/bash3 e git-1.7.1 su Ubuntu/bash3.
domanda correlata: http://stackoverflow.com/questions/2820255/how-do-negated-patterns-work-in-gitignore/2820310#2820310 – Cascabel