Git ignoruje podfoldery

438

Mam wiele projektów w moim rozwiązaniu .Net. Chciałbym wykluczyć wszystkie foldery „bin / Debug” i „bin / Release” (i ich zawartość), ale nadal zawierać sam folder „bin” i zawarte w nim dll.

.gitignore z „bin /” ignoruje foldery „Debug” i „Release”, ale także wszelkie pliki dll zawarte w folderze „bin”.

„bin / Debug” lub „bin / Release” w pliku .gitignore nie wyklucza katalogów, chyba że w pełni kwalifikuję wzorzec ignorowania jako „Solution / Project / bin / Debug” - czego nie chcę robić tak jak ja będę musiał uwzględnić ten pełny wzorzec dla każdego projektu w moim rozwiązaniu, a także dodać go do wszystkich dodanych nowych projektów.

Jakieś sugestie?

Marcel
źródło
Po co dodawać biblioteki DLL? Jeśli odwołujesz się do bibliotek DLL stron trzecich, warto dodać wspólny folder, do którego odwołują się wszystkie twoje projekty.
Paddy
6
Paddy ma rację - jeśli są to biblioteki DLL innych firm, prawdopodobnie powinny być uporządkowane z dala od twojego kodu. Jednak dla mnie wygląda to tak, jakbyś sprawdzał swoje własne produkty, co zwykle nie jest takie, jak chcesz. Git służy do śledzenia informacji , które są w pełni zawarte w kodzie i konfiguracji kompilacji. Produkty są, no cóż, produktami. Śledzenie ich wymaga kłopotów - na przykład, jeśli zmienisz kod, ale zapomnisz zbudować i sprawdzić nowe produkty?
Cascabel
Miałem problem z wykluczeniem podfolderów. Próbowałem wszystkiego, w tym dokładnie opisanych tutaj próbek, ale bez powodzenia. Wreszcie dodałem dodatkową pustą linię między wzorami folderów i działa. Może problem z kodowaniem. Mam Windows i zakodowałem to w UTF8.
RoadBump,

Odpowiedzi:

552

Czy próbowałeś symboli wieloznacznych?

Solution/*/bin/Debug
Solution/*/bin/Release

W wersji 1.8.2 git możesz także używać **znaku wieloznacznego, aby dopasować dowolny poziom podkatalogów:

**/bin/Debug/
**/bin/Release/
Josh Lee
źródło
8
Działa, chyba że istnieje podfolder z innym projektem np. Solution / Module / Project, więc na razie dodałem / * / * / bin / Debug i / * / * / * / bin / Debug (dla sub lornetka składana). Wygląda na to, że musisz dodać podfolder ze znakiem zastępczym dla każdego poziomu w strukturze katalogów.
Marcel
1
@Marcel: Cóż, git z pewnością nie zignoruje plików, których nie powiesz - ignoruje wszystko, co pasuje do symboli wieloznacznych, nie więcej, nie mniej.
Cascabel
Myślę, że podwójna gwiazda przekroczy granice katalogów, tj .: / ** / bin / Debug
Trent
11
@Taras: Niestety tak nie jest.
Tuukka Mustonen
2
Wystąpił błąd w programie Visual Studio **. Powinien być już naprawiony. link
Bogac,
106

Możesz użyć .gitignore na najwyższym poziomie, aby zignorować wszystkie katalogi w projekcie o tej samej nazwie. Na przykład:

Debug/
Release/

Powinno to zostać zaktualizowane natychmiast, aby było widoczne, gdy wykonujesz status git. Upewnij się, że te katalogi nie zostały jeszcze dodane do git, ponieważ zastąpi to ignorowanie.

Andreas
źródło
To samo można zrobić, dodając wzory do $GIT_DIR/.git/info/excludepliku OPs .
Tim Henigan
1
Różnica polega na tym, że plik .gitignore będzie podążał za kodem, więc ma zastosowanie wszędzie. Podczas gdy plik wykluczenia jest lokalny tylko dla twojego repozytorium, co oznacza, że ​​ma on zastosowanie tylko do tego konkretnego repozytorium. O ile inni polecający nie mają powodu, aby chcieć zatwierdzić te katalogi, zaleciłbym użycie .gitignore.
Andreas
1
Innym problemem jest to, jeśli masz w swoim projekcie projekt o nazwie Debug, który również zostanie zignorowany. Myślę, że rozwiązanie jest kombinacją wszystkich odpowiedzi i komentarzy - przebuduj rozwiązanie, aby zachować wspólne lub referencyjne pliki dll w innym folderze, a następnie zignoruj ​​„bin /” i / lub użyj symboli wieloznacznych.
Marcel
16
+1 Za komentarz na temat zapewnienia, że ​​katalogi nie zostały jeszcze dodane do git. Jeśli został już dodany do git, wykonaj:git rm -rf DirectoryName/
levibostian
57

