Jaka jest różnica między ignorowaniem katalogu przez Git a katalogiem / *?

108

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.

Aaron Shen
źródło
Prosta różnica między bini bin/polega na tym, że pierwszy z nich ignoruje pliki lub foldery, a drugi tylko foldery. Nie znam różnicy zbin/*
Colonel Panic

Odpowiedzi:

203

Są tam różnice między www, www/i www/*.

Zasadniczo na podstawie dokumentacji i moich własnych testów wwwznajduję dopasowanie do pliku lub katalogu, www/pasuje tylko do katalogu, podczas gdy www/*pasuje do katalogów i plików w środku www.

Omówię tylko różnice między www/i www/*tutaj, ponieważ różnice między wwwi www/są oczywiste.

Ponieważ www/git ignoruje wwwsam katalog , co oznacza, że ​​git nawet nie zajrzy do środka. Ale w przypadku www/*git sprawdza wszystkie pliki / foldery wewnątrz wwwi ignoruje je wszystkie ze wzorcem *. To zdaje się prowadzić do tych samych rezultatów, ponieważ git nie będzie śledzić pusty folder www, jeżeli wszystkie jego pliki dziecko / foldery są ignorowane. I rzeczywiście, wyniki nie będą miały różnicy w przypadku OP z www/lub w wersji www/*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.txtale zignorować wszystkie inne elementy w środku www?

Poniższe .gitignorenie będą działać.

www/
!www/1.txt

Chociaż poniższe rozwiązania .gitignoredziałają, dlaczego?

www/*
!www/1.txt

W pierwszym przypadku git po prostu ignoruje katalog wwwi nawet nie zajrzy do środka, aby www/1.txtponownie dołączyć . Pierwsza reguła wyklucza katalog nadrzędny, wwwale nie www/1.txt, w wyniku www/1.txtczego 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 jest www/1.txt.

W tym przykładzie pomocne mogą być następujące wiersze w dokumentacji:

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.

Landys
źródło
Nie sądzisz, że www/1.txtwtedy www/zrobisz to samo, co drugie podejście ...
Naveed Butt
8

Właśnie analizuję dokumentację i o ile wiem, różnią się one tylko bardziej zaawansowanymi wzorcami, np

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

Ja zrobiłem próbę wyżej, a jeśli zastąpi !/foosię !/foo/*, to rzeczywiście uzyskać inny wynik.

Uwaga

foo

Wyklucza każdy plik foo, ale

foo/

wykluczy tylko katalogi o nazwie foo.

djechlin
źródło
3

Oprócz doskonale dobrych odpowiedzi, które już uzyskałeś, pamiętaj, że możesz mieć .gitignoredowolne miejsce w swoim projekcie, w tym podfoldery.

Więc jeśli chcesz, aby ignorować wszystkie pliki wewnątrz www, ale whant wwwfolderu do wersji, zamiast korzystania pusta .gitkeep, .dummyczy cokolwiek nazwać wybrać, dlaczego nie używać .gitignoretam, mówiąc, aby ignorować wszystkie pliki?

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

W katalogu głównym .gitignore(a) nie mówisz nic o wwwfolderze ani jego zawartości.

W www/.gitignore(b) umieszczasz:

# ignore all files in this folder except this .gitignore
*
!.gitignore

W ten sposób wszystko wygląda na bardziej uporządkowane (przynajmniej dla mnie).

Carlos Campderrós
źródło
1

Aby zignorować wszystko w katalogu z wyjątkiem dotfiles, możesz użyć następującego wzorca globalnego w swoim .gitignore:

www/[^.]*

Więc nie ma potrzeby dodatkowego .gitignore, po prostu dodaj .keepplik do swojego wwwkatalogu.

Koen.
źródło