Biała lista i podkatalogi w Git

91

Stworzyłem białą listę tylko dla plików tekstowych.

*
!*.txt

Teraz mam nieśledzony plik tekstowy w podkatalogu - sub/dir/file.txti NIE jest to pokazane (jest ignorowane). Wyświetlane są jednak pliki tekstowe w katalogu głównym.

Dlaczego tak jest i jak to naprawić?

Nate
źródło
1
Związane z: stackoverflow.com/q/987142/78845
Johnsyweb
Czy pliki, które chcesz umieścić w podkatalogu? Jeśli tak, ten podkatalog może być już zignorowany przez pierwszą gwiazdkę w twoim .gitignore.
fajran
Tak. Pliki te będą miały tak niską strukturę katalogów, jak folder 11.1.102.55 w moim przykładzie. Zagnieżdżanie nie zawsze jest takie samo między folderami / produktami.
Nate
1
Wiem o tej funkcjonalności. Mamy setki katalogów. Szybciej byłoby po prostu jawnie zignorować typy plików, których nie chcemy, niż stworzyć jeden gitignore dla każdego katalogu. Naprawdę szukam sposobu na usunięcie funkcji białej listy z pliku .gitignore.
Nate,
1
Nie rozumiem, dlaczego to jest duplikat. Drugie pytanie dotyczy tego, jak dodać do białej listy określone pliki, podczas gdy to pytanie dotyczy białej listy niektórych typów plików, w tym podfolderów. Właściwie jest to raczej duplikat stackoverflow.com/questions/8024924/… .
Big McLargeHuge

Odpowiedzi:

146

Jeśli spróbujesz w ten sposób, nie powiedzie się, ponieważ w końcu trafisz na czarną listę katalogów w swojej strukturze.

Aby rozwiązać problem, chcesz umieścić na czarnej liście wszystko, co nie jest katalogiem i nie jest jednym z typów plików, które chcesz zatwierdzić, bez umieszczania na czarnej liście katalogów .

.gitignorePlik, który będzie to zrobić:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

Przetestowane w strukturze trzypoziomowej biało wystawianie dla .txtplików w obecności *.one, *.twoa *.threepliki przy użyciu .gitignoreznajdujących się w katalogu głównym repozytorium - pracuje dla mnie. Nie będziesz musiał dodawać .gitignoreplików do wszystkich katalogów w swojej strukturze.

Informacje, których użyłem do znalezienia odpowiedzi, pochodziły między innymi z tego (stackoverflow.com).

simont
źródło
18
Potrzebujesz też wpisu !.gitignore, kiedy używasz *, prawda?
sjas
2
Zobacz moją odpowiedź tutaj: stackoverflow.com/questions/987142/… Może być bardziej przydatne użycie /*do czarnej listy tylko folderu najwyższego poziomu, ale nie wszystkich folderów rekurencyjnie, co w rzeczywistości oznacza, .gitignoreże nie należy zaglądać do podfolderów umieszczonych na białej liście.
Ryan Taylor
2

Prostszym sposobem osiągnięcia tego jest:

# Ignore all files...
*.*

# ...except the ones we want
!*.txt

To działa, ponieważ gitignorestosuje wzorce, które nie zaczynają się od, /na każdym poziomie poniżej .gitignorepliku:

Jeśli na początku lub w środku (lub na obu) wzorcu znajduje się separator, wówczas wzorzec jest określany względem poziomu katalogu samego pliku .gitignore. W przeciwnym razie wzorzec może również pasować na dowolnym poziomie poniżej poziomu .gitignore.

Jeśli chcesz to zrobić z plikami w katalogu , sprawy stają się bardziej złożone:

# Ignore all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

To działa, ponieważ gitignorema specjalne zasady dotyczące **:

Dwie kolejne gwiazdki („ **”) we wzorcach dopasowanych do pełnej nazwy ścieżki mogą mieć specjalne znaczenie:

  • Ukośnik, po którym następują dwie kolejne gwiazdki, a następnie ukośnik oznacza zero lub więcej katalogów. Na przykład a/**/b„pasuje” a/b, „ a/x/b”, „ a/x/y/b” i tak dalej.

Kluczową kwestią jest upewnienie się, że nie ignorujesz katalogów, ponieważ wtedy każdy plik w tym katalogu jest ignorowany niezależnie od innych reguł.

Sharadh
źródło
0

Długo szukałem:

  1. Załóżmy, że mam dużą strukturę folderów z ~ 100 000 katalogami zagnieżdżonymi rekurencyjnie. W tych folderach jest około 30 000 plików typu .txt(w moim przypadku: type *.md). Obok tych *.mdplików jest, powiedzmy, 500 GB (ponad milion) plików, których nie chcę śledzić.

  2. Chcę, aby git śledził tylko .txt(lub *.md) pliki we wszystkich folderach i podkatalogach.

Prawidłowa odpowiedź powinna brzmieć: w Git nie jest to możliwe.

Co zamiast tego zrobiłem:

[edit: też nie działa - próbowałem stworzyć folder z dowiązaniami symbolicznymi (lub dowiązaniami twardymi) i użyć tam git, ale git nie podąża za dowiązaniami symbolicznymi i nadpisuje dowiązania stałe. No!]

Alex
źródło