Pytanie w sprawie gitignore, git – gitignore wszystkie pliki rozszerzenia w katalogu

140

Czy istnieje sposób na zignorowanie wszystkich plików danego typu w katalogu?

** najwyraźniej nie ma sensu gitować, więc to nie działa:

/public/static/**/*.js

Pomysł polega na dopasowaniu dowolnych zagnieżdżonych folderów.

Twoja odpowiedź

5   odpowiedzi
2

że najprostszym rozwiązaniem byłoby użyciefind. Nie lubię mieć wielu.gitignore kręcę się w podkatalogach i wolę zarządzać unikalnym, najwyższym poziomem.gitignore. Aby to zrobić, możesz po prostu dołączyć znalezione pliki do swojego.gitignore. Przypuśćmy, że tak/public/static/ to twój projekt / git home, którego użyłbym:

find . -type f -name *.js | cut -c 3- >> .gitignore

Odkryłem, że wycinanie./ na początku jest często konieczne, aby git zrozumiał, których plików należy unikać. Dlatego teżcut -c 3-.

164

** składnia jest obsługiwana przezgit od wersji1.8.2.1 wedługdokumentacja.

Dwie kolejne gwiazdki („**„) w wzorach dopasowanych do pełnej ścieżki może mieć specjalne znaczenie:

Wiodący "**„a po nim ukośnik oznacza dopasowanie we wszystkich katalogach. Na przykład„**/foo„pasuje do pliku lub katalogu”foo„wszędzie, tak samo jak wzór”foo„.”**/foo/bar„pasuje do pliku lub katalogu”bar„gdziekolwiek jest bezpośrednio pod katalogiem”foo

Ciągnięcie ”/**„pasuje do wszystkiego w środku. Na przykład”abc/**„dopasowuje wszystkie pliki w katalogu”abc„, w stosunku do lokalizacji.gitignore plik z nieskończoną głębokością.

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

Inne kolejne gwiazdki są uważane za nieprawidłowe.

„Inne kolejne gwiazdki są uważane za nieprawidłowe”. podsumowuje wszystko imrok
Wszystkie pliki z końcówką .meta powinny być ignorowane przez git. Jak to działa?**.js ? Black
jaka jest różnica pomiędzyxxx/** ixxx/? thuzhf
xxx/** kieruje wszystkie pliki i katalogi wewnątrzxxx natomiastxxx/ celuje wxxx katalog bezpośrednio. To naprawdę ma znaczenie tylko przy negowaniu wzorców! jako „Nie można ponownie dołączyć pliku, jeśli wykluczony jest katalog nadrzędny tego pliku.”, więc używającxxx/* lubxxx/** byłoby w tym przypadku konieczne. joeyhoer
61

@ Odpowiedź Joey'a: Git obsługuje teraz** składnia we wzorach. Oba podejścia powinny działać dobrze.

Thestrona podręcznika gitignore (5) stwierdza:

Wzory odczytywane z pliku .gitignore w tym samym katalogu co ścieżka lub w dowolnym katalogu nadrzędnym, z wzorami w plikach wyższego poziomu (do najwyższego poziomu drzewa roboczego) są nadpisywane przez te w plikach niższego poziomu do katalogu zawierający plik.

Oznacza to, że wzory w.gitignore wpłynie na plik w dowolnym katalogu repoten katalog iwszystkie podkatalogi.

Wzór, który podałeś

/public/static/**/*.js

nie jest w porządku, po pierwsze dlatego, że (jak słusznie zauważyłeś)** Git nie używa składni. Również wiodący/ zakotwicza ten wzorzec na początku nazwy ścieżki. (Więc,/public/static/*.js pasuje/public/static/foo.js alenie /public/static/foo/bar.js.)Usuwanie prowadzącego/ nie zadziała, pasujące ścieżki jakpublic/static/foo.js ifoo/public/static/bar.js. EDYCJA: Samo usunięcie wiodącego ukośnika również nie zadziała - ponieważ wzorzec nadal zawiera ukośnik, jest traktowany przez Gita jako zwykły, nierekurencyjny glob powłoki (dzięki@ Joey Hoer za wskazanie tego).

Jak sugerował @ptyx, musisz utworzyć plik<repo>/public/static/.gitignore i włącz tylko ten wzór:

*.js

Nie ma prowadzenia/, więc będzie pasować do dowolnej części ścieżki, a ten wzór będzie stosowany tylko do plików w/public/static katalog i jego podkatalogi.

@JoeyHoer dzięki wskazówkom, odpowiednio zaktualizowałem swoją odpowiedź. Adam Sharp
Nie jest to do końca prawda - szczególnie część „Usuwanie wiodącego/ nie zadziała, pasujące ścieżki jakpublic/static/foo.js ifoo/public/static/bar.js. ”jest fałszywe. Cytowaćdokumentacja „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 pliku .gitignore (względem najwyższego poziomu drzewa roboczego, jeśli nie pochodzi z a.). plik gitignore). "foo/public/static/bar.js nie pasowałoby, ponieważ wzorzec zawiera/. joeyhoer
94

git help ignore sugeruje, że jeśli umieścisz.gitignore z*.js w/public/static, zrobi to, co chcesz.

Uwaga: sprawdź również odpowiedź Joeysa poniżej: jeśli chcesz zignorować pliki w określonym podkatalogu, właściwym rozwiązaniem jest lokalny plik .gitignore (lokalność jest dobra). Jeśli jednak chcesz zastosować ten sam wzór do całego repo, to rozwiązanie ** jest lepsze.

@haren to nie jedyne rozwiązanie - odpowiedź Joey'a jest z pewnością ważna. Wybierz to, co działa najlepiej dla ciebie. Uważam, że ignorowanie reguł lokalnych w katalogu powinno być w tym katalogu, a reguły globalne powinny być globalne. (Również ta odpowiedź jest starożytna i nie sądzę, by w tamtym czasie ** była obsługiwana). ptyx
To nie jest najlepsze rozwiązanie. Potencjalnie ludzie będą musieli przekopywać się przez różne pliki .gitignore, aby dowiedzieć się, dlaczego ich plik jest ignorowany. Niektórzy wolą mieć wszystkie te informacje w jednym pliku .gitignore przechowywanym w katalogu głównym repo. haren
9

po prostu przejdź do .git / info / exclude. Wyklucz to plik z listą ignorowanych rozszerzeń lub plików.

Nie przeniesie to do innych klonów repozytorium, takich jak .gitignore (po zatwierdzeniu oczywiście). jpmc26

Powiązane pytania