gitignore alle Dateien der Erweiterung im Verzeichnis

Antworten:

121

Ich habe es nie ausprobiert, aber es git help ignoreschlägt vor, dass es das tut, was Sie wollen , wenn Sie ein .gitignoremit *.jsin 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.

ptyx
quelle
19
Das ist nicht unbedingt die beste Lösung. Möglicherweise müssen Benutzer verschiedene .gitignore-Dateien durchsuchen, um herauszufinden, warum ihre Datei ignoriert wird. Einige bevorzugen es, alle diese Informationen in einer Gitignore-Datei im Repo-Stammverzeichnis zu speichern.
Karen
1
@haren es ist nicht die einzige Lösung - Joeys Antwort ist sicherlich auch gültig. Wählen Sie, was für Sie am besten funktioniert. Ich würde argumentieren, dass sich das Ignorieren von Regeln, die für ein Verzeichnis lokal sind, in diesem Verzeichnis befinden sollte und dass globale Regeln global sein sollten. (Auch diese Antwort ist uralt und ich glaube nicht, dass ** zu der Zeit unterstützt wurde).
Ptyx
209

Es scheint, dass die **Syntax ab gitVersion 1.8.2.1gemäß 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 **/foostimmt " " 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 Beispiel abc/**stimmt " " mit allen Dateien im Verzeichnis überein " abc", bezogen auf den Speicherort der .gitignoreDatei, 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.

joeyhoer
quelle
1
Was ist der Unterschied zwischen xxx/**und xxx/?
Thuzhf
9
xxx/**zielt auf alle Dateien und Verzeichnisse in ab, xxxwährend xxx/das xxxVerzeichnis 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.
Joeyey
4
Alle Dateien mit der Endung .meta sollten von git ignoriert werden. Wie funktioniert das? **.js?
Schwarz
"Andere aufeinanderfolgende Sternchen gelten als ungültig." fasst alles zusammen
imrok
68

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 .gitignoreDatei 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/*.jsWird also übereinstimmen, /public/static/foo.jsaber nicht /public/static/foo/bar.js .) Das Entfernen der führenden /wird auch nicht funktionieren, da Pfade wie public/static/foo.jsund übereinstimmen foo/public/static/bar.js. 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).

Wie von @ptyx vorgeschlagen, müssen Sie <repo>/public/static/.gitignorelediglich 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/staticVerzeichnis und seinen Unterverzeichnissen angewendet .

Adam Sharp
quelle
2
Dies ist nicht ganz richtig - insbesondere der Abschnitt "Das Entfernen der führenden /wird auch nicht funktionieren, wenn Pfade wie public/static/foo.jsund ü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.jswürde nicht übereinstimmen, da das Muster a enthält /.
Joeyey
@JoeyHoer danke an den Tipp, ich habe meine Antwort entsprechend aktualisiert.
Adam Sharp
9

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.

Thiago Ramos
quelle
1
Dies würde sich nicht auf andere Klone des Repositorys übertragen lassen, wie dies bei .gitignore der Fall wäre (natürlich nach dem Festschreiben).
jpmc26
3

Ich glaube, die einfachste Lösung wäre die Verwendung find. Ich mag es nicht, wenn mehrere .gitignorein 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-.

Garini
quelle