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.
Odpowiedzi:
Wydaje się, że działa u mnie (git 1.7.0.4 w systemie Linux). Jest
*
to ważne, ponieważ w przeciwnym razie ignorujesz sam katalog (więc git nie zajrzy do środka) zamiast plików w katalogu (co pozwala na wykluczenie).Pomyśl o wykluczeniach jako stwierdzenie „ale nie tego” zamiast „ale uwzględnij ten” - „ignoruj ten katalog (
/a/b/c/
), ale nie ten (foo
)” nie ma większego sensu; „ignoruje wszystkie pliki w tym katalogu (/a/b/c/*
), ale nie ten (foo
)”. Cytując stronę podręcznika:tzn. plik musiał zostać już wykluczony, aby można go było ponownie dołączyć. Mam nadzieję, że to rzuca trochę światła.
źródło
/a/b/c
a następnie napisać podpięcie dogit add --force
dowolnego pasującego pliku przed zatwierdzeniem lub coś takiegoMam podobną sytuację, moim rozwiązaniem było zastosowanie:
To powinno działać dla dowolnej liczby katalogów pośrednich, jeśli dobrze przeczytam
**
.źródło
nie jest to na pewno jasne ze strony podręcznika .gitignore. To działa:
Jak wspomniał Chris, katalog nie jest nawet otwierany, jeśli jest wykluczony. Więc jeśli chcesz mieć możliwość ignorowania * ale niektórych plików, musisz zbudować ścieżkę do tych plików jak powyżej. Dla mnie jest to wygodne, ponieważ chcę zrobić recenzję kodu na 1 pliku biblioteki i jeśli chcę zrobić później kolejny, po prostu go dodaję, a wszystko inne jest ignorowane.
źródło
Oto inna opcja:
To zignorowałoby każdy plik i katalog, z wyjątkiem plików / katalogów trzy poziomy w głębi pliku.
źródło
Na bardziej ogólnym notatki, git1.8.2 obejmie poprawki (również w jej v4 , poproszony przez jakiegoś przepełnienie stosu pytanie ) z Adam Wież o określenie, które
gitignore
rządzą faktycznie ignoruje plik.Zobacz informacje o wydaniu git1.8.2 i pytanie SO „ która reguła gitignore ignoruje mój plik ”:
to będzie polecenie
git check-ignore
.źródło
check-ignore
powie Ci również, która reguła zapobiega ignorowaniu Twojego pliku, jeśli tak jest.