Jak powiedzieć Gitowi, aby ignorował wszystko oprócz podkatalogu?

218

Chcę zignorować wszystkie pliki w moim repozytorium oprócz tych, które występują w binpodkatalogu. Próbowałem dodać do mojego .gitignore:

*
!bin/*

Nie ma to jednak pożądanego efektu: utworzyłem nowy plik w środku bin/, ale git statusnadal pokazuję nothing to commit (working directory clean).

Jakieś sugestie?

Michael Goerz
źródło

Odpowiedzi:

273

Ignoruje to pliki root i katalogi główne, a następnie usuwa katalog katalogu głównego:

/*
/*/
!/bin/

W ten sposób otrzymujesz cały katalog bin, w tym podkatalogi i ich pliki.

Tyler Laing
źródło
25
Z jakiegoś powodu nie działa to dla mnie konsekwentnie. Mam dwie linie /stuff/i !/stuff/specific/, ale nadal ignoruje / stuff / specific /
LB--
1
@ LB-- Miałem podobny problem i git check-ignore -vpowiedziałem, że to z powodu~/.gitignore
Gurney Alex
@Gurneyalex Dowiedziałem się, że naprawia się samo, jeśli usunę lokalne repo i ponownie go sklonuję, to musi być błąd.
LB--
2
Czy konieczne jest / * /?
Alex Baker
3
To mi nie zadziałało. Musiałem dodać !/bin/do mojego .gitignorepliku głównego , ale dodatkowo musiałem dodać /bin/.gitignoreplik za pomocą !*... Wykonanie tylko jednej z tych zmian nie zadziałało. Działało to dopiero po połączeniu obu zmian.
Felipe Brahm
113

Tutaj, jak zignorować wszystko oprócz jednego katalogu „ MY_SUPER_DUPER_TEMPLATE_directory ” w jakimś katalogu

Struktura: / bitrix / templates / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore
Andrii Tishchenko
źródło
1
To zadziałało cudem dla odignorowania zmodyfikowanego pakietu dostawcy laravel! Dziękuję, zaoszczędziłeś mi wielu bólów głowy
Maria Vilaró
To powinno być wybrane jako najlepsza odpowiedź.
Bahman.A
63

Musisz wykluczyć wszystko w drodze do miejsc docelowych, ale musisz uwzględnić miejsca docelowe:

Uwaga: Jest to plik wykluczający (np. Gitignore), więc logika jest odwrócona. Zignoruj ​​wszystko oprócz katalogu tsp, zignoruj ​​wszystko w katalogu tsp, z wyjątkiem katalogu src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore
nikc
źródło
11
+1 za zasadę uwzględnienia katalogu, następnie z wyłączeniem jego zawartości, a następnie wraz z pożądanym podkatalogiem itp. Skończyłem z tą odpowiedzią w moich projektach.
Jan Jezus
40

Jedyny problem, jaki masz, to to, że binsam katalog nie pasuje do bin/*wzorca, więc git nawet nie zagląda do binkatalogu.

Przychodzą mi na myśl dwa rozwiązania.

.gitignore :

*
!/bin/
!bin/*

lub

.gitignore :

*
!/bin/

bin/.gitignore :

!*

Wolę drugie rozwiązanie, ponieważ pierwsze rozwiązanie nie przestanie ignorować plików w binkatalogu, które znajdują się w podkatalogach, które nie są wywoływane bin. To może, ale nie musi mieć znaczenia w twojej sytuacji.

CB Bailey
źródło
2
Nie działało dla mnie. Muszę mieć taki .gitignore, aby działał: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* Brak kodu blokowego w komentarzach?
xlttj
1
Odpowiedź Tylera ma lepsze rozwiązanie z jednym plikiem
Yarin,
19

Z oficjalnego git doc jeden z przykładów mówi:

Przykład wykluczenia wszystkiego oprócz określonego katalogu foo / bar (zwróć uwagę na / * - bez ukośnika, symbol wieloznaczny również wykluczy wszystko w obrębie foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Wyjaśnienie dotyczące wiodącego ukośnika: kiedy używać wiodącego ukośnika w gitignore .

przesilenie 333
źródło
Dziękuję milionowi, to zadziałało dla mnie! Uwaga dla innych, że kolejność linii tutaj jest ważna, nie możesz na przykład mieć! / Foo / bar przed / foo / *.
Iamsodarncool
13

Spróbuj wykonać najnowszą wersję GIT.

*
!*/
!/path/to/your/dir/**
Kirby
źródło
tak naprawdę powinno być! / path / to / your / dir / ** dla ostatniej linii
faham 10.09.16
@faham, tak, właśnie go dodałem.
Kirby
11

Myślę, że lepszym sposobem byłoby zakotwiczenie każdego wzorca w górnym katalogu git, zaczynając od ukośnika:

/*
!/public_html
!/.gitignore

Zamiast ignorować wszystkie pliki, będą ignorować tylko pliki najwyższego poziomu, a nie te w katalogu, którego nie chcesz ignorować.

Jake
źródło
8

To .gitignoredziała dla mnie:

*/
/*
!bin/
Trianam
źródło
5

wypróbuj ten niejasny błąd git.

!bin**/**

Mam nadzieję, że to pomoże :)

Wspieranie docs próbki błędów git

PS: spróbuj najpierw przed komentowaniem.

David
źródło
0

Musiałem to ostatnio zrobić:

*
!sub-dir/
!sub-dir/*

Nie jestem pewien, dlaczego potrzebuję dwóch wierszy, aby wykluczyć jeden folder, ale to zadziałało dla mnie i dla komputerów Mac.

Henz
źródło