1496 Stimmen

.gitignore schließt Ordner aus, aber enthält bestimmten Unterordner

Ich habe den Ordner application/, den ich zur .gitignore hinzufüge. Innerhalb des Ordners application/ befindet sich der Ordner application/language/gr. Wie kann ich diesen Ordner einschließen?

Ich habe das versucht

application/
!application/language/gr/

2368voto

Chris Johnsen Punkte 199970

Wenn Sie application/ ausschließen, wird alles darunter immer ausgeschlossen (auch wenn später ein negativer Ausschlusstyp ("unignore") etwas unter application/ abdeckt).

Um zu erreichen, was Sie möchten, müssen Sie jeden übergeordneten Verzeichnis von allem "unignore", was Sie möchten, "unignoren". Normalerweise schreiben Sie Regeln für diese Situation paarweise: Ignorieren Sie alles in einem Verzeichnis, aber nicht in einem bestimmten Unterverzeichnis.

# Dies kann übersprungen werden, wenn es nicht bereits durch vorherige Muster ausgeschlossen ist
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

Hinweis
Der nachgestellte /* ist wichtig:

  • Das Muster dir/ schließt ein Verzeichnis namens dir und (implizit) alles darunter aus.
    Mit dir/ wird Git niemals etwas unter dir betrachten und daher niemals eines der "un-exclude" Muster auf irgendetwas unter dir anwenden.
  • Das Muster dir/* sagt nichts über dir selbst aus; es schließt einfach alles unter dir aus. Mit dir/* wird Git den direkten Inhalt von dir verarbeiten und anderen Mustern die Möglichkeit geben, einen Teil des Inhalts "un-exclude" zu machen (!dir/sub/).

189voto

VonC Punkte 1117238

Commit 59856de von Karsten Blees (kblees) für Git 1.9/2.0 (Q1 2014) klärt diesen Fall:

gitignore.txt : Klären der rekursiven Natur der ausgeschlossenen Verzeichnisse

Ein optionaler Präfix "!", der das Muster negiert; jede übereinstimmende Datei, die durch ein vorheriges Muster ausgeschlossen wurde, wird wieder eingeschlossen.

Es ist nicht möglich, eine Datei wieder 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 ausgeschlossene Verzeichnisse aus Leistungsgründen nicht auf, daher haben Muster für enthaltene Dateien keine Auswirkungen, egal wo sie definiert sind.

Setzen Sie einen Backslash ("\") vor das erste "!" für Muster, die mit einem literalen "!" beginnen, zum Beispiel "\!important!.txt".

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

 --------------------------------------------------------------
     $ cat .gitignore
     # schließe alles aus, außer Verzeichnis foo/bar
     /*
     !/foo
     /foo/*
     !/foo/bar
 --------------------------------------------------------------

In Ihrem Fall:

application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**

Sie müssen zuerst Ordner auf die Whitelist setzen, bevor Sie Dateien innerhalb eines bestimmten Ordners auf die Whitelist setzen können.


Aktualisierung Feb/März 2016:

Beachten Sie, dass mit git 2.9.x/2.10 (Mitte 2016?), es möglicherweise möglich ist, eine Datei wieder einzuschließen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen ist wenn im Pfad, der wieder eingeschlossen wird, kein Platzhalter verwendet wird.

Nguyen Thái Ngoc Duy (pclouds) versucht, diese Funktion hinzuzufügen:

Also mit git 2.9+ hätte dies tatsächlich funktionieren können, wurde aber letztendlich rückgängig gemacht:

application/
!application/language/gr/

80voto

rpyzh Punkte 847

Die Antwort von @Chris Johnsen ist großartig, aber mit neueren Versionen von Git (1.8.2 oder höher) gibt es ein Muster mit zwei Asterisken, das Sie für eine etwas kürzere Lösung nutzen können:

# Angenommen, der Stammordner, den Sie ignorieren möchten, ist 'Anwendung'
Anwendung/**/*

# Der/die Unterordner, die Sie verfolgen möchten:
!Anwendung/Sprache/gr/

Auf diese Weise müssen Sie nicht das übergeordnete Verzeichnis des Unterordners, den Sie verfolgen möchten, "wieder ignorieren".


Mit Git 2.17.0 (Nicht sicher, wie weit vor dieser Version. Möglicherweise bis zurück zu 1.8.2) funktioniert das Muster ** `in Kombination mit Ausschlüssen für jeden übergeordneten Unterordner bis zu Ihren Dateien. zum Beispiel:`

`# Angenommen, der Stammordner, den Sie ignorieren möchten, ist 'Anwendung' Anwendung/***

# Bestimmte Inhalte, die in dem Ordner 'Anwendung' verschachtelt sind, explizit verfolgen:
!Anwendung/Sprache/
!Anwendung/Sprache/gr/
!Anwendung/Sprache/gr/** # Beispiel für das Hinzufügen aller Dateien und Ordner im Ordner 'gr'
!Anwendung/Sprache/gr/EinigeDatei.txt # Beispiel für das Hinzufügen einer bestimmten Datei im Ordner 'gr'` ``

57voto

Steve Kling Punkte 431

Ich habe festgestellt, dass nur dies wirklich funktioniert.

**/node_modules/*
!**/node_modules/keep-dir

33voto

Katie Punkte 41284

Es gibt eine Menge ähnlicher Fragen dazu, also werde ich hier posten, was ich zuvor geschrieben habe:

Der einzige Weg, wie ich das auf meinem Computer zum Laufen gebracht habe, war, es auf diese Weise zu tun:

# Ignoriere alle Verzeichnisse und Unterverzeichnisse sowie deren Inhalte:
*/*

# Ignoriere jetzt alle Dateien im aktuellen Verzeichnis
# (Das Scheitern bei der Ignorierung von Dateien ohne ".", zum Beispiel
#'datei.txt' funktioniert, aber
#'datei' nicht):
*.*

# Nur diese spezifischen Verzeichnisse und Unterverzeichnisse einschließen:
!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/*/*/*/*/*

Beachte, wie du explizit den Inhalt für jede Ebene, die du einschließen möchtest, erlauben musst. Wenn ich zum Beispiel Unterverzeichnisse habe, die 5 Ebenen tief unter Themes liegen, muss ich das immer noch genau angeben.

Dies stammt aus dem Kommentar von @Yarin hier: https://stackoverflow.com/a/5250314/1696153

Diese Themen waren hilfreich:

Ich habe auch versucht

*
*/*
**/**

und **/wp-content/themes/**

oder /wp-content/themes/**/*

Nichts davon hat bei mir funktioniert. Viel Versuch und Irrtum!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X