Jak dodać pliki bez kropek (wszystkie pliki bez rozszerzeń) do pliku gitignore?


111

Jak mówi tytuł, czy można dodać „pliki bez kropek” do pliku gitignore?

Wyobrażam sobie, że załatwiłoby to wszystkie uciążliwe pliki bez rozszerzeń.


2
Istnieją pewne pliki bez rozszerzeń, które nie chcą ignorować: README, LICENSElub COPYING, INSTALL, Makefileitd., Chociaż zawsze można wymusić dodać je, a następnie są śledzone
Jakub Narębski

@ JakubNarębski dobra uwaga. Zawarłem to w mojej odpowiedzi dla większej widoczności.
VonC

Odpowiedzi:


121

Możesz wypróbować kombinację podobną do:

*
!/**/
!*.*

Ta gitignorereguła wykluczenia ( zanegowany wzorzec ) powinna ignorować wszystkie pliki, z wyjątkiem tych z rozszerzeniem.

Jak wspomniano poniżej przez Mad fizyka , zasada jest:

Nie można ponownie dołączyć pliku, jeśli katalog nadrzędny tego pliku jest wykluczony. (*)
(*: chyba że są spełnione określone warunki w git 2.?+, patrz poniżej)

Dlatego jest !/**/to ważne (rekurencyjne wyświetlanie białych list folderów nadrzędnych), jeśli chcemy wyświetlać pliki na białej liście.

Wspomniałem o tej samej zasadzie w podobnych przypadkach:


Jak komentuje Jakub Narębski , możesz nie chcieć ignorować wszystkich plików bez rozszerzeń.

Moja rada:

  • dodaj najpierw plik bez rozszerzenia, który ma znaczenie
  • następnie edytuj swój, .gitignorejak pokazano powyżej: już wersjonowane pliki nie zostaną zignorowane (nawet jeśli nie mają rozszerzenia). Wszystkie inne zostaną zignorowane.

W przypadku przyszłych plików bez rozszerzeń, które chcesz zaktualizować:

git add -f -- myFile

Zauważ, że w przypadku git 2.9.x / 2.10 (połowa 2016?) Może być możliwe ponowne dołączenie pliku, jeśli katalog nadrzędny tego pliku jest wykluczony, jeśli nie ma symbolu wieloznacznego w ścieżce ponownie dołączonej .

Nguyễn Thái Ngọc Duy ( pclouds) próbuje dodać tę funkcję:

Jednak ponieważ jedną z zasad ponownego włączenia była:

Część katalogu w regułach ponownego włączania musi być dosłowna (tj. Bez symboli wieloznacznych)

To i tak by tu nie zadziałało.


1
Odpowiedź jest całkowicie poprawna. Ale może lepiej .gitignorebyłoby **i !**.*. Wiem, że to nie ma znaczenia, jeśli gwiazdka jest umieszczona z przodu, ale jest bardziej wyraźna i brzmi lepiej, jak muszle radzą sobie z symbolami wieloznacznymi ...
Willem Van Onsem

7
Uwaga: aby pracować z innymi regułami wykluczania, musi to być pierwszy zestaw reguł w pliku .gitignore
Erik

Możesz także ponownie uwzględnić niektóre pliki bez rozszerzeń, np !Makefile. Z rozszerzeniem . Pamiętaj, że miałem problemy z tym rozwiązaniem w Git 1.7.1, podczas gdy działało dobrze w 1.9.0. W moim przypadku dodanie pliku w katalogu głównym działało dobrze, ale dodanie pliku z rozszerzeniem w podkatalogu było wyświetlane jako ignorowane. Wydaje się, że dzieje się tak, ponieważ wersja 1.7.1 jeszcze nie obsługiwała tego **wzorca, zobacz tutaj !
mxmlnkn

1
**został dodany w Git 1.8.2. Czy jest jakaś wada w stosunku do używania !*/zamiast !/**/?
mxmlnkn

@TamaMcGlinn To wygląda jak wyrażenie regularne: gitignore nie obsługuje wyrażeń regularnych.
VonC

50
*
!*/
!*.*

* mówi gitowi, aby wszystko ignorował.

!*/następnie anuluje ignorowanie wszystkiego, co jest katalogiem. To jest kluczowe.

!*.* anuluje ignorowanie wszystkich plików z rozszerzeniem.

Bez !*/reguły katalogi bez znaku .w nazwie nie byłyby wymienione i żaden z żądanych plików nie zostałby dodany poza katalog główny.

Dla odniesienia przeczytaj te dwie sekcje w wyróżniającej się dokumentacji .gitignore :

Opcjonalny przedrostek „!” co neguje wzorzec; każdy pasujący plik wykluczony przez poprzedni wzorzec zostanie ponownie uwzględniony. Nie można ponownie dołączyć pliku, jeśli katalog nadrzędny tego pliku jest wykluczony. Git nie wyświetla wykluczonych katalogów ze względu na wydajność, więc wszelkie wzorce na zawartych plikach nie mają wpływu, bez względu na to, gdzie są zdefiniowane. Umieść ukośnik odwrotny („\”) przed pierwszym znakiem „!” dla wzorców zaczynających się od dosłownego „!”, na przykład „! ważne! .txt”.

Jeśli wzorzec kończy się ukośnikiem, jest usuwany do celów poniższego opisu, ale znalazłby tylko dopasowanie do katalogu. Innymi słowy, foo / dopasuje katalog foo i ścieżki pod nim, ale nie będzie pasował do zwykłego pliku lub dowiązania symbolicznego foo (jest to zgodne z ogólnym sposobem działania pathspec w Git).


1
Dobry chwyt. +1. Zapomniałem zaktualizować swoją odpowiedź o zasadę, której ostatnio użyłem w innych odpowiedziach w kopalniach. Odpowiednio zaktualizowałem moją odpowiedź.
VonC,

0

W moich folderach jest dużo plików z *.c, *.h, *.txt, *.csvrozszerzeniami itp. Oraz plików binarnych bez żadnego rozszerzenia. Musiałem więc zignorować wszystkie pliki execpt *.c,*.hi .gitignore, Więc to działa dla mnie, z .gitignoreprzykładu:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
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.