Próbuję rozwiązać problem gitignore w dużej strukturze katalogów, ale aby uprościć moje pytanie, ograniczyłem go do następującego.
Mam następującą strukturę katalogów dwóch plików (foo, bar) w zupełnie nowym repozytorium git (na razie brak zatwierdzeń):
a/b/c/foo
a/b/c/bar
Oczywiście, 'git status -u' pokazuje:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
To, co chcę zrobić, to utworzyć plik .gitignore, który ignoruje wszystko wewnątrz a / b / c, ale nie ignoruje pliku „foo”.
Jeśli utworzę .gitignore w ten sposób:
c/
Następnie 'git status -u' pokazuje, że zarówno foo, jak i bar są ignorowane:
# Untracked files:
...
# .gitignore
I jest tak, jak się spodziewam.
Jeśli teraz dodam regułę wykluczenia dla foo, to:
c/
!foo
Według strony podręcznika gitignore, spodziewałbym się, że to zadziała. Ale tak nie jest - nadal ignoruje foo:
# Untracked files:
...
# .gitignore
To też nie działa:
c/
!a/b/c/foo
Ani tego nie robi:
c/*
!foo
Daje:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
W takim przypadku, chociaż foo nie jest już ignorowane, bar również nie jest ignorowany.
Kolejność reguł w .gitignore też nie wydaje się mieć znaczenia.
To również nie robi tego, czego bym się spodziewał:
a/b/c/
!a/b/c/foo
Ten ignoruje zarówno foo, jak i bar.
Jedna sytuacja, która działa, to utworzenie pliku a / b / c / .gitignore i umieszczenie go w nim:
*
!foo
Ale problem polega na tym, że w końcu będą inne podkatalogi pod a / b / c i nie chcę umieszczać oddzielnego .gitignore w każdym z nich - miałem nadzieję, że utworzę plik .gitignore oparty na projektach pliki, które mogą znajdować się w głównym katalogu każdego projektu i obejmują całą „standardową” strukturę podkatalogów.
To również wydaje się równoważne:
a/b/c/*
!a/b/c/foo
To może być najbliższa rzecz „pracy”, jaką mogę osiągnąć, ale należy podać pełne ścieżki względne i wyraźne wyjątki, co będzie uciążliwe, jeśli mam wiele plików o nazwie „foo” na różnych poziomach drzewa podkatalogów.
W każdym razie albo nie do końca rozumiem, jak działają reguły wykluczania, albo w ogóle nie działają, gdy katalogi (a nie symbole wieloznaczne) są ignorowane - przez regułę kończącą się na /
Czy ktoś może rzucić na to trochę światła?
Czy istnieje sposób, aby gitignore używał czegoś sensownego, takiego jak wyrażenia regularne, zamiast tej niezdarnej składni opartej na powłoce?
Używam i obserwuję to z git-1.6.6.1 na Cygwin / bash3 i git-1.7.1 na Ubuntu / bash3.