.gitignore Ordner ausschließen, aber bestimmte Unterordner einschließen

Lesezeit: 10 Minuten

gitignore Ordner ausschliesen aber bestimmte Unterordner einschliesen
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…

  • 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


gitignore Ordner ausschliesen aber bestimmte Unterordner einschliesen
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 dirund 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 dirwas anderen Mustern die Möglichkeit gibt, einen Teil des Inhalts „auszuschließen“ (!dir/sub/).

  • Sind die abschließenden Sternchen signifikant? Wenn ja, was ist der Bedeutungsunterschied? Gemäß dem Algorithmus, der in beschrieben wird ignorieren Dokumentation, die mit einem abschließenden Schrägstrich endet, entspricht einem Verzeichnis und Pfaden unterhalb dieses Verzeichnisses. Das Ende mit einem Stern würde dann als Glob-Muster behandelt werden. Experimentieren zeigt, dass die Sternchen-Variante funktioniert, aber nicht die, die nur mit einem nachgestellten Schrägstrich endet. Ich würde gerne verstehen, warum das so ist.

    – seh

    11. Mai 2011 um 13:21 Uhr

  • @seh: Ja, das Nachstellen /* ist wichtig. Wenn ein Verzeichnis ausgeschlossen wird, wird Git niemals den Inhalt dieses Verzeichnisses betrachten. Das Muster dir/ schließt ein Verzeichnis namens aus dir und (implizit) alles darunter. Das Muster dir/* sagt nichts darüber aus dir selbst; es schließt einfach alles darunter aus dir. Mit dir/Git wird sich niemals etwas darunter ansehen dirund wird daher niemals eines der Muster zum Aufheben des Ausschlusses auf etwas darunter anwenden dir. Mit dir/*verarbeitet Git den direkten Inhalt von dirwas anderen Mustern die Möglichkeit gibt, einen Teil des Inhalts „auszuschließen“ (!dir/sub/).

    – Chris Johnsen

    12. Mai 2011 um 2:58 Uhr

  • Ah, das erklärt es. Egal wie oft ich das gelesen habe ignorieren Dokumentation, ich habe nie verstanden, wann die umgekehrten Muster nicht funktionieren. Mit deiner Erklärung ist es jetzt klar. Die ignorieren Die Dokumentation benötigt einen “Rezept”-Abschnitt, um zu erklären, wie das geht.

    – seh

    13. Mai 2011 um 0:32 Uhr

  • Ich konnte das nicht ganz zum Laufen bringen (verrückte .gitignore-Datei!), Also habe ich die Dateien stattdessen einfach nach dem CD-Eintrag in das gewünschte Verzeichnis hinzugefügt. git add -f .

    – K0D4

    21. Juli 2015 um 21:42 Uhr


  • Beachten Sie, dass Sie sich nicht auf die Ausgabe von verlassen können git status, die Ihnen nur mitteilt, dass das Verzeichnis der obersten Ebene hinzugefügt wird. Machen Sie stattdessen a git add des obersten Verzeichnisses und dann git status listet (hoffentlich) die Teilmenge der Dateien auf, die mit dem Muster übereinstimmen.

    – Matthew Strawbridge

    2. September 2016 um 10:00 Uhr

gitignore Ordner ausschliesen aber bestimmte Unterordner einschliesen
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/

  • Ich habe versucht, die aktualisierte Syntax zum erneuten Einschließen zu verwenden, die am Ende Ihrer Antwort auf Git für Windows veröffentlicht wurde v2.8.1.windows.1 aber es scheint nicht zu funktionieren 🙁

    – David Hancock

    12. April 2016 um 17:58 Uhr

  • @DavidHancock Entschuldigung, ich habe die Antwort bearbeitet: Dies ist noch nicht verfügbar.

    – VonC

    12. April 2016 um 18:24 Uhr

  • @DavidHancock ich auch: Das sind mehr als 13 Stack Overflow-Antworten, die ich mehrfach bearbeiten musste!

    – VonC

    12. April 2016 um 18:49 Uhr


  • Git 2.9 wurde gestern veröffentlicht. Bestätigung der application/ + !application/language/gr/ Das in der Antwort erwähnte Muster funktioniert wie erwartet.

    – Ray Shan

    15. Juni 2016 um 0:52 Uhr

  • @RayShan Strange: Ich habe gesehen, dass das Revert-Commit diese Funktion abbricht, aber ich habe es nicht gesehen (und die Versionshinweise github.com/git/git/blob/master/Documentation/RelNotes/2.9.0.txt erwähnt nicht) irgendein Commit, das die .gitignore-Regeln verbessert.

    – VonC

    15. Juni 2016 um 7:13 Uhr


1646901495 80 gitignore Ordner ausschliesen aber bestimmte Unterordner einschliesen
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

  • Leider schlägt dies fehl (Git 1.8.4.msysgit.0), weil das Muster ** kann mit null Unterordnern übereinstimmen, und * wird passen language und schließen Sie es aus, wodurch die Aufnahme von verhindert wird gr. Die vollständige Kette von Eltern, die @Chris Johnson empfiehlt, scheint immer noch notwendig zu sein.

    – Sean Gugler

    14. Februar 2014 um 0:26 Uhr

  • Klingt perfekt, aber es funktioniert bei mir nicht auf Git 2.3.7 … /www/**/* !/www/config.xml !/www/res config.xml und das res-Verzeichnis werden weiterhin ignoriert.

    – Rauben

    11. August 2015 um 11:18 Uhr


  • @Rob musst du auch hinzufügen !/www/res/. Du kannst den … benutzen folder/**/* Muster, aber Sie müssen trotzdem Ausschlüsse für jedes Unterverzeichnis hinzufügen, das Sie hinzufügen möchten. Es ist immer noch kürzer und besser lesbar als die Ignorieren/Ausschließen-Kombination.

    – Ben Kane

    12. April 2018 um 16:14 Uhr

  • Ich weiß, das ist ein alter Kommentar, aber falls Sie neugierig sind. Ich habe der Antwort eine Bearbeitung hinzugefügt, die diesen Ansatz dokumentiert.

    – Ben Kane

    12. April 2018 um 16:26 Uhr


