Ignorieren Sie alle Dateien mit Ausnahme eines bestimmten Dateityps rekursiv unter einem bestimmten Ordner

89

Ich habe ähnliche Fragen gesehen ( 1 , 2 und 3 ), aber ich bekomme keine richtige Lösung von ihnen.

Ich muss alle Dateien unter einem bestimmten Ordner außer einem bestimmten Dateityp ignorieren. Der Ordner ist ein Unterverzeichnis für den Stammpfad. Lassen Sie mich den Ordner benennen Resources. Da ich die Dinge nicht komplizieren möchte, möchte ich Dateien unter allen Ordnern ignorieren, die Resourcesüberall benannt sind.

Dies ist die häufigste Lösung (bei allen doppelten Fragen).

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

Das Problem bei dieser Lösung besteht darin, dass neu hinzugefügte Dateien nicht mehr verfolgt werden (da *alle Dateien ignoriert werden). Ich möchte nicht jeden Dateityp ausschließen. Ich möchte ein normales Verhalten, bei dem eine neue Datei angezeigt wird git status.

Ich habe hier endlich eine Lösung gefunden . Die Lösung besteht darin, eine weitere .gitignoreDatei im ResourcesOrdner hinzuzufügen . Das funktioniert richtig.

Kann ich dasselbe mit einer Ignorierdatei erreichen? Ich finde es etwas klobig, viele Ignorierdateien in verschiedenen Verzeichnissen zu haben.

Das versuche ich zu erreichen:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Dies ergibt jedoch die entgegengesetzte Ausgabe. Es ignoriert *.fooTypen und verfolgt andere Dateien.

nawfal
quelle

Antworten:

108

@ SimonBuchan ist richtig.

Seit Git 1.8.2 Resources/** !Resources/**/*.foofunktioniert.

Jim G.
quelle
1
Das funktioniert bei mir, leichte Optimierung, ich muss nur Verzeichnisse und alles darunter entfernen, also habe ich es getan: DirectoryName1/** DirectoryName1/**/*für jedes von ihnen. Firs entfernen Verzeichnisse, aber Sie benötigen das zweite, um alle Dateitypen zu entfernen.
Scala Enthusiast
27

Die beste Antwort ist das Hinzufügen einer Resources / .gitignore-Datei unter Resources, die Folgendes enthält:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

Wenn Sie diese Gitignore-Datei nicht hinzufügen möchten oder können, gibt es eine unelegante Lösung:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Sie müssen dieses Muster bearbeiten, wenn Sie Verzeichnisse hinzufügen, die tiefer als angegeben sind.

Ben Martin
quelle
2
Das ist traurig. In der Tat werde ich tiefere Verzeichnisse haben, also werde ich bei dem ersten bleiben :(
nawfal
Weitere Details zu derselben Lösung finden Sie hier: stackoverflow.com/questions/7803689/… - ebenfalls oben von OP @nawfal verlinkt
hier
7

Dies mag dumm aussehen, aber prüfen Sie, ob Sie den Ordner / die Dateien, die Sie ignorieren möchten, noch nicht zum Index hinzugefügt haben. Wenn Sie dies getan haben, spielt es keine Rolle, was Sie in Ihre .gitignore-Datei einfügen. Die Ordner / Dateien werden weiterhin bereitgestellt.

Tiago
quelle
5
Wenn jemand auf diesen speziellen Anwendungsfall stößt, können Sie git rm --cached <path to files>diese ignorierten Dateien aus git löschen, während Sie sie weiterhin im Dateisystem belassen.
Slothluvchunk
5

Entweder mache ich es falsch oder die akzeptierte Antwort funktioniert mit dem aktuellen Git nicht mehr.

Ich habe gefunden , tatsächlich die richtige Lösung und entsandte sie unter fast der gleichen Frage hier . Weitere Details finden Sie dort.

Lösung:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo
Aleksander Stelmaczonek
quelle
2
Ja, das funktioniert bei mir. Das Hinzufügen von !/Resources/**/war entscheidend, damit git Unterverzeichnisse nicht ignoriert.
Johnster