Wie kann ich Git anweisen, alles außer einem Unterverzeichnis zu ignorieren?

218

Ich möchte alle Dateien in meinem Repository ignorieren, außer denen, die im binUnterverzeichnis vorkommen. Ich habe versucht, Folgendes zu meinem hinzuzufügen .gitignore:

*
!bin/*

Dies hat jedoch nicht den gewünschten Effekt: Ich habe eine neue Datei in erstellt bin/, aber es wird git statusimmer noch angezeigt nothing to commit (working directory clean).

Irgendwelche Vorschläge?

Michael Goerz
quelle

Antworten:

273

Dies ignoriert Root-Dateien und Root-Verzeichnisse und hebt dann das Root-Bin-Verzeichnis auf:

/*
/*/
!/bin/

Auf diese Weise erhalten Sie das gesamte bin-Verzeichnis, einschließlich der Unterverzeichnisse und ihrer Dateien.

Tyler Laing
quelle
25
Aus irgendeinem Grund funktioniert das bei mir nicht konsequent. Ich habe die zwei Zeilen /stuff/und !/stuff/specific/, aber es ignoriert immer noch / stuff / spezifisch /
LB--
1
@ LB-- Ich hatte ein ähnliches Problem und git check-ignore -vsagte mir, es sei wegen~/.gitignore
Trage Alex
@gurneyalex Ich habe herausgefunden, dass es sich selbst behebt, wenn ich das lokale Repo lösche und es erneut klone, muss es ein Fehler sein.
LB
2
Ist das / * / notwendig?
Alex Baker
3
Das hat bei mir nicht funktioniert. Ich musste !/bin/meiner Stammdatei hinzufügen .gitignore, aber dann musste ich zusätzlich eine /bin/.gitignoreDatei hinzufügen mit !*... Nur eine dieser Änderungen vorzunehmen funktionierte nicht. Es funktionierte erst, nachdem beide Änderungen kombiniert wurden.
Felipe Brahm
113

Hier erfahren Sie, wie Sie alles außer einem Verzeichnis " MY_SUPER_DUPER_TEMPLATE_directory " in einem Verzeichnis ignorieren

Struktur: / bitrix / templates / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore
Andrii Tishchenko
quelle
1
Dies wirkte Wunder, um ein von mir modifiziertes Laravel-Anbieterpaket zu entlarven! Danke, du hast mir viele Kopfschmerzen
erspart
Dies sollte als beste Antwort ausgewählt werden.
Bahman.A
63

Sie müssen auf dem Weg zu den Zielen alles ausschließen, aber Sie müssen die Ziele einschließen:

Hinweis: Dies ist eine Ausschlussdatei (dh .gitignore), sodass die Logik invertiert wird. Ignoriere alle außer dem TLS-Verzeichnis, ignoriere alle im TLS-Verzeichnis, außer dem src-Verzeichnis ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore
nikc
quelle
11
+1 für das Prinzip, ein Verzeichnis einzuschließen und dann dessen Inhalt auszuschließen, einschließlich des gewünschten Unterverzeichnisses usw. Ich habe diese Antwort schließlich in meinen Projekten verwendet.
Johannes Jesus
40

Das einzige Problem, das Sie haben, ist, dass das binVerzeichnis selbst nicht mit dem bin/*Muster übereinstimmt , sodass git nicht einmal im binVerzeichnis nachschaut .

Es gibt zwei Lösungen, die mir in den Sinn kommen.

.gitignore ::

*
!/bin/
!bin/*

oder

.gitignore ::

*
!/bin/

bin/.gitignore ::

!*

Ich bevorzuge die zweite Lösung, da die erste Lösung nicht aufhört, Dateien im binVerzeichnis zu ignorieren , die sich in Unterverzeichnissen befinden, die nicht aufgerufen werden bin. Dies kann in Ihrer Situation von Bedeutung sein oder auch nicht.

CB Bailey
quelle
2
Hat bei mir nicht funktioniert. Ich muss einen solchen .gitignore haben, damit es funktioniert: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* Kein Blockcode in Kommentaren?
Xlttj
1
Tylers Antwort hat eine bessere Einzeldateilösung
Yarin
19

Aus dem offiziellen Git-Dokument geht eines der Beispiele hervor:

Beispiel zum Ausschließen von allem außer einem bestimmten Verzeichnis foo / bar (beachten Sie das / * - ohne den Schrägstrich würde der Platzhalter auch alles in foo / bar ausschließen):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Für eine Erklärung über den führenden Schrägstrich: Wenn führenden Schrägstrich in gitignore verwenden .

Sonnenwende333
quelle
Vielen Dank, eine Million, das hat bei mir funktioniert! Beachten Sie für andere, dass die Reihenfolge der Zeilen hier wichtig ist. Sie können beispielsweise nicht! / Foo / bar vor / foo / * haben.
Iamsodarncool
13

Versuchen Sie, in der neuesten GIT-Version zu folgen.

*
!*/
!/path/to/your/dir/**
Kirby
quelle
es sollte eigentlich sein! / path / to / your / dir / ** für die letzte Zeile
faham
@faham, yep, habe es gerade hinzugefügt.
Kirby
11

Ich denke, ein besserer Weg wäre, jedes Muster im obersten Git-Verzeichnis zu verankern, indem man das Muster mit einem Schrägstrich beginnt:

/*
!/public_html
!/.gitignore

Anstatt alle Dateien zu ignorieren, werden nur Dateien der obersten Ebene ignoriert, nicht diejenigen in dem Verzeichnis, die Sie nicht ignorieren möchten.

Jake
quelle
8

Das .gitignorefunktioniert bei mir:

*/
/*
!bin/
Trianam
quelle
5

Versuchen Sie diesen obskuren Git-Bug.

!bin**/**

Ich hoffe es hilft :)

Unterstützende Dokumente Git-Bug-Beispiel

PS: Probieren Sie es zuerst aus, bevor Sie einen Kommentar abgeben.

David
quelle
0

Ich musste das kürzlich tun:

*
!sub-dir/
!sub-dir/*

Ich bin mir nicht sicher, warum ich zwei Zeilen benötige, um einen Ordner auszuschließen, aber das hat bei mir und Macos funktioniert.

Henry
quelle