Wie rekursiv .gitignore Dateien

105

Ich versuche, das folgende Muster in meiner .gitignoreDatei zu vermeiden .

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

Wir haben es versucht:

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

Dies funktionierte jedoch nicht. Dies ist Git unter Windows. Gibt es eine präzisere Möglichkeit, dies zu tun, ohne Dinge zu wiederholen?

orad
quelle

Antworten:

114

Ab Git 1.8.2 gilt Folgendes:

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

Sollte nach dieser Antwort funktionieren . Es funktioniert auch für mich in Windows 7 mit Sourcetree 1.6.12.0 und der Version von Git, die es installiert (1.8.4-Vorschau20130916).

So rekursiv jede Datei und jeden Ordner in einem Verzeichnis gitignore:

MyPrject/WebApp/Scripts/special/**
Sam
quelle
Was ist mit vor Git 1.8?
Asche999
1
Wenn diese Antwort nicht funktioniert (unter Windows), fügen Sie das Zeichen /am Anfang hinzu. Beispiel:/MyProject/WebApp/Scripts/special/**/*.js
Batressc
2
Es ist mir peinlich, dass meine Antwort immer wieder positiv bewertet wird, wenn es sich buchstäblich um einen Link zu einer anderen Antwort handelt.
Sam
1
@puk: Das .gitignorein dieser Frage war im Repo-Stammverzeichnis (übergeordnetes Verzeichnis von /Webapp).
lucid_dreamer
1
Ihre Antwort sieht gut aus, hat aber unter Windows 10 mit Git 1.9.1 nicht funktioniert, da im folgenden Fall alle Dateien außer js ignoriert wurden: (erste Zeile) foo/bar/*/*(zweite Zeile) !foo/bar/**/*.jsSie funktionierte nur für eine Ebene von Unterverzeichnissen, jedoch nicht rekursiv.
LLL
19

Folgende gitignore-Handbuchseite:

[...] git behandelt das Muster als Shell-Glob, der für den Verbrauch durch fnmatch (3) mit dem Flag FNM_PATHNAME geeignet ist: Platzhalter im Muster stimmen nicht mit einem / im Pfadnamen überein.

Dies bedeutet also eindeutig, dass es keine Möglichkeit gibt, eine bestimmte Anzahl von Verzeichnissen zwischen zwei Zeichenfolgen wie zwischen specialund anzugeben js.

Trotzdem können Sie eine .gitignoreDatei pro Verzeichnis haben, also in Ihrem Fall vielleicht den folgenden Inhalt

*.js

am folgenden Ort

MyPrject/WebApp/Scripts/special/.gitignore

wäre ausreichend?

Guillaume Lemaître
quelle
Früher hatte ich MyPrject/WebApp/Scripts/special*.jsund es passte MyPrject/WebApp/Scripts/specialfile.jsgenauso gut wie MyPrject/WebApp/Scripts/special/a/b/c/file.js. Aus irgendeinem Grund hat sich das Verhalten jedoch geändert, und meine derzeitige Problemumgehung besteht darin, Verzeichnisse einzeln aufzulisten. Ich benutze GitHub für Windows.
Orad
1
zBfind MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh
bis
9

Das funktioniert bei mir in osx.

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store
Jonathan
quelle
0

Versuchen Sie auszuführen git rm -r --cached MyPrject/WebApp/Scripts/special/ Ihr angegebenes Verzeichnis wurde möglicherweise von git zwischengespeichert und wird in nicht verfolgten Dateien angezeigt. Stellen Sie nach dem Löschen des Caches sicher, dass Sie ihn erwähnt haben .gitignore.

Pradipta Sarma
quelle