ignorowanie dowolnego katalogu „bin” w projekcie git

1236

Mam taką strukturę katalogów:

.git/
.gitignore
main/
  ...
tools/
  ...
...

W katalogu głównym i narzędziach oraz w każdym innym katalogu, na dowolnym poziomie, może znajdować się katalog „bin”, który chcę zignorować (i chcę też zignorować wszystko pod nim). Próbowałem każdego z tych wzorów w .gitignore, ale żaden z nich nie działa:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

Czy ktoś może mi pomóc? Pierwszy wzorzec (ten, który moim zdaniem powinien działać) działa dobrze, jeśli to zrobię:

/main/**/bin/**/*

Ale nie chcę mieć wpisu dla każdego katalogu najwyższego poziomu i nie chcę modyfikować .gitignore za każdym razem, gdy dodam nowy.

Jest to w systemie Windows przy użyciu najnowszej msysgit.

EDYCJA: jeszcze jedno, są pliki i katalogi, które mają w swoich nazwach podciąg „bin”, nie chcę, aby były ignorowane :)

Ben Hymers
źródło
14
Prawdopodobnie ktoś uzna za pomocny: jeśli masz kilka repozytoriów, a każdy ma ten sam plik .gitignore, możesz umieścić go w „wspólnej” lokalizacji i uruchomić> git config --global core.excludesfile ~ / .gitignore_global Ostatni parametr to ścieżka do wspólnej lokalizacji. PS Jestem nowy i nie jestem pewien, czy to zalecenie dotyczące najlepszych praktyk. Daj mi znać, jeśli nie chcesz tego robić. Dziękuję Ci.
Budda
**Składnia wydaje teraz (marzec 2013 git 1.8.2) oficjalnie udokumentowane zobacz moją odpowiedź poniżej
VonC
2
Jeśli ktoś chce przeczytać najnowszą wersję rzeczywistej strony podręcznika, zobacz gitignore (5) .
bardziej przyjazna opcja, jeśli masz dość czytania esejów o wartości jednej linii atlassian.com/git/tutorials/saving-changes/…
suazithustra

Odpowiedzi:

1834

Przed wersją 1.8.2 **nie miał żadnego specjalnego znaczenia w .gitignore. Począwszy od 1.8.2 git obsługuje **zero lub więcej podkatalogów (patrz informacje o wersji ).

Sposobem na zignorowanie wszystkich katalogów zwanych bin gdziekolwiek poniżej bieżącego poziomu w drzewie katalogów jest użycie .gitignorepliku ze wzorem:

bin/

Na manstronie znajduje się przykład ignorowania katalogu nazwanego fooza pomocą analogicznego wzorca.

Edycja: Jeśli masz już w katalogu git jakieś foldery bin, których nie chcesz już śledzić, musisz je jawnie usunąć. Git nie przestanie śledzić ścieżek, które są już śledzone tylko dlatego, że teraz pasują do nowego .gitignorewzorca. Wykonaj folder usuń ( rm ) tylko z indeksu ( --cached ) rekurencyjnie ( -r ). Przykład wiersza poleceń dla folderu głównego bin:

git rm -r --cached bin
CB Bailey
źródło
72
Począwszy od git 1.8.2, będzie git przyjąć **w .gitignoreplikach (źródło: 1.8.2 changelog )
Carlos Campderrós
15
jest bintaki sam bin/?
Nisba,
29
@Nisba, są różne, binzignorują pliki o nazwie bin, natomiast bin/dotyczą katalogów o nazwie bin
Rani Kheir
8
odkąd się przewróciłem: nazwa folderu w git-command rozróżnia duże i małe litery :) „bin! = Bin” - może oszczędzę komuś kilka minut na tę wskazówkę :)
dba
1
W Windows 10 nie można utworzyć plik .gitignore, trzeba stworzyć gitignore.txt a następnie uruchomić ren gitignore.txt .gitignore w wiersza poleceń, aby utworzyć ten plik
shabby
463

.gitignoreO swoim śnie wydaje się być:

bin/

na najwyższym poziomie.

Michael Krelin - haker
źródło
Dziękuję bardzo za pomoc, po prostu nie zapomnij wyrejestrować zignorowanego przykładu plików: git checkout bin *
Chris Sim
1
umieść to w gitignore_global
μολὼν.λαβέ
@Glexander, dlaczego miałoby być globalnym ignorowaniem bin / katalogów? Często mają wersjonowaną treść. Globalne ignorowanie nie wpłynie na innych użytkowników repozytorium.
Michael Krelin - haker
234

Myślę, że warto wspomnieć o początkujących gitach:

Jeśli plik jest już zalogowany i chcesz go zignorować, Git nie zignoruje pliku, jeśli dodasz regułę później . W takich przypadkach należy najpierw wyśledzić plik, uruchamiając w terminalu następującą komendę:

git rm --cached

Więc jeśli chcesz, aby add zignorował niektóre katalogi w lokalnym repozytorium (które już istnieją) po edycji .gitignore, chcesz uruchomić to w katalogu głównym

git rm --cached -r .
git add .

Zasadniczo „odświeży” twoje lokalne repozytorium i rozpuści ignorowane pliki.

Widzieć:

