Powiedzmy, że zignorowałem katalog, ale chcę zignorować określone w nim podkatalogi. Więc mam konfigurację:
/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/
Chcę zignorować wszystko oprócz KEEP_ME
katalogu. Mam nadzieję, że ignorowanie będzie wyglądało mniej więcej tak:
/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/
Ale to nie działa, podobnie jak kilka permutacji na ten sam temat.
Jeden, który działa, jest
/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/
Ale to trochę restrykcyjne i rozwlekłe?
Odpowiedzi:
Zgodnie z sekcją dotyczącą formatu wzorca w dokumentacji gitignore :
Dlatego poprzednio wykluczony
/uploads/rubbish/stuff/keep/
wzorzec katalogu nadrzędnego musi zostać całkowicie zanegowany przed zanegowaniem jego zawartości:Aby uwzględnić podkatalogi wewnątrz,
/uploads/rubbish/stuff/keep/
dodaj trzecią linię:źródło
.gitignore
i działa świetnie !:!*.zip
Nawet jeśli coś dodasz do
.gitignore
, możesz zmusić git do dodania tego do indeksuJednak "KEEP_ME" wydaje się być katalogiem, a git zwykle nie lubi pustego folderu, więc możesz zamiast tego dodać plik zastępczy, jeśli folder jest pusty
źródło
git add --force
dla każdego nowego elementu lub folderu wKEEP_ME
. ale potem aktualizacje są po prostu dodawane (git add -u
na przykład podczas wykonywania ), tak jakby pliki były „niezignorowane”..keep_me
Nic nie robi, jej tylko dlatego, że plik git działa na folderze.git add --force
jest złym rozwiązaniem. Jeśli przeniesiesz katalog dookoła lub przeniesiesz plik do innego katalogu, śledzenie git usunie plik, ale nie doda go do nowej lokalizacji i musisz to zrobićgit add --force
ponownie. usuwając zignorowanie na ogólnym wzorcu, git będzie śledzić ruch pliku w repozytorium.Próbowałem dowiedzieć się, jak uwzględnić określony folder, wykluczając wszystkie foldery z ogólnym wykluczeniem
jeśli dodasz na
/*
końcu wykluczenia ogólnego, nadal będziesz wykluczać wszystkie pliki kompilacji**/build/*
Następnie dodajesz kolejną linię, aby poprawić wygląd ścieżki, którą chcesz dołączyć
zostawiając nam gitignore, który brzmi
źródło
Odpowiedzi Buo-Ren Lin i Johna są całkiem pomocne, ale musiałem połączyć obie.
Chcąc wykluczyć inne podfoldery, a także pliki w przesyłanych plikach, stwierdziłem, że konieczne jest jawne określenie dowolnych katalogów przed danym folderem, zarówno podczas wykluczania folderu, jak i podczas włączania podfolderu
Zauważyłem również, że konieczne jest wyraźne ponowne uwzględnienie zarówno podfolderu, jak i jego zawartości, aby wyświetlić zarówno elementy w folderze, jak i podfoldery.
źródło
Rozwiązanie przedstawiane jako odpowiedź, która uzyskała najwięcej głosów, jest niepoprawne i jako takie łatwe do udowodnienia.
Zacznij od ignorowania wszystkiego w przesyłanych plikach / *:
Teraz zignoruj katalog nadrzędny ignorowanych rzeczy, jak powyżej:
Pokazuje nieśledzone pliki.
Aby to działało, musisz zignorować wszystkie pliki w
uploads/
drzewie (uploads/**/*
nie tylko najwyższy poziomuploads/*
), a następnie dodać wszystkie katalogi nadrzędne drzewa, które chcesz zachowaćCo daje:
Gdybyśmy wykorzystywane
uploads/*
w.gitignore
powyżej, a następnie wszystkie pliki pośrednie zostałyby uwzględnione, tak więc na przykładuploads/rubbish/a
by pokazać się w komendzie stanu powyżej.źródło