2010-07-03 7 views
5

Ich habe folgende .gitignore DateiEine Datei in einem Unterverzeichnis nicht ignorieren?

*.pyc 

project/app/dist/* 
project/bin/* 
project/etc/* 
project/var/* 

!README.txt 

So weit so gut, die meisten meiner README.txt Dateien werden nicht außer Acht gelassen werden, so wie ich es mit Ausnahme project/ect/downloads/README.txt passieren soll. Diese Datei wird ignoriert. Warum ist das? Und wie kann ich das beheben?

Wenn ich mich richtig erinnere, kann ich es einfach manuell zu meinem Projekt hinzufügen, aber ich würde gerne lernen, was ich falsch mache, wenn ich die Datei ignoriere.

Antwort

16

Git wird project/etc/downloads/ für alle Dateien nicht suchen, weil Sie es project/etc/* ignorieren konfiguriert haben. Das "nicht verankerte" Muster !README.txt ist nur dazu geeignet, den Ausschluss von Einträgen in Verzeichnissen, die durchsucht werden (d. H. Verzeichnisse, die selbst nicht ausgeschlossen wurden), zu negieren.

Wenn Sie project/etc/ ausschließen, wird Git dieses Verzeichnis niemals durchsuchen, so dass negierte Ausschlüsse niemals auf seinen Inhalt angewendet werden können (nicht einmal ein so expliziter wie !project/etc/important-file! -könnte dies als Fehler angesehen werden?).

Wenn Sie jedoch project/etc/* ausschließen, durchsucht Git dieses Verzeichnis und negierte Ausschlüsse können auf seinen Inhalt angewendet werden. Eine Person könnte erkennen, dass das zweite Muster immer mit allen Dateien übereinstimmt und beiden Mustern dieselbe Bedeutung zuweist, aber Git, aber Git behandelt sie anders.

Sie könnten project/etc/ und project/etc/* gleichbedeutend betrachten, aber Git behandelt sie anders, weil es nicht "erkennt", dass der zweite alles im Verzeichnis abgleichen wird.

Also, um !README.txt in projects/etc/downloads/ anwenden Sie das Verzeichnis Ignorierung wird aber sein Inhalt vor dem !README Muster ignorieren:

project/etc/* 

# "unignore, but ignore the immediate contents of" project/etc/downloads 
# so that subsequent negated patterns can apply to the immediate contents 
!project/etc/downloads/ 
project/etc/downloads/* 

!README.txt 
+0

Danke für die eingehende Antwort! Ich hätte niemals unignore-ignore/* method erraten :) –

+0

Entschuldigung für das Pingen eines alten Beitrags, aber in fast einem Dutzend Antworten auf drei verschiedene Varianten dieser Frage hier auf SO ist dies die erste wirklich befriedigende Lösung, die ich gesehen habe. Danke vielmals! –

+0

Die Ignorierliste muss mit einem '*' abgeschlossen werden. So etwas wie 'public /' wird das Unignore in den nächsten Zeilen ignorieren, es muss 'public/* 'sein. –

3

In der .gitignore Datei nach/Projekt/etc/*, fügen Sie die 2 Zeilen:

 
!/project/etc/downloads/ 
/project/etc/downloads/* 
+1

Hinweis: Diese muss vor dem 'README.txt' Muster für! es hat einen Einfluss auf den Ausschluss von 'Projekt/etc/downloads/*' –

Verwandte Themen