
Christus
Ich habe den Ordner application/
die ich dem hinzufüge .gitignore
. Im Inneren des application/
Ordner ist der Ordner application/language/gr
. Wie kann ich diesen Ordner einbinden?
Ich habe das versucht
application/
!application/language/gr/
ohne glück…

Chris Johnsen
Wenn Sie ausschließen application/
dann wird alles darunter immer ausgeschlossen (selbst wenn ein späteres negatives Ausschlussmuster („unignore“) etwas darunter finden könnte application/
).
Um das zu tun, was Sie wollen, müssen Sie jedes übergeordnete Verzeichnis von allem, was Sie „ignorieren“ möchten, „unignorieren“. Normalerweise schreibt man für diese Situation paarweise Regeln: Ignoriere alles in einem Verzeichnis, aber nicht irgendein bestimmtes Unterverzeichnis.
# you can skip this first one if it is not already excluded by prior patterns
!application/
application/*
!application/language/
application/language/*
!application/language/gr/
Notiz
Das Schleppen /*
ist wichtig:
- Das Muster
dir/
schließt ein Verzeichnis namens aus dir
und (implizit) alles darunter.
Mit dir/
Git wird sich niemals etwas darunter ansehen dir
und wird daher niemals eines der Muster zum Aufheben des Ausschlusses auf etwas darunter anwenden dir
.
- Das Muster
dir/*
sagt nichts darüber aus dir
selbst; es schließt einfach alles darunter aus dir
. Mit dir/*
verarbeitet Git den direkten Inhalt von dir
was anderen Mustern die Möglichkeit gibt, einen Teil des Inhalts „auszuschließen“ (!dir/sub/
).

VonC
Commit 59856de von Karsten Blees (kblees) für Git 1.9/2.0 (Q1 2014) verdeutlicht diesen Fall:
gitignore.txt
: Klärung der rekursiven Natur ausgeschlossener Verzeichnisse
Ein optionales Präfix “!
“, was das Muster negiert; jede übereinstimmende Datei, die durch ein vorheriges Muster ausgeschlossen wurde, wird wieder eingeschlossen.
Es ist nicht möglich, eine Datei erneut einzuschließen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen ist. (*
)
(*
: es sei denn, bestimmte Bedingungen sind in Git 2.8+ erfüllt, siehe unten)
Git listet aus Leistungsgründen keine ausgeschlossenen Verzeichnisse auf, daher haben alle Muster für enthaltene Dateien keine Auswirkung, egal wo sie definiert sind.
Setzen Sie einen Backslash (“\
“) vor dem ersten “!
” für Muster, die mit einem Literal beginnen “!
“, zum Beispiel, “\!important!.txt
“.
Beispiel, um alles außer einem bestimmten Verzeichnis auszuschließen foo/bar
(beachten Sie das /*
– Ohne den Schrägstrich würde der Platzhalter auch alles darin ausschließen foo/bar
):
--------------------------------------------------------------
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
--------------------------------------------------------------
In deinem Fall:
application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**
Sie müssen auf die Whitelist gesetzt werden Ordner zuerst, bevor Sie Dateien in einem bestimmten Ordner auf die weiße Liste setzen können.
Update Februar/März 2016:
Beachten Sie, dass es mit git 2.9.x/2.10 (Mitte 2016?) möglich sein könnte, eine Datei erneut einzuschließen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen wird wenn es keinen Platzhalter im Pfad gibt, der wieder eingeschlossen wird.
Nguyễn Thái Ngọc Duy (pclouds
) versucht, diese Funktion hinzuzufügen:
Mit Git 2.9+ hätte dies also tatsächlich funktionieren können, wurde aber letztendlich rückgängig gemacht:
application/
!application/language/gr/

rpyzh
Die Antwort von @Chris Johnsen ist großartig, aber mit einer neueren Version von Git (1.8.2 oder höher) gibt es ein doppeltes Sternchenmuster, das Sie für eine etwas kürzere Lösung nutzen können:
# assuming the root folder you want to ignore is 'application'
application/**/*
# the subfolder(s) you want to track:
!application/language/gr/
Auf diese Weise müssen Sie das übergeordnete Verzeichnis des Unterordners, den Sie verfolgen möchten, nicht “deignorieren”.
Mit Git 2.17.0 (nicht sicher, wie früh vor dieser Version. Möglicherweise zurück zu 1.8.2), mit dem **
Muster kombiniert mit Ausschlüssen für jedes Unterverzeichnis, das zu Ihren Dateien führt, funktioniert. Zum Beispiel:
# assuming the root folder you want to ignore is 'application'
application/**
# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder
Ich habe nur das gefunden eigentlich funktioniert.
**/node_modules/*
!**/node_modules/keep-dir