Pytanie nie jest prośbą o ignorując wszystkie podkatalogi, ale nie mogłem znaleźć nigdzie odpowiedzi, więc będę pisać posty */*.

mgold
źródło
1
Czy jest jakaś szansa na wyjaśnienie? Próbowałem różnych odmian tego i nie mogę git addzignorować katalogu i wszystkich plików we wszystkich podkatalogach tego katalogu. Próbowałem dirname/, dirname/*, dirname/**, dirname/*/*, nawet w rozpaczy dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Chris,
3
*/*ignoruje wszystkie podkatalogi, ale nie pliki w bieżącym katalogu. Zignorowanie określonego podkatalogu jest normalnym użyciem gitignore. dirname, dirname/i dirname/*cała praca dla mnie. Czy coś w tym katalogu zostało już zatwierdzone?
mgold
Jest to zupełnie nowe repo - usuwam cały .gitkatalog między próbami, a git initnastępnie git add --all .(próbowałem też bez --all), używając 1.9.4.msysgit.1. Każdy niepusty podkatalog w moim nazwanym katalogu jest dodawany do indeksu (zaznaczone w TortoiseGit i git status). Brak istotnych linie .gitignorezaczynające !ale musi być jakiś konflikt. Rozwiązany na razie przez usunięcie folderów podczas add. Zgadnij, że będzie to wymagało nieco więcej wykopalisk, aby dostarczyć niezbędnych informacji do zdiagnozowania. Dziękuję za zapewnienie mnie, że nie źle rozumiem składnię.
Chris
Co zrobić, jeśli muszę zignorować folder w folderze, ale nie pierwszy? Jak na forum / ignorethisfolder / ... ale nie powinien ignorować folderu o nazwie forum
Jean Carlos Racoski
Nie działa mi to w przypadku ignorowania katalogu, którego nazwa zaczyna się od kropki. „ /. ” i „. * / *” też nie działają.
Tony
44

Wszystkie powyższe odpowiedzi są prawidłowe, ale myślę, że nie wspomniano o tym, że po dodaniu pliku z tego katalogu do repozytorium nie można zignorować tego katalogu / podkatalogu zawierającego ten plik (git zignoruje tę dyrektywę ).

Aby zignorować już dodane pliki, uruchom

$ git rm --cached

W przeciwnym razie musisz najpierw usunąć wszystkie pliki z katalogu docelowego repozytorium - a następnie możesz zignorować ten folder.

ajacian81
źródło
12
git rm --cached, jeśli chcesz, aby nie były śledzone / nie dotyczyły historii, ale chcesz, aby pliki pozostały nietknięte lokalnie.
Erik Reppen
29

Oprócz umieszczania poprawnych wpisów w pliku .gitignore, jeśli próbujesz zignorować coś, co już zostało dodane do repozytorium, musisz to zrobić git rm -r /path/to/diri zatwierdzić, zanim dodasz katalog do pliku .gitignore. W przeciwnym razie git zignoruje jedynie twoją dyrektywę ignorowania.

Jawa
źródło
19

Jedynym sposobem, w jaki mogłem to zrobić na mojej maszynie, było zrobienie tego w ten sposób:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

Zwróć uwagę, w jaki sposób musisz wyraźnie zezwalać na zawartość dla każdego poziomu, który chcesz uwzględnić. Więc jeśli mam podkatalogi 5 głęboko pod tematami, nadal muszę to przeliterować.

To jest z komentarza @ Yarin tutaj: https://stackoverflow.com/a/5250314/1696153

Były to przydatne tematy:

Też próbowałem

*
*/*
**/**

i **/wp-content/themes/**

lub /wp-content/themes/**/*

To też nie działało dla mnie. Dużo śladów i błędów!

Katie
źródło
13

Aby wykluczyć zawartość i podkatalogi:

**/bin/*

Aby po prostu wykluczyć wszystkie podkatalogi, ale wziąć zawartość, dodaj „/”:

**/bin/*/
A. Morel
źródło
9

Aby zignorować wszystkie podkatalogi, możesz po prostu użyć:

**/

Działa to od wersji 1.8.2 git.

Frederickjh
źródło
8

Ogólnym sposobem zignorowania wszystkich podfolderów przy jednoczesnym śledzeniu plików znajdujących się w /binkatalogu byłoby dodanie następującego wiersza do pliku .gitignore projektu:

bin/*/*

Jeśli chcesz zignorować tylko określone nazwane podfoldery, możesz:

bin/Debug/*
bin/Release/*

nb. jeśli binkatalog nie znajduje się w katalogu głównym twojego projektu (obok pliku .gitignore), to zamiast np. bin/*/*możesz potrzebowaćpath/to/bin/*/*

Nick F.
źródło