Gibt es eine Möglichkeit, alle Dateien eines Typs in einem Verzeichnis zu ignorieren?
**
ist anscheinend bedeutungslos für git, also funktioniert das nicht:
/public/static/**/*.js
Die Idee ist, beliebige verschachtelte Ordner abzugleichen.
Gibt es eine Möglichkeit, alle Dateien eines Typs in einem Verzeichnis zu ignorieren?
**
ist anscheinend bedeutungslos für git, also funktioniert das nicht:
/public/static/**/*.js
Die Idee ist, beliebige verschachtelte Ordner abzugleichen.
Antworten:
Ich habe es nie ausprobiert, aber es git help ignore
schlägt vor, dass es das tut, was Sie wollen , wenn Sie ein .gitignore
mit *.js
in setzen /public/static
.
Hinweis: Lesen Sie auch die Antwort von Joeys weiter unten: Wenn Sie Dateien in einem bestimmten Unterverzeichnis ignorieren möchten, ist ein lokaler Gitignore die richtige Lösung (Lokalität ist gut). Wenn Sie jedoch dasselbe Muster für Ihr gesamtes Repo benötigen, ist die ** Lösung besser.
Es scheint, dass die **
Syntax ab git
Version 1.8.2.1
gemäß der Dokumentation unterstützt wird .
Zwei aufeinanderfolgende Sternchen ("
**
") in Mustern, die mit dem vollständigen Pfadnamen übereinstimmen, können eine besondere Bedeutung haben:
Ein führendes "
**
" gefolgt von einem Schrägstrich bedeutet Übereinstimmung in allen Verzeichnissen. Zum Beispiel**/foo
stimmt " " mit einer Datei oder einem Verzeichnis überein, "foo
" überall, genau wie Muster "foo
". "**/foo/bar
" stimmt mit Datei oder Verzeichnis überein "bar
" überall dort, wo sich direkt unter Verzeichnis "foo
" befindet.Ein nachfolgendes "
/**
" passt zu allem im Inneren. Zum Beispielabc/**
stimmt " " mit allen Dateien im Verzeichnis überein "abc
", bezogen auf den Speicherort der.gitignore
Datei, mit unendlicher Tiefe.Ein Schrägstrich gefolgt von zwei aufeinanderfolgenden Sternchen, dann entspricht ein Schrägstrich null oder mehr Verzeichnissen. Zum Beispiel "
a/**/b
" entspricht "a/b
", "a/x/b
", "a/x/y/b
" und so weiter.Andere aufeinanderfolgende Sternchen gelten als ungültig.
xxx/**
und xxx/
?
xxx/**
zielt auf alle Dateien und Verzeichnisse in ab, xxx
während xxx/
das xxx
Verzeichnis direkt ausgerichtet ist. Dies ist wirklich nur wichtig, wenn Muster mit !
"Es ist nicht möglich, eine Datei erneut einzuschließen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen ist." Negiert werden. Daher ist in diesem Fall die Verwendung von xxx/*
oder xxx/**
erforderlich.
**.js
?
UPDATE: Sehen Sie sich die Antwort von @ Joey an : Git unterstützt jetzt die **
Syntax in Mustern. Beide Ansätze sollten gut funktionieren.
Das Manpage von gitignore (5) heißt es:
Muster, die aus einer Gitignore-Datei im selben Verzeichnis wie der Pfad oder in einem übergeordneten Verzeichnis gelesen werden, wobei Muster in den Dateien höherer Ebene (bis zur obersten Ebene des Arbeitsbaums) von denen in Dateien niedrigerer Ebene bis zum Verzeichnis überschrieben werden mit der Datei.
Dies bedeutet, dass die Muster in einer .gitignore
Datei in einem bestimmten Verzeichnis Ihres Repos dieses Verzeichnis und beeinflussen alle Unterverzeichnisse beeinflussen .
Das von Ihnen angegebene Muster
/public/static/**/*.js
ist nicht ganz richtig, erstens, weil (wie Sie richtig bemerkt haben) die **
Syntax von Git nicht verwendet wird. Auch die führenden /
Anker, die Muster am Anfang des Pfadnamens. ( /public/static/*.js
Wird also übereinstimmen, /public/static/foo.js
aber nicht /public/static/foo/bar.js
.) Das Entfernen der führenden BEARBEITEN: Nur das Entfernen des führenden Schrägstrichs funktioniert auch nicht - da das Muster immer noch einen Schrägstrich enthält, wird es von Git als einfacher, nicht rekursiver Shell-Glob behandelt (danke @Joey Hoer) für den Hinweis)./
wird auch nicht funktionieren, da Pfade wie public/static/foo.js
und übereinstimmen foo/public/static/bar.js
.
Wie von @ptyx vorgeschlagen, müssen Sie <repo>/public/static/.gitignore
lediglich die Datei erstellen und nur dieses Muster einschließen:
*.js
Es gibt keinen führenden Wert /
, daher stimmt er mit jedem Teil des Pfads überein, und dieses Muster wird immer nur auf Dateien im /public/static
Verzeichnis und seinen Unterverzeichnissen angewendet .
/
wird auch nicht funktionieren, wenn Pfade wie public/static/foo.js
und übereinstimmen foo/public/static/bar.js
." ist falsch. Um die Dokumentation zu zitieren: "Wenn das Muster keinen Schrägstrich / enthält, behandelt Git es als Shell-Glob-Muster und prüft, ob eine Übereinstimmung mit dem Pfadnamen relativ zum Speicherort der .gitignore-Datei (relativ zur obersten Ebene des Arbeitsbaums, wenn) vorliegt nicht aus einer .gitignore-Datei). " foo/public/static/bar.js
würde nicht übereinstimmen, da das Muster a enthält /
.
Um nicht verfolgte Dateien zu ignorieren, gehen Sie einfach zu .git / info / exclude. Ausschließen ist eine Datei mit einer Liste ignorierter Erweiterungen oder Dateien.
Ich glaube, die einfachste Lösung wäre die Verwendung find
. Ich mag es nicht, wenn mehrere .gitignore
in Unterverzeichnissen herumhängen, und ich bevorzuge es, eine eindeutige Top-Ebene zu verwalten .gitignore
. Dazu können Sie einfach die gefundenen Dateien an Ihre anhängen .gitignore
. Angenommen, das /public/static/
ist dein Projekt / Git-Zuhause, würde ich so etwas verwenden wie:
find . -type f -name *.js | cut -c 3- >> .gitignore
Ich fand, dass das Ausschneiden der ./
am Anfang oft notwendig ist, damit Git versteht, welche Dateien zu vermeiden sind. Daher die cut -c 3-
.