Katie
Es gibt eine Reihe ähnlicher Fragen dazu, also poste ich, was ich zuvor geschrieben habe:
Die einzige Möglichkeit, dies auf meiner Maschine zum Laufen zu bringen, war, es so zu machen:
# Ignore all directories, and all sub-directories, and it's contents:
*/*
#Now ignore all files in the current directory
#(This fails to ignore files without a ".", for example
#'file.txt' works, but
#'file' doesn't):
*.*
#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*
Beachten Sie, wie Sie Inhalte für jede Ebene, die Sie einbeziehen möchten, explizit zulassen müssen. Wenn ich also Unterverzeichnisse 5 tief unter Themen habe, muss ich das noch buchstabieren.
Dies ist aus @Yarins Kommentar hier: https://stackoverflow.com/a/5250314/1696153
Das waren nützliche Themen:
- Wie funktionieren negierte Muster in .gitignore?
- Wie funktionieren die Ausschlussregeln von Gitignore eigentlich?
Ich habe es auch versucht
*
*/*
**/**
und **/wp-content/themes/**
oder /wp-content/themes/**/*
Bei mir hat auch nichts davon funktioniert. Viel Versuch und Irrtum!
Der einfachste und wahrscheinlich beste Weg ist, die Dateien manuell hinzuzufügen (im Allgemeinen hat dies Vorrang vor .gitignore
-Stilregeln):
git add /path/to/module
Du brauchst vielleicht -f
wenn die Datei bereits ignoriert wird. Vielleicht möchten Sie sogar die -N
Absicht hinzuzufügen Flagge, um Sie vorzuschlagen Wille fügen Sie sie hinzu, aber nicht sofort. Ich mache das oft für neue Dateien, die ich noch nicht bereitstellen möchte.
Dies ist eine Kopie einer Antwort, die auf etwas gepostet wurde, das leicht eine doppelte QA sein könnte. Ich reposte es hier, um es besser sichtbar zu machen – ich finde es einfacher, kein Durcheinander von Gitignore-Regeln zu haben.
Ich habe hier einen ähnlichen Fall gefunden, in dem standardmäßig in Laravel .gitignore
ignoriert alle, die Asterix verwenden, und überschreibt dann das öffentliche Verzeichnis. (Dies ist auch die gleiche Lösung wie die Hauptantwort @Chris Johnsen, nur vielleicht etwas dünner und prägnanter.)
*
!public
!.gitignore
Dies reicht nicht aus, wenn Sie auf das OP-Szenario stoßen.
Wenn Sie einen bestimmten Unterordner von public
sagen Sie für zB in Ihrem public/products
Verzeichnis, in das Sie Dateien einschließen möchten, die einen Unterordner tief sind, z. B. zum Einschließen public/products/a/b.jpg
Sie werden nicht korrekt erkannt, selbst wenn Sie sie ausdrücklich so hinzufügen !/public/products
, !public/products/*
etc..
Die Lösung besteht darin, sicherzustellen, dass Sie für jede Pfadebene einen Eintrag hinzufügen, um sie alle zu überschreiben.
*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*
9871400cookie-check.gitignore Ordner ausschließen, aber bestimmte Unterordner einschließenyes
Hoffentlich ist das „
.gitignore
Musterformat”-Dokumentation wurde gerade klarer (Dezember 2013). Siehe meine Antwort unten– VonC
18. Dezember 2013 um 8:11 Uhr
Meine Lieblingsfrage und -antwort, zu den Favoriten und zu den Browser-Lesezeichen hinzugefügt.
– Codekiddy
17. November 2015 um 7:02 Uhr
Siehe auch Wie sage ich Git, dass es alles außer einem Unterverzeichnis ignorieren soll?
– 030
30. März 2017 um 7:03 Uhr