2009-08-08 10 views
165

Chcę zignorować wszystkie pliki w moim repozytorium, z wyjątkiem tych, które występują w podkatalogu bin. Próbowałem dodanie następujących do mojego .gitignore:Jak powiedzieć Git, aby zignorował wszystko z wyjątkiem podkatalogu?

* 
!bin/* 

nie posiada pożądany efekt, jednakże: stworzyłem nowy plik wewnątrz od bin/, ale robi git status nadal pokazuje nothing to commit (working directory clean).

Wszelkie sugestie?

+0

Możliwy duplikat folderu [.gitignore exclude, ale zawiera określony podfolder] (http://stackoverflow.com/questions/5533050/gitignore-exclude-folder-but-include-specific-subfolder) – 1615903

Odpowiedz

212

ta ignoruje pliki korzeń & katalogi głównego, a następnie un-ignoruje katalogu bin root:

/* 
/*/ 
!/bin/ 

ten sposób można uzyskać wszystkie z katalogu bin , w tym podkatalogi i ich pliki.

+13

Z jakiegoś powodu to nie działa konsekwentnie dla mnie. Mam dwie linie '/ stuff /' i '!/Stuff/specific /', ale nadal ignoruje/stuff/specific/ –

+1

@ LB-- Miałem podobny problem, i 'git check-ignore -v' powiedział Mnie było to z powodu '~/.gitignore'u –

+0

@gurneyalex Dowiedziałem się, że naprawia się, jeśli usunę lokalne repozytorium i ponownie je sklonuję, musi to być błąd. –

36

Jedynym problemem jest to, że katalog bin sam w sobie nie jest dopasowany przez wzorzec bin/*, więc git nie jest nawet widoczny w katalogu bin.

Istnieją dwa rozwiązania, które przychodzą na myśl.

.gitignore:

* 
!/bin/ 
!bin/* 

lub

.gitignore:

* 
!/bin/ 

bin/.gitignore:

!* 

Wolę s Rozwiązanie Econd jako pierwsze rozwiązanie nie przestanie ignorować plików w katalogu bin znajdujących się w podkatalogach, które nie są nazywane bin. To może lub nie ma znaczenia w twojej sytuacji.

+2

Nie działa dla mnie . Muszę mieć .gitignore tak aby to działało: '# zignorował wszystko * # Ale nie te pliki ... /wp-content/ /wp-content/plugins/ ! !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* ' Brak kodu bloków w komentarzach? – xlttj

+1

[Odpowiedź Tylera] (http://stackoverflow.com/a/8594971/165673) ma lepsze rozwiązanie pojedynczego pliku – Yarin

10

myślę lepszym sposobem byłoby zakotwiczyć Każdy wzór na górę katalogu git zaczynając wzór z ukośnikiem:

/* 
!/public_html 
!/.gitignore 

Zamiast ignorować wszystkie pliki będzie ignorować tylko pliki najwyższym poziomie, a nie w katalogu, którego nie chcesz ignorować.

6

This .gitignore roboty dla mnie:

*/ 
/* 
!bin/ 
74

Oto jak ignorować wszystko Exept jednym katalogu "MY_SUPER_DUPER_TEMPLATE_directory" w jakimś katalogu

Struktura:/Bitrix/szablony/MY_SUPER_DUPER_TEMPLATE_directory

/* 
!/bitrix 
/bitrix/* 
!/bitrix/templates 
/bitrix/templates/* 
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory 
*.DS_Store 
*.gitignore 
+1

rozwiązało to dla mnie pod-podkatalog. dziękuje – frostymarvelous

+5

działa. coś mniej bolesnego dla oka? – ed22

+0

To działało na cuda, aby nie anulować pakietu sprzedającego laravel, który zmodyfikowałem! Dziękuję, uratowałeś mi wiele bólów głowy –

41

Należy wykluczyć wszystko na drodze do miejsca docelowe, ale musisz podać miejsca docelowe:

/* 
!/tsp 
/tsp/* 
!/tsp/src 
/tsp/src/* 
!/tsp/src/*.h 
!/tsp/src/*.cpp 
!/tsp/src/data.txt 
!/.gitignore 

Zignoruj ​​wszystkie, z wyjątkiem katalogu tsp, zignoruj ​​wszystkie w katalogu tsp, z wyjątkiem katalogu src ...

+9

+1 za zasadę włączenia katalogu, a następnie wyłączenia jego zawartości, a następnie włącznie z pożądanym podkatalogiem itp. Skończyło się na tym, że użyłem tej odpowiedzi w moich projektach. –

10

Spróbuj w najnowszej wersji GIT.

* 
!*/ 
!/path/to/your/dir/** 
+0

powinno być w rzeczywistości!/Path/to/your/dir/** dla ostatniej linii – faham

+0

@faham, tak, właśnie ją dodałem. – Kirby

5

Wypróbuj ten niejasny błąd git.

!bin**/** 

Nadzieja to pomaga :)

Wspieranie docs git bug sample

PS: spróbuj go najpierw przed komentowania.

9

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

Przykład wykluczyć wszystko, z wyjątkiem określonym katalogu foo/bar (uwaga/* - bez ukośnika, wildcard również wykluczyć wszystko w foo/bar):

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

Dla wyjaśnienia na temat ukośnika: When to use leading slash in gitignore.

Powiązane problemy