http://git-scm.com/docs/git-rm ,

https://help.github.com/articles/ignoring-files/

plancys
źródło
jeśli zwykle robię a git add -Adla moich zatwierdzeń, czy mogę tego użyć? i czy mogę również zamienić kropkę na -A w pierwszym wierszu?
ajax333221
69

**Nigdy właściwie pracował wcześniej, ale ponieważ git 1.8.2 (marzec, 8 2013) , wydaje się być wyraźnie wymienione i obsługiwane:

Wzory w .gitignore i .gitattributespliki mogą mieć **/, jako wzorzec, który pasuje do 0 lub więcej poziomów podkatalogu .

Np. „foo/**/bar ” Pasuje do „ bar” w „ foo” samej lub w podkatalogu „ foo”.

W twoim przypadku oznacza to, że ta linia może być teraz obsługiwana:

/main/**/bin/
VonC
źródło
46
[Bb]in/

dopasowuje zarówno duże, jak i małe litery

wisbucky
źródło
2
[B]in/być jedyną wielką literą
Gank
Jak pozwolić Binignorować tylko folder i zezwolić binna git? [B]in/popełni zarówno Bini bin.
Gank
4
Powinno to zrobić, @Gank: Bin/ !bin/
Marco G
34

Nie widziałem tego tutaj wymienionego, ale wydaje się, że wielkość liter ma znaczenie. Po zmianie na / Bin pliki zostały zignorowane zgodnie z oczekiwaniami.

Cory
źródło
3
To nie jest odpowiedź na pierwotne pytanie, o którym wprost binnie było Bin.
CB Bailey,
49
Choć nie jest odpowiedzią, przyczynia się do kompletności dla innych osób szukających tego samego problemu (ja, właśnie teraz).
Jay
25

[Bb]in rozwiąże problem, ale ... Oto obszerniejsza lista rzeczy, które należy zignorować (przykładowa lista GitExtension):

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
Jaider
źródło
3
Uwaga: takie rzeczy powinny znajdować się w GLOBALNYM gitignore (zwykle w twoim katalogu domowym). Projekt gitignore powinien ignorować tylko rzeczy specyficzne dla twojego projektu (tj. Pliki .o dla aplikacji C.)
BraveNewCurrency
18

Jeśli szukasz świetnego .gitignorepliku globalnego dla dowolnego rozwiązania Visual Studio (.NET) - zalecamy użycie tego: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

AFAIK ma najbardziej kompleksowy .gitignoredla projektów .NET.

Jochen van Wylick
źródło
5
To tak naprawdę nie odpowiada na pytanie, ale dokładnie tego szukałem.
Dave
18

Krok 1: Dodaj następującą treść do pliku .gitignore.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

Krok 2: Upewnij się, że zadziałają

Jeśli problem nadal występuje, to dlatego, że ustawienia .gitignore mogą ignorować tylko pliki, które nie były pierwotnie śledzone . Jeśli niektóre pliki zostały już uwzględnione w systemie kontroli wersji, modyfikacja .gitignore jest nieprawidłowa. Aby całkowicie rozwiązać ten problem, musisz otworzyć Git Bash lub konsolę Menedżera pakietów (patrz zrzut ekranu poniżej), aby uruchomić następujące polecenia w folderze głównym repozytorium.

$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'

Konsola PM Wtedy problem zostanie całkowicie rozwiązany.

Brawo Yeung
źródło
8

Dosłownie żadna z odpowiedzi nie działała dla mnie; jedynym, który działał dla mnie był (w systemie Linux):

**/bin
(yes without the / in the end)

git version 2.18.0 
AnthonyC
źródło
Czy to zignorowało również wszystkie foldery wymienione binw podkatalogach?
vineeshvs
5

Jako zawiadomienie;

Jeśli uważasz, że .gitignorenie działa w żaden sposób (więc dodałeś do niego foo/*folder, ale git statusnadal wyświetla zawartość zmodyfikowanych folderów lub coś w tym stylu), możesz użyć tego polecenia;

git checkout -- foo/*

K-Gun
źródło
3

w wersji 2.13.3 i nowszych zapisywanie tylko bin w pliku .gitignore powinno zignorować bin oraz wszystkie jego podkatalogi i pliki

kosz

Nikhil Karanjkar
źródło
2

Dodanie ** / bin / do pliku .gitignore pomogło mi (uwaga: folder bin nie został dodany do indeksu).

Dhwaneel
źródło
1

Jeśli wzorzec wewnątrz .gitignorekończy się ukośnikiem /, znajdzie tylko dopasowanie do katalogu.

Innymi słowy, bin/dopasuje katalog bini ścieżki pod nim, ale nie będzie pasował do zwykłego pliku ani dowiązania symbolicznego bin.


Jeśli wzór nie zawiera ukośnika , tak jak w binGit traktuje go jako wzór globu powłoki (zachłanny). Więc najlepiej byłoby użyć prostego /bin.

bin nie byłoby najlepszym rozwiązaniem tego konkretnego problemu.

prosti
źródło
Miałeś na myśli „zacząć od” a /?
vineeshvs
0

W moim przypadku kodowanie pliku gitignore było problematyczne, sprawdź, czy jest to UTF-8

Jacek Plesnar
źródło