git ignoruje wyjątek

326

Mam plik gitignore, który powoduje, że git ignoruje *.dllpliki, i takie właśnie zachowanie chcę. Jeśli jednak chcę wyjątek (tj. Mieć możliwość popełnienia foo.dll), jak mogę to osiągnąć?

zaokrąglenie
źródło
8
możliwy duplikat wyjątków w
.gitignore
fwiw, dziadek duplikatów odpowiedzi na ten temat - taki, na który powinieneś się przyjrzeć - prawdopodobnie sprawi, że .gitignore zignoruje wszystko oprócz kilku plików - bardzo regularną aktywność i kilka dobrych odpowiedzi. Jestem szczególnym fanem tej odpowiedzi , która wydaje się jasna i dokładna.
Kay V

Odpowiedzi:

447

Posługiwać się:

*.dll    #Exclude all dlls
!foo.dll #Except for foo.dll

Z gitignore :

Opcjonalny przedrostek! co neguje wzór; każdy pasujący plik wykluczony przez poprzedni wzór zostanie ponownie dołączony. Jeśli negowany wzorzec pasuje, zastąpi to źródła wzorców o niższym priorytecie.

Skilldrick
źródło
22
Zobacz także odpowiedź na formularzu @Matiss Jurgelis - to ważny dodatek
Dan
7
Czy mogę dodać wyjątek do gitignore mojego projektu, a nie do mojego globalnego gitignore? Na przykład, jeśli chcę dołączyć wszystkie biblioteki DLL do katalogu? Mój gitignore_global ma *.dllw nim i gitignore mojego projektu ma, !Libs/*.dllale wydaje się, że to nie działa.
Joel Kinzel,
1
@jkinz, powinieneś spróbować !Libs/**/*.dll.
Rosberg Linhares
@RosbergLinhares Lub !**/Libs/*.dll, w zależności od struktury folderów.
JAB
2
Dzięki, ale na komputerze Mac dodanie komentarza w tym samym wierszu co !foo.dllunieważniło polecenie. Jeśli dodam komentarz do osobnego wiersza, zadziała.
Giacomo
261

Git ignoruje foldery, jeśli piszesz:

/js

ale nie można dodać wyjątków, jeśli wykonasz: !/js/jquerylub !/js/jquery/lub!/js/jquery/*

Musisz napisać:

/js/* 

i tylko wtedy możesz z wyjątkiem takich podfolderów

!/js/jquery
Matiss
źródło
44
To bardzo ważne. Dziękuję Ci!
VisioN
3
Wygląda jednak na to, że nie można dodać zagnieżdżonych folderów, np. !/js/jquery/xyzlibNie zostanie zignorowany ...
Ignorant
2
Jak mówi @Ignorant, folder, który „z wyjątkiem” z reguły ignorowania, musi znajdować się w tym samym miejscu, co „*”
Red Pea
3
tak /js/*, !/js/jquery, /js/jquery/*, !/js/jquery/xyzlib? Wydaje się to dość zabawnym sposobem ...
Imperishable Night
naprawdę mi pomogłeś.
Loyea
55

Możesz po prostu git add -f path/to/foo.dll.

.gitignore ignoruje tylko pliki do zwykłego śledzenia i podobne rzeczy git add .

Nils Riedemann
źródło
4
Aby uzyskać więcej informacji, -fmówi git, aby .gitignore
wymusił
Co jest świetne, jeśli masz tylko jeden plik, mniej przydatne, jeśli potrzebujesz wzorca
Liam
19

Aby wykluczyć wszystko z katalogu, ale z niektórych podkatalogów, wykonaj następujące czynności:

wp-content/*
!wp-content/plugins/
!wp-content/themes/

Źródło: https://gist.github.com/444295

Simon Paarlberg
źródło
15

Po prostu dodaj !przed regułą wykluczenia.

Według strony podręcznika gitignore :

Wzory mają następujący format:

...

  • Opcjonalny przedrostek! co neguje wzór; każdy pasujący plik wykluczony przez poprzedni wzór zostanie ponownie dołączony. Jeśli negowany wzorzec pasuje, zastąpi to źródła wzorców o niższym priorytecie.
Robert Munteanu
źródło
5

!foo.dll w .gitignore, lub (za każdym razem!) git add -f foo.dll

Tobias Kienzler
źródło
4

Jeśli pracujesz z Visual Studio, a Twój binplik .dll znajduje się w folderze, musisz dodać wyjątek dla samego folderu bin, zanim będziesz mógł dodać wyjątek dla pliku .dll. Na przykład

!SourceCode/Solution/Project/bin
!SourceCode/Solution/Project/bin/My.dll

Jest tak, ponieważ domyślny .gitignoreplik programu Visual Studio zawiera wzorzec ignorowania dla[Bbin]/

Ten wzorzec zapycha wszystkie foldery bin (i w konsekwencji ich zawartość), co powoduje, że każda próba dołączenia zawartości jest zbędna (ponieważ sam folder jest już ignorowany).

Udało mi się ustalić, dlaczego mój plik nie był wyłączony z działania

git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll

z okna Git Bash. To zwróciło [Bbin]/wzór.

DeanOC
źródło
2

Rozwiązanie zależy od relacji między regułą git ignore a regułą wyjątku:

  1. Pliki / Pliki na tym samym poziomie: użyj rozwiązania @Skilldrick .
  2. Foldery / podfoldery: użyj rozwiązania @Matiss Jurgelis .
  3. Pliki / Pliki na różnych poziomach lub Pliki / Podfoldery: możesz to zrobić:

    *.suo
    *.user
    *.userosscache
    *.sln.docstates
    
    # ...
    
    # Exceptions for entire subfolders
    !SetupFiles/elasticsearch-5.0.0/**/*
    !SetupFiles/filebeat-5.0.0-windows-x86_64/**/*
    
    # Exceptions for files in different levels
    !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo
    !SetupFiles/logstash-5.0.0/**/*.suo
    
Rosberg Linhares
źródło
1

Od wersji Git 2.7.0 Git weźmie pod uwagę wyjątki. Z oficjalnych informacji o wersji:

  • Pozwól późniejszym „! / Abc / def” zastąpić wcześniejsze „/ abc”, które pojawia się w tym samym pliku .gitignore, aby ułatwić wyrażenie „wszystko w katalogu / abc jest ignorowane, z wyjątkiem ...”.

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt

Erfan
źródło
1
czy to działa dla kogoś? wydaje się nie działać dla mnie.
Ankur