Jak wykluczyć plik tylko z folderu głównego w Git

399

Zdaję sobie sprawę z używania .gitignorepliku do wykluczania dodawania niektórych plików, ale mam kilka config.phpplików w drzewie źródłowym i muszę wykluczyć tylko jeden, znajdujący się w katalogu głównym, podczas gdy inne pozostają pod kontrolą wersji.

W co powinienem napisać, .gitignoreaby tak się stało?

Pavel Karoukin
źródło

Odpowiedzi:

588

Z dokumentacji :

Jeśli wzorzec nie zawiera ukośnika /, git traktuje go jako wzorzec glob powłoki i sprawdza zgodność z nazwą ścieżki względem lokalizacji pliku .gitignore (względem najwyższego poziomu drzewa roboczego, jeśli nie z .gitignore plik).

Wiodący ukośnik pasuje do początku nazwy ścieżki. Na przykład „/*.c” pasuje do „cat-file.c”, ale nie do „mozilla-sha1 / sha1.c”.

Więc powinieneś dodać następujący wiersz do swojego katalogu głównego .gitignore:

/config.php
Manoj Govindan
źródło
1
Dziękuję Ci! Próbowałem w ten sposób, ale z jakiegoś powodu nie zadziałało. Prawdopodobnie coś gdzieś źle
wpisał
1
Co jeśli nie jest to plik, ale folder, a ja chcę zignorować ten folder w katalogu głównym repo, zawarte w nim pliki oraz wszystkie potomne podfoldery i ich pliki? /folder/?
CodeManX,
11
Albo /folder/albo /folderdziałałoby, ale dodanie ukośnika na końcach ogranicza dopasowanie tylko do folderów. Gdybyś miał plik o nazwie „foo” w katalogu głównym, /foo/nie zignorowałby go, ale /foozrobiłby to.
tehDorf
Jeśli plik został już zatwierdzony, uruchom polecenie git rm --cached <file>, w przeciwnym razie plik nie zostanie zignorowany. Od: stackoverflow.com/a/1274447
Bruno Polo
83

Zastosowanie /config.php.

Richard Fearn
źródło
29

Starsze wersje git wymagają najpierw zdefiniowania wzorca ignorowania i natychmiast (w następnym wierszu) zdefiniowania wykluczenia. [testowany na wersji 1.9.3 (Apple Git-50)]

/config.php
!/*/config.php

Późniejsze wersje wymagają tylko [przetestowane w wersji 2.2.1]

/config.php
kenhowardpdx
źródło
17

Jeśli powyższe rozwiązanie nie działa, spróbuj tego:

#1.1 Do NOT ignore file pattern in  any subdirectory
!*/config.php
#1.2 ...only ignore it in the current directory
/config.php

##########################

# 2.1 Ignore file pattern everywhere
config.php
# 2.2 ...but NOT in the current directory
!/config.php
narkoman
źródło
To rzeczywiście działa dla mnie, podczas gdy /config.phpsam nie. Jestem ciekawy, dlaczego tak się nie stało. Masz pomysł?
iago-lito 'rozważa opuszczenie
@ iago-lito, jeśli pracujesz nad jakimś konkretnym projektem i zmagasz się z tym, jak zignorować jakiś plik.ext w określonym katalogu, a jednocześnie NIE ignorować go gdzie indziej, to umieść go w pliku /home/me/.gitignore: /home/me/path/to/my/project/some/folder/file.ext LUB file.ext, aby zignorować plik wszędzie, a następnie w / home / me / path / to / my / project / some / folder / Plik .gitignore umieść ten plik! file.ext, aby NIE ignorować tego pliku tylko w tym konkretnym katalogu. Każdy folder może mieć własny plik
.gitignore, który NALEŻY PRZERWAĆ
Hm Oznacza to, że repo może zachowywać się inaczej w zależności od tego, czy inni użytkownicy mają różne ~/.gitignorepliki na swoich komputerach, prawda? .. Poza tym, miałem na myśli: Napisałeś „Jeśli powyższe rozwiązanie nie działa”, dlaczego by nie?
iago-lito ”rozważa opuszczenie
tak, jeśli twój projekt może istnieć w nieznanym środowisku, nigdy nie powinieneś polegać na plikach .gitignore, które istnieją nad folderem głównym projektu. Pamiętaj, że nazwy plików, takie jak config.php, są dość powszechne, więc zastąp wszelkie możliwe ustawienia tego pliku w głównym pliku .gitignore.
Drugan