Jak działają zanegowane wzorce w .gitignore?

94

Próbuję użyć pliku .gitignore z zanegowanymi wzorcami (linie zaczynające się od!), Ale nie działa tak, jak się spodziewam.

Jako minimalny przykład mam następującą strukturę katalogów:

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

aw moim pliku gitignore mam to:

aaa/
!aaa/ccc/

Rozumiem (na podstawie tej strony dokumentacji ), że plik aaa / ccc / otherfile.txt nie powinien być ignorowany, ale w rzeczywistości git ignoruje wszystko, co znajduje się pod aaa.

Czy źle rozumiem to zdanie: „Opcjonalny przedrostek! Który neguje wzorzec; każdy pasujący plik wykluczony przez poprzedni wzorzec zostanie ponownie uwzględniony.”?

BTW, to jest w systemie Windows z msysgit 1.7.0.2.

Chris Perkins
źródło

Odpowiedzi:

164

Myślę, że tak naprawdę chcesz:

aaa/*
!aaa/ccc

Mówisz mu „nie zaglądaj do aaaśrodka”, więc nigdy nawet nie sprawdza ścieżki aaa/ccc. Jeśli użyjesz symbolu wieloznacznego, nadal czyta zawartość aaa, a następnie każdy wpis pasuje do symbolu wieloznacznego i jest ignorowany, z wyjątkiem tego, aaa/cccktóry jest ponownie wstawiany.

Cascabel
źródło
2
@iconoclast: Więc prawdopodobnie robisz coś innego. Opublikuj kolejne pytanie (z pełnymi informacjami), jeśli potrzebujesz pomocy.
Cascabel
U mnie też to nie zadziałało: / apps / *! / Apps / myApps / FluidTest / bin /
Jarrod Smith
5
@Jarrod To działa; po prostu robisz coś innego. Będziesz musiał użyć tej metody rekurencyjnie, dokładnie z powodów podanych w odpowiedzi. ! apps / myApps, apps / myApps / * i tak dalej.
Cascabel
Ahh przepraszam, teraz rozumiem. Ale SO nie pozwala mi ponownie zagłosować.
Jarrod Smith,
Zastanawiam się, dlaczego to nie działa dla aaa / ** / *! Aaa / ccc / eee (ignoruj ​​wszystko, z wyjątkiem plików na określonej ścieżce)
Phương Nguyễn
23

Jeśli chcesz wykluczyć wszystko w aaa, ale uwzględniać aaa/ccci wszystko poniżej, użyj:

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

Pierwsza linia mówi gitowi, aby ignorował wszystko poniżej aaa, druga mówi mu, aby nie ignorował folderu, aaa/cccktóry faktycznie „włącza” trzecią linię, która następnie mówi mu, aby nie ignorował wszystkiego poniżej aaa/ccc.

xmak
źródło
1
Trzecia linijka nie zrobiła dla mnie różnicy.
James Hopkin
3
Aby móc zawrzeć wszystko w dowolnym podkatalogu aaa/cccna dowolnym poziomie, to, co zadziałało, to !aaa/ccc/**zamiast!aaa/ccc/*
boclodoa
3

Jeśli ktoś wciąż nie widząc nowo un-ignorowane elementy w git statusuruchomiona git update-indexprzed ręka może pomóc git aby zobaczyć zmiany (przynajmniej w wersji 1.9.x do gitbash).

alexkb
źródło