czy można zignorować reguły .gitignore w podkatalogu?

83

Chcę zignorować wszystkie reguły .gitignore w podkatalogu z wyjątkiem reguł .gitignore w katalogu głównym.

na przykład) Mam już .gitignoreplik w strukturze katalogów /a.

A także .gitignoreplik w formacie /a/b. Załóżmy, że /amasz a.txt b.txtpliki.

/a/bma .configplik. .gitignoredefiniuje .configw /a/b.

.configplik zostanie zignorowany przez .gitignorein /a/b.

Ale naprawdę chcę śledzić .configplik, ignorując reguły .gitignorew podkatalogu.

Czy to możliwe?

Z góry dziękuję

jeon
źródło

Odpowiedzi:

135

Twoje pytanie nie jest zbyt jasne, ale jeśli są podkatalogi, w których potrzebujesz innych reguł gitignore, możesz po prostu utworzyć nowy .gitignore w tym katalogu.

Powiedz, że masz:

projekt / .gitignore
projekt / rzeczy / .gitignore

.Gitignore w stuff / nadpisze .gitignore w katalogu głównym.

git help gitignorelub man gitignorema trochę więcej informacji o tym, co jest możliwe.

signine
źródło
2
Myślę, że PO jest pytaniem, czy mają strukturę katalogów /a/b/ci zaktualizować .gitignorew /a/b, jest to możliwe w /a/b/cignorować przepisy, /a/ba zamiast używać tylko z zasady /a.
Michael Mior
45
Tak, jeśli to było pytanie, możliwe jest zanegowanie reguł w .gitignore dalej w łańcuchu. "An optional prefix ! which negates the pattern; any matching file excluded by a previous pattern will become included again."
podpisanie
3
@signine Nie działa z katalogami. Zobacz moją odpowiedź .
Ross Patterson
2
Myślę, że dokładniej jest to powiedzieć: inner .gitignorewola łączy się outer .gitignorez wyższym priorytetem, a nie po prostu zastępuje.
Trump 2020 - Sprawiedliwość nadejdzie
@eric wang najwyraźniej podkatalog nie łączy się, ale zastępuje: git-scm.com/docs/gitignore
topspin
41

Powiedzmy, że chcesz dołączyć do node_modulesrepozytorium, ale jakiś moduł w dalszej linii ma .gitignoreswój własny. Możesz zanegować reguły, dodając następujące elementy do .gitignorepliku głównego :

# Make sure to include everything in node_modules.
!node_modules/**
Nick Zalutskiy
źródło
3
Czy istnieje bardziej ogólny sposób, aby to zrobić? powiedzmy, że mam node_modules/mod1, node_modules/mod2w obu są .gitignore, które ignorują głębsze node_modulesw nich (tak jak w node_modules/mod1/node_modules. Często dodaję i usuwam moduły, więc nie mogę dobrze znać i ręcznie dodawać reguł, aby ignorować node_modules/mod1/.gitignorelub ręcznie dodawać przez !node_modules/mod1/node_modulescały czas. Zasadniczo próbuję wdrożyć aplikację meteor, a wszystkie elementy osadzone .gitignoresuniemożliwiają uzyskanie tego wszystkiego w git.
gman
10

Kluczem do tego problemu jest wykluczenie katalogu nadrzędnego. Od $ man gitignore:

Nie można ponownie dołączyć pliku, jeśli katalog nadrzędny tego pliku jest wykluczony. Git nie wyświetla wykluczonych katalogów ze względu na wydajność, więc wszelkie wzorce na zawartych plikach nie mają wpływu, bez względu na to, gdzie są zdefiniowane.

Oto jak to działa. Dany:

/a/...
/b/foo
/c/...

/.gitignore:

/*
!/b

Następnie /b/foopojawi się jako dołączone pliki, podczas gdy wszystko w /ai /czostanie wykluczone. Wadą jest to, że musisz dodać negację dla wszystkich elementów nadrzędnych dowolnego katalogu, w którym chcesz dołączyć pliki.

Ross Patterson
źródło
Dlaczego nie używać !/b/**/*?
Alexis Tyler
Nie mogę odpowiedzieć bez dalszych wyjaśnień od Ciebie.
Ross Patterson
6

O ile wiem, nie da się tego zrobić. Ponieważ lokalny plik .gitignore nadpisze główny plik ginignore. Moje obejście polega na ręcznym dodaniu.

git add --force [ your file and folder]
helloiloveit
źródło
dziecko .gitignorenie działało dla mnie, ponieważ rodzic zastępuje ustawienia folderu podrzędnego. Jeśli wymusisz dodanie za pomocą git add -f myfile.txt, rozpocznie śledzenie zmian z pominięciem .gitignoreustawień rodzica .
SliverNinja - MSFT