Nie wiem, jaki jest prawidłowy sposób ignorowania zawartości katalogu w git.
Załóżmy, że mam następującą strukturę katalogów:
my_project
|--www
|--1.txt
|--2.txt
|--.gitignore
Jaka jest różnica między umieszczeniem tego:
www
I to?
www/*
Powód, dla którego zadaję to pytanie jest następujący: w git, jeśli katalog jest pusty, git nie umieści takiego pustego katalogu w repozytorium. Próbowałem więc rozwiązania polegającego na dodaniu dodatkowego pliku .gitkeep do katalogu, aby nie był pusty. Kiedy próbowałem tego rozwiązania, jeśli w pliku .gitignore piszę jak poniżej:
www
!*.gitkeep
To nie działa (moim zamiarem jest zignorowanie całej zawartości pod www, ale utrzymanie katalogu). Ale jeśli spróbuję wykonać następujące czynności:
www/*
!*.gitkeep
Wtedy to działa! Myślę więc, że między tymi dwoma podejściami muszą być pewne różnice.
bin
ibin/
polega na tym, że pierwszy z nich ignoruje pliki lub foldery, a drugi tylko foldery. Nie znam różnicy zbin/*
Odpowiedzi:
Są tam różnice między
www
,www/
iwww/*
.Zasadniczo na podstawie dokumentacji i moich własnych testów
www
znajduję dopasowanie do pliku lub katalogu,www/
pasuje tylko do katalogu, podczas gdywww/*
pasuje do katalogów i plików w środkuwww
.Omówię tylko różnice między
www/
iwww/*
tutaj, ponieważ różnice międzywww
iwww/
są oczywiste.Ponieważ
www/
git ignorujewww
sam katalog , co oznacza, że git nawet nie zajrzy do środka. Ale w przypadkuwww/*
git sprawdza wszystkie pliki / foldery wewnątrzwww
i ignoruje je wszystkie ze wzorcem*
. To zdaje się prowadzić do tych samych rezultatów, ponieważ git nie będzie śledzić pusty folderwww
, jeżeli wszystkie jego pliki dziecko / foldery są ignorowane. I rzeczywiście, wyniki nie będą miały różnicy w przypadku OP zwww/
lub w wersjiwww/*
samodzielnej. Ale robi różnice, jeśli jest połączony z innymi zasadami.Na przykład, co zrobić, jeśli chcemy tylko uwzględnić,
www/1.txt
ale zignorować wszystkie inne elementy w środkuwww
?Poniższe
.gitignore
nie będą działać.Chociaż poniższe rozwiązania
.gitignore
działają, dlaczego?W pierwszym przypadku git po prostu ignoruje katalog
www
i nawet nie zajrzy do środka, abywww/1.txt
ponownie dołączyć . Pierwsza reguła wyklucza katalog nadrzędny,www
ale niewww/1.txt
, w wynikuwww/1.txt
czego nie można jej „ ponownie uwzględnić ”.Ale w tym drugim przypadku git najpierw ignoruje wszystkie pliki / folery poniżej
www
, a następnie ponownie dołącza jeden z nich, którym jestwww/1.txt
.W tym przykładzie pomocne mogą być następujące wiersze w dokumentacji:
źródło
www/1.txt
wtedywww/
zrobisz to samo, co drugie podejście ...Właśnie analizuję dokumentację i o ile wiem, różnią się one tylko bardziej zaawansowanymi wzorcami, np
Ja zrobiłem próbę wyżej, a jeśli zastąpi
!/foo
się!/foo/*
, to rzeczywiście uzyskać inny wynik.Uwaga
Wyklucza każdy plik
foo
, alewykluczy tylko katalogi o nazwie foo.
źródło
Oprócz doskonale dobrych odpowiedzi, które już uzyskałeś, pamiętaj, że możesz mieć
.gitignore
dowolne miejsce w swoim projekcie, w tym podfoldery.Więc jeśli chcesz, aby ignorować wszystkie pliki wewnątrz
www
, ale whantwww
folderu do wersji, zamiast korzystania pusta.gitkeep
,.dummy
czy cokolwiek nazwać wybrać, dlaczego nie używać.gitignore
tam, mówiąc, aby ignorować wszystkie pliki?W katalogu głównym
.gitignore
(a) nie mówisz nic owww
folderze ani jego zawartości.W
www/.gitignore
(b) umieszczasz:W ten sposób wszystko wygląda na bardziej uporządkowane (przynajmniej dla mnie).
źródło
Aby zignorować wszystko w katalogu z wyjątkiem dotfiles, możesz użyć następującego wzorca globalnego w swoim
.gitignore
:Więc nie ma potrzeby dodatkowego
.gitignore
, po prostu dodaj.keep
plik do swojegowww
katalogu.źródło