Sto cercando di risolvere un problema gitignore su una struttura di directory di grandi dimensioni, ma per semplificare la mia domanda l'ho ridotto al seguente.
Ho la seguente struttura di directory di due file (foo, bar) in un nuovo repository git (nessun commit finora):
a/b/c/foo
a/b/c/bar
Ovviamente, uno 'git status -u' mostra:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
Quello che voglio fare è creare un file .gitignore che ignori tutto all'interno di a / b / c ma non ignori il file 'pippo'.
Se creo un .gitignore in questo modo:
c/
Quindi uno 'git status -u' mostra sia foo che bar come ignorati:
# Untracked files:
...
# .gitignore
È come mi aspetto.
Ora, se aggiungo una regola di esclusione per foo, quindi:
c/
!foo
Secondo la manpage di gitignore, mi aspetto che funzioni. Ma non lo fa - ignora ancora foo:
# Untracked files:
...
# .gitignore
Questo non funziona neanche:
c/
!a/b/c/foo
Neanche questo:
c/*
!foo
dà:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
In tal caso, anche se foo non viene più ignorato, anche la barra non viene ignorata.
L'ordine delle regole in .gitignore non sembra importare neanche.
Anche questo non fa quello che mi aspetto:
a/b/c/
!a/b/c/foo
Quello ignora sia foo che bar.
Una situazione che funziona è se creo il file a / b / c / .gitignore e lo inserisco:
*
!foo
Ma il problema è che alla fine ci saranno altre sottodirectory sotto a / b / c e non voglio dover inserire un .gitignore separato in ognuna - speravo di creare .gitignore "basato su progetto" file che possono trovarsi nella directory superiore di ogni progetto e che coprono tutta la struttura della sottodirectory "standard".
Anche questo sembra essere equivalente:
a/b/c/*
!a/b/c/foo
Questa potrebbe essere la cosa più vicina al "lavoro" che posso ottenere, ma devono essere dichiarati i percorsi relativi completi e le eccezioni esplicite, il che sarà un problema se avrò molti file di nome "pippo" in diversi livelli dell'albero della sottodirectory.
Ad ogni modo, o non capisco bene come funzionano le regole di esclusione, oppure non funzionano affatto quando le directory (anziché i caratteri jolly) vengono ignorate - da una regola che termina con un /
Qualcuno può far luce su questo?
C'è un modo per fare in modo che gitignore usi qualcosa di sensato come le espressioni regolari invece di questa goffa sintassi basata su shell?
Lo sto usando e osservo con git-1.6.6.1 su Cygwin / bash3 e git-1.7.1 su Ubuntu / bash3.