Jak rekurencyjnie zapisywać pliki .gitignore

106

Próbuję uniknąć następującego wzorca w moim .gitignorepliku.

MyPrject/WebApp/Scripts/special/*.js
MyPrject/WebApp/Scripts/special/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*/*.js

Próbowaliśmy:

MyPrject/WebApp/Scripts/special/**.js
MyPrject/WebApp/Scripts/special/**/*.js

To jednak nie zadziałało. To jest git w systemie Windows. Czy istnieje bardziej zwięzły sposób na zrobienie tego bez powtarzania rzeczy?

orad
źródło

Odpowiedzi:

118

Od wersji Git 1.8.2:

MyPrject/WebApp/Scripts/special/**/*.js

Powinien działać zgodnie z tą odpowiedzią . Działa również w systemie Windows 7 przy użyciu Sourcetree 1.6.12.0 i wersji git, którą instaluje (1.8.4-preview20130916).

Aby rekurencyjnie gitignore każdy plik i folder w katalogu:

MyPrject/WebApp/Scripts/special/**
Sam
źródło
A co przed wprowadzeniem gita 1.8?
popioły 999
1
Jeśli ta odpowiedź nie działa (w systemie Windows), dodaj znak /na początku. Przykład:/MyProject/WebApp/Scripts/special/**/*.js
batressc
3
Wstydzę się, że moja odpowiedź zyskuje uznanie, kiedy jest dosłownie linkiem do innej odpowiedzi.
Sam
1
@puk: .gitignorew tym pytaniu znajdował się w katalogu głównym repozytorium (katalog nadrzędny /Webapp).
lucid_dreamer
1
Twoja odpowiedź wygląda dobrze, ale nie zadziałała dla mnie w systemie Windows 10 z git 1.9.1 do ignorowania wszystkich plików z wyjątkiem js w następującym przypadku: (pierwsza linia) foo/bar/*/*(druga linia) !foo/bar/**/*.jsDziałała tylko dla jednego poziomu podkatalogów, ale nie rekurencyjnie.
LLL
19

Następująca strona podręcznika gitignore:

[...] git traktuje wzorzec jako glob powłoki odpowiedni do użycia przez fnmatch (3) z flagą FNM_PATHNAME: symbole wieloznaczne we wzorcu nie będą pasować do / w nazwie ścieżki.

Z tego jasno wynika, że ​​nie ma możliwości określenia pewnej liczby katalogów między dwoma łańcuchami, na przykład między speciali js.

Niemniej jednak możesz mieć .gitignoreplik w każdym katalogu, więc może w twoim przypadku następująca treść

*.js

w następującym miejscu

MyPrject/WebApp/Scripts/special/.gitignore

wystarczy?

Guillaume Lemaître
źródło
Miałem MyPrject/WebApp/Scripts/special*.jsi pasowało MyPrject/WebApp/Scripts/specialfile.jsrównież MyPrject/WebApp/Scripts/special/a/b/c/file.js. Jednak z jakiegoś powodu zachowanie się zmieniło i moim obecnym obejściem jest wyświetlanie pojedynczych katalogów. Używam GitHub dla Windows.
orad
1
np.find MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh
jthill
10

To działa dla mnie na osx.

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store
Jonathan
źródło
1

Spróbuj wykonać. git rm -r --cached MyPrject/WebApp/Scripts/special/ Twój wspomniany katalog mógł być zapisany w pamięci podręcznej przez git i będzie się pojawiał na nieśledzonych plikach. Po wyczyszczeniu pamięci podręcznej upewnij się, że masz ją wymienioną .gitignore.

Pradipta Sarma
źródło