Jaka jest różnica między dodaniem bin
, bin/
, bin/*
a bin/**
w moim pliku .gitignore? Używałem bin/
, ale patrząc na inne pliki .gitignore (w pliku zaćmień podwójna i pojedyncza gwiazda są nawet używane razem w ten sposób: o tmp/**/*
co w tym chodzi?) Widzę, że pierwsze dwa wzorce są również szeroko używane. Czy ktoś mógłby wyjaśnić różnice między tymi trzema?
89
**
: stackoverflow.com/questions/1470572/…Odpowiedzi:
bin
dopasowuje wszystkie pliki lub katalogi o nazwie „bin”.bin/
dopasowuje wszystkie katalogi o nazwie „bin”, co w efekcie oznacza całą jego zawartość, ponieważ Git nie śledzi samych katalogów.bin/*
dopasowuje wszystkie pliki i katalogi bezpośrednio w dowolnymbin/
. Zapobiega to automatycznemu znajdowaniu przez Git jakichkolwiek plików w jego podkatalogach, ale jeśli, powiedzmy,bin/foo
utworzony zostanie podkatalog, ta reguła nie będzie pasowaćfoo
do zawartości.bin/**
dopasowuje wszystkie pliki i katalogi w dowolnymbin/
katalogu i wszystkich jego podkatalogach.Słowo „any” jest tutaj krytyczne, ponieważ reguły nie odnoszą się do katalogu głównego repozytorium i nie mają zastosowania dowolnym miejscu w drzewie systemu plików. Musisz zacząć reguły od
/
(lub!/
cofnąć ignorowanie), co oznacza katalog główny repozytorium, a nie katalog główny systemu, aby dopasować tylko to, co było zamierzone.OSTRZEŻENIE: Nigdy nie powinieneś używać samych reguł, takich jak
dir/*
,/dir/**
itd., Chyba że usuniesz ignorowanie czegoś, co istnieje w tym katalogu . Pomija gwiazdka lub można trwale stracić dużo danych z pewnych wywołańgit gc
,git stash
i więcej.Naprawdę nie wiem, co
tmp/**/*
mam zrobić. Początkowo myślałem, że można go użyć do dopasowania plików w podkatalogach,tmp/
ale nie plików bezpośrednio obecnych wtmp/
sobie. Ale prosty test wydaje się sugerować, że ignoruje to wszystkie pliki wtmp/
.źródło
bin/
ibin/**
?bin/
że zignoruje katalog bin, podczas gdybin/**
będzie zawierał katalog bin, ale nie zawiera żadnej z jego zawartościbin/
zignoruje sam katalog (w tym wszystkie podkatalogi i pliki), podczas gdybin/**
zignoruje wszystkie pliki w katalogu bin i jego podkatalogach, ale nie sam katalog bin. Nie jestem pewien, czy to prawda.bin/** \n !bin/*
(ponieważ nie widzę, jak wymusićbin
dopasowuje zarówno plik o nazwie, jakbin
i zawartośćbin
folderu. Po trzecie,bin/*
nie pasuje do żadnych plików w swoich podkatalogach. Czy w ogóle to przetestowaliście?bin
ibin/
różnią się tylko tym, że ten ostatni będzie pasował tylko do katalogu.bin/**/*
jest taki sam jakbin/**
(najwyraźniej od 1.8.2, zgodnie z odpowiedzią @ VonC).Trudne jeden, że ja właśnie spędziliśmy godzinę albo tak zgrywania moich włosów na to, że
bin/
ibin/**
nie są zupełnie takie same! Ponieważ wcześniejszy ignoruje katalog jako całość, a drugi ignoruje każdy z plików w nim zawartych, a git w prawie wszystkich przypadkach nie dba o katalogi, zwykle nie ma różnicy. Jeśli jednak spróbujesz użyć!
do cofnięcia ignorowania ścieżki podrzędnej, zauważysz, że git (ahem) zignoruje ją, jeśli zignorowałeś katalog nadrzędny! (znowu zamiast zawartości katalogu)Jest to najlepiej widoczne na przykładzie, więc dla nowo zainicjowanego repozytorium skonfiguruj:
Istnieją następujące nieśledzone pliki:
Ale możesz zobaczyć, że następujące pliki nie są ignorowane:
A jeśli spróbujesz dodać, otrzymasz:
Uważam to zachowanie za błąd. (To wszystko jest włączone
git version 1.8.4.msysgit.0
)źródło
dir/
idir/**
ponownie. cofnięcie ignorowania z!
ma miejsce, ponieważ „Nie można ponownie dołączyć pliku, jeśli katalog nadrzędny tego pliku jest wykluczony” [źródło ]. Mylące, ale zrobione ze względu na wydajność. Zobacz powiązane pytanie SO .Zauważ, że ściśle rzecz biorąc, git nie śledzi katalogów, tylko pliki. Dlatego nie jest możliwe dodanie katalogu, tylko jego zawartość .
Jednak w kontekście
.gitignore
git udaje, że rozumie katalogi tylko z tego powoduCo to oznacza dla wzorców wykluczania? Przyjrzyjmy się im szczegółowo:
bin
To ignoruje
bin
.bin
Możesz umieścić na białej liście ignorowane
bin
pliki i foldery, dodając kolejne!
wpisy, ale nie możesz dodać do białej listy zawartości folderów o nazwachbin
bin/
Tak samo jak powyżej, z tą różnicą, że nie pasuje do plików o nazwie
bin
. Dodanie końca/
mówi gitowi, aby dopasował tylko katalogi.bin/*
To ignoruje
bin
bin
bin/**
To ignoruje
bin
bin
źródło
Właśnie utworzyłem nowe repozytorium i wypróbowałem kilka rzeczy. Oto moje wyniki:
NOWE WYNIKI
git w wersji 2.10.1. windows.1
bin
katalog na kilka warstwbin.txt
Test.txt
bin/a/b/bin.txt
bin/a/b/Test.txt
bin/a/bin/bin.txt
bin/a/bin/Test.txt
bin/a/bin.txt
bin/a/Test.txt
bin/bin.txt
bin/Test.txt
bin
do gitignore: Wynikibin
katalogu (i głębiej) jest teraz ignorowanebin
abybin/
w gitignore: Wynikibin/
dobin/*
bin/*
dobin/**
bin/**
dobin/**/
bin/bin.txt
ibin/Test.txt
nie są już ignorowanebin/**/
dobin/**/*
bin/bin.txt
ibin/Test.txt
znów są ignorowaniSTARE WYNIKI
wersja git: 2.7.0.windows.1
bin
katalog na kilka warstwbin/a/b/Test.txt
bin/a/bin/Test.txt
bin/a/Test.txt
bin/Test.txt
bin
do gitignore: Wynikibin
katalogu (i głębiej) jest teraz ignorowanebin
abybin/
w gitignore: Wynikibin
katalogu (i głębiej) jest nadal ignorowane (bez zmian)bin/
dobin/*
bin
katalogu (i głębiej) jest nadal ignorowane (bez zmian)bin/*
dobin/**
bin
katalogu (i głębiej) jest nadal ignorowane (bez zmian)bin/**
dobin/**/
bin/Test.txt
nie jest już ignorowanybin/**/
dobin/**/*
bin
katalogu (i głębiej) jest ponownie ignorowaneźródło
Zauważ, że '
**
', w połączeniu z podkatalogiem (**/bar
), musiało zmienić swoje domyślne zachowanie, ponieważ informacja o wydaniu dla git1.8.2 teraz wspomina:Reguła do zapamiętania (i która pomaga zrozumieć różnicę intencji kryjącą się za tą składnią) to:
Nie można ponownie dołączyć pliku, jeśli katalog nadrzędny tego pliku jest wykluczony.
Zwykle, jeśli chcesz wykluczyć pliki z podfolderu ignorowanego folderu f, wykonaj następujące czynności:
To jest:
f/
, folderf/
zostałby zignorowany, a poniższe regułyf
nie miałyby znaczenia.f/**
osiągnąć to samof/
, ale zignorować wszystkie elementy podrzędne (pliki i podfoldery).Który daje możliwość whitelist (wyłączenia z gitignore) podfoldery:
!f/**/
.f
podfoldery nie są ignorowane, możesz dodać regułę wykluczającą plik (!f/a/sub/folder/someFile.txt
)źródło
Istnieje inna różnica między
bin/*
ibin/
.bin/
pasujefoo/bin/test.txt
(zgodnie z oczekiwaniami), alebin/*
nie, co wydaje się dziwne, ale jest udokumentowane: https://git-scm.com/docs/gitignoreWydaje się, że powodem tego są następujące zasady:
Więc jeśli wzorzec kończy się ukośnikiem, ukośnik jest usuwany i traktowany jako wzorzec globu powłoki, w którym to przypadku
bin
pasujefoo/bin/test.txt
. Jeśli kończy się na/*
, ukośnik nie jest usuwany i jest przekazywany do fnmatch, co nie pasuje do podkatalogów.Jednak to samo nie dotyczy
foo/bin/
ifoo/bin/*
, ponieważ nawet po usunięciu końcowego ukośnika zfoo/bin/
nadal zawiera ukośnik, więc jest traktowany jako wzorzec dopasowania fn, a nie glob. To znaczy nie będzie pasowaćbar/foo/bin/test.txt
źródło