Jaka jest właściwa składnia .gitignore
pliku do ignorowania plików w katalogu?
Czy może być
config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*
lub
/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*
?
.gitignore
rozróżnia pliki i katalogi, które ignoruje? na przykład, czydata
vsdata/
oznacza różne rzeczy?data
zignoruje pasujące pliki i katalogi,data/
zignoruje tylko pasujące katalogi.Odpowiedzi:
FORMAT WZORU
Pusty wiersz nie pasuje do żadnych plików, więc może służyć jako separator dla czytelności.
Linia rozpoczynająca się od
#
służy jako komentarz.Opcjonalny przedrostek,
!
który neguje wzór; każdy pasujący plik wykluczony przez poprzedni wzór zostanie ponownie dołączony. Jeśli negowany wzorzec pasuje, zastąpi to źródła wzorców o niższym priorytecie.Jeśli wzorzec kończy się ukośnikiem, jest usuwany na potrzeby poniższego opisu, ale znajdzie dopasowanie tylko z katalogiem. Innymi słowy,
foo/
dopasuje katalogfoo
i ścieżki pod nim, ale nie będzie pasował do zwykłego pliku lub dowiązania symbolicznegofoo
(jest to zgodne ze sposobem, w jaki ogólnie działa pathspec).Jeśli wzorzec nie zawiera ukośnika
/
, git traktuje go jako wzorzec globu powłoki i sprawdza zgodność z nazwą ścieżki względem lokalizacji.gitignore
pliku (względem najwyższego poziomu drzewa roboczego, jeśli nie z.gitignore
pliku).W przeciwnym razie, Git traktuje wzorca jako glob powłoki odpowiedniej do spożycia przez
fnmatch(3)
zFNM_PATHNAME
flagą: dzikie karty we wzorcu nie dopasuje/
się do ścieżki. Na przykładDocumentation/*.html
pasuje,Documentation/git.html
ale nieDocumentation/ppc/ppc.html
lubtools/perf/Documentation/perf.html
.Wiodący ukośnik pasuje do początku nazwy ścieżki. Na przykład
/*.c
pasuje,cat-file.c
ale nie pasujemozilla-sha1/sha1.c
.Możesz znaleźć więcej tutaj
git help gitignore
lub
man gitignore
źródło
man
strony lub oficjalnego dokumentu to najlepszy format dla SO ...To byłby pierwszy. Przejdź także według rozszerzeń zamiast struktury folderów.
Tj. Mój przykład C # plik ignorowania rozwoju:
Aktualizacja
Myślałem, że przedstawię aktualizację z poniższych komentarzy. Chociaż nie odpowiada bezpośrednio na pytanie PO, zobacz następujące przykłady
.gitignore
składni.Wiki społeczności (stale aktualizowane):
.gitignore dla projektów i rozwiązań Visual Studio
Więcej przykładów z użyciem określonego języka można znaleźć tutaj (dzięki komentarzowi Chrisa McKnighta):
https://github.com/github/gitignore
źródło
range
. Więc pasuje*.Obj
tak samo jak*.obj
.Ścieżki zawierające ukośniki są uznawane za względne w stosunku do katalogu zawierającego plik .gitignore - zwykle najwyższy poziom repozytorium, chociaż można je również umieścić w podkatalogach.
Ponieważ we wszystkich podanych przykładach ścieżki zawierają ukośniki, obie wersje są identyczne. Jedyny raz, kiedy potrzebujesz umieścić wiodący ukośnik, jest to, że nie ma go jeszcze na ścieżce. Na przykład, aby zignorować foo tylko na najwyższym poziomie repozytorium, użyj
/foo
. Zwykłe pisaniefoo
zignorowałoby wszystko, co nazywa się foo, w dowolnym miejscu w repozytorium.Twoje symbole wieloznaczne są również zbędne. Jeśli chcesz zignorować cały katalog, po prostu nazwij go:
Jedynym powodem używania symboli wieloznacznych tak, jak masz, jest zamiar późniejszego zignorowania czegoś w katalogu:
źródło
Wiodący ukośnik wskazuje, że wpis ignorowania może być poprawny tylko w odniesieniu do katalogu, w którym znajduje się plik .gitignore. Określenie
*.o
zignoruje wszystkie pliki .o w tym katalogu i wszystkich podkatalogach, a/*.o
po prostu zignoruje je w tym katalogu , a ponownie/foo/*.o
zignoruje je tylko w /foo/*.o.źródło
Jeśli chcesz umieścić plik .gitignore na najwyższym poziomie i sprawić, aby działał dla dowolnego folderu poniżej, użyj go
/**/
.Np. Aby zignorować wszystkie
*.map
pliki w/src/main/
folderze i podfolderach użyj:źródło
**
. Jeden mi wystarczył.Oba przykłady w pytaniu są w rzeczywistości bardzo złymi przykładami, które mogą prowadzić do utraty danych!
Moja rada: nigdy nie dołączaj
/*
do katalogów w plikach .gitignore, chyba że masz dobry powód!Dobrym powodem byłoby na przykład to, co napisał Jefromi: „jeśli zamierzasz później zignorować coś w katalogu” .
Powodem, dla którego inaczej nie należy tego robić, jest to, że dołączanie
/*
do katalogów z jednej strony działa w taki sposób, że właściwie ignoruje całą zawartość katalogu, ale z drugiej strony ma niebezpieczny efekt uboczny:Jeśli wykonasz
git stash -u
(aby tymczasowo ukryć śledzone i nieśledzone pliki) lubgit clean -df
(aby usunąć nieśledzone, ale zachowaj zignorowane pliki) w swoim repozytorium, wszystkie katalogi, które zostaną zignorowane za pomocą dołączonego,/*
zostaną nieodwracalnie usunięte !Trochę tła
Musiałem się tego nauczyć na własnej skórze. Ktoś z mojego zespołu dołączał
/*
do niektórych katalogów w naszym .gitignore. Z czasem miałem okazje, aby niektóre katalogi nagle zniknęły. Katalogi z gigabajtami danych lokalnych wymaganych przez naszą aplikację. Nikt nie mógł tego wyjaśnić i zawsze nie mogę ponownie pobrać wszystkich danych. Po chwili zrozumiałem, że może to mieć związek z tymgit stash
. Pewnego dnia chciałem wyczyścić moje lokalne repozytorium (zachowując zignorowane pliki) i używałemgit clean -df
i znowu moje dane zniknęły. Tym razem miałem dość i zbadałem problem. W końcu doszedłem do wniosku, że przyczyną jest dołączony dodatek/*
.Zakładam, że można to jakoś wyjaśnić faktem, że
directory/*
ignoruje całą zawartość katalogu, ale nie sam katalog. Dlatego nie jest uważane za śledzone ani ignorowane, gdy rzeczy są usuwane. Chociażgit status
igit status --ignored
dać nieco inny obraz na nim.Jak się rozmnażać
Oto jak odtworzyć zachowanie. Obecnie używam Git 2.8.4.
Katalog wywoływany
localdata/
z fikcyjnym plikiem (important.dat
) zostanie utworzony w lokalnym repozytorium git, a zawartość zostanie zignorowana przez umieszczenie/localdata/*
w.gitignore
pliku. Kiedy jedno z dwóch wymienionych poleceń git zostanie teraz wykonane, katalog zostanie (nieoczekiwanie) utracony.Jeśli to zrobisz
git status --ignored
, otrzymasz:Teraz albo zrób
lub
W obu przypadkach rzekomo zignorowany katalog
localdata
zniknie!Nie jestem pewien, czy można to uznać za błąd, ale myślę, że jest to przynajmniej funkcja, której nikt nie potrzebuje.
Zgłoszę to na listę deweloperów git i zobaczę, co o tym myślą.
źródło
To byłby:
a może nawet:
w przypadku,
filter
iform
są jedynymi katalogi w lib że mambase
podkatalog, który musi być ignorowane (zobacz go jako przykład tego, co można zrobić z asterics).źródło
Pierwszy. Te ścieżki do plików są względne względem miejsca, w którym znajduje się plik .gitignore.
źródło
Utrzymuję usługę opartą na GUI i CLI, która pozwala
.gitignore
bardzo łatwo generować szablony na https://www.gitignore.io .Możesz wpisać odpowiednie szablony w polu wyszukiwania lub zainstalować alias wiersza polecenia i uruchomić
$ gi swift,osx
źródło
Przykładowy plik .gitignore może wyglądać jak poniżej dla projektu Android Studio
źródło