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?


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.


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

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

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.


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 .


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/**

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ć.




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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.