Prawidłowo zignoruj ​​rekursywnie wszystkie pliki w określonym folderze z wyjątkiem określonego typu plików

89

Widziałem podobne pytania ( 1 , 2 i 3 ), ale nie otrzymałem od nich właściwego rozwiązania.

Muszę zignorować wszystkie pliki w określonym folderze z wyjątkiem określonego typu pliku. Folder jest podkatalogiem dla ścieżki głównej. Nazwijmy folder Resources. Ponieważ nie chcę komplikować sprawy, pozwól mi zignorować pliki we wszystkich folderach o nazwach, Resourcesgdziekolwiek się one znajdują.

To jest najczęstsze rozwiązanie (we wszystkich zduplikowanych pytaniach)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

Problem z tym rozwiązaniem polega na tym, że przestaje śledzić nowo dodane pliki (ponieważ *ignoruje wszystkie pliki). Nie chcę ciągle wykluczać każdego typu pliku. Chcę normalnego zachowania, w którym jeśli dodany zostanie nowy plik, git statuspokaże go.

W końcu znalazłem tutaj rozwiązanie . Rozwiązaniem jest dodanie kolejnego .gitignorepliku w Resourcesfolderze. Działa to poprawnie.

Czy mogę osiągnąć to samo z jednym ignorowanym plikiem? Uważam, że posiadanie wielu ignorowanych plików w różnych katalogach jest nieco niezgrabne.

Oto, co staram się osiągnąć:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Ale to daje odwrotny wynik. Ignoruje *.footypy i śledzi inne pliki.

nawfal
źródło

Odpowiedzi:

108

@SimonBuchan ma rację.

Od wersji git 1.8.2 Resources/** !Resources/**/*.foodziała.

Jim G.
źródło
1
To działa dla mnie, drobne poprawki, po prostu muszę usunąć katalogi i wszystko poniżej, więc zrobiłem: DirectoryName1/** DirectoryName1/**/*dla każdego z nich. Najpierw usuwasz katalogi, ale potrzebujesz drugiej, aby usunąć wszystkie typy plików.
Scala Enthusiast
27

Najlepszą odpowiedzią jest dodanie pliku Resources / .gitignore w sekcji Resources zawierającej:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

Jeśli nie chcesz lub nie możesz dodać tego pliku .gitignore, istnieje nieeleganckie rozwiązanie:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Będziesz musiał edytować ten wzorzec, jeśli dodasz katalogi głębiej niż określono.

Ben Martin
źródło
2
To smutne .. Rzeczywiście będę miał głębsze katalogi, więc zostanę przy pierwszym :(
nawfal
Zobacz więcej szczegółów na temat tego samego rozwiązania tutaj: stackoverflow.com/questions/7803689/… - również link powyżej przez OP @nawfal
tutaj
7

Może to wyglądać głupio, ale sprawdź, czy wcześniej nie dodałeś folderu / plików, które próbujesz zignorować do indeksu. Jeśli tak, nie ma znaczenia, co umieścisz w swoim pliku .gitignore, foldery / pliki nadal będą przemieszczane.

Tiago
źródło
5
Jeśli ktoś napotka ten konkretny przypadek użycia, możesz użyć go, git rm --cached <path to files>aby usunąć te ignorowane pliki z gita, pozostawiając je w systemie plików.
slothluvchunk
5

Albo robię to źle, albo zaakceptowana odpowiedź nie działa już z obecnym gitem.

I rzeczywiście znaleźć odpowiednie rozwiązanie i zamieścił je na prawie to samo pytanie tutaj . Więcej szczegółów znajdziesz tam.

Rozwiązanie:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo
Aleksander Stelmaczonek
źródło
2
Tak, to działa dla mnie. Dodanie the !/Resources/**/było kluczowe, aby git nie ignorował podkatalogów.
Johnster