Ich habe nur das gefunden eigentlich funktioniert.

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

1646901496 356 gitignore Ordner ausschliesen aber bestimmte Unterordner einschliesen
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!

  • Hinweis: Denken Sie daran, dass die Reihenfolge auch in einer .gitignore-Datei eine Rolle spielt, stellen Sie also sicher, dass Sie Ihre angeben ! Regeln ganz unten.

    – Starbeamrainbowlabs

    12. August 2019 um 11:15 Uhr

  • das ist peinlicher als Javascript als Sprache selbst. warum um alles in der Welt gibt es so viele unterschiedliche und absurde Antworten auf ein so einfaches Problem? (Ich stehe Git kritisch gegenüber, nicht Ihrer Lösung). Und nein, Git ist nicht schlecht, aber es hat einige schlechte Seiten.

    – Joel M

    1. März 2021 um 5:04 Uhr


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.

  • Hinweis: Denken Sie daran, dass die Reihenfolge auch in einer .gitignore-Datei eine Rolle spielt, stellen Sie also sicher, dass Sie Ihre angeben ! Regeln ganz unten.

    – Starbeamrainbowlabs

    12. August 2019 um 11:15 Uhr

  • das ist peinlicher als Javascript als Sprache selbst. warum um alles in der Welt gibt es so viele unterschiedliche und absurde Antworten auf ein so einfaches Problem? (Ich stehe Git kritisch gegenüber, nicht Ihrer Lösung). Und nein, Git ist nicht schlecht, aber es hat einige schlechte Teile.

    – Joel M

    1. März 2021 um 5:04 Uhr


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 publicsagen 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/*/*

987140cookie-check.gitignore Ordner ausschließen, aber bestimmte Unterordner einschließen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy