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
Danke für die eingehende Antwort! Ich hätte niemals unignore-ignore/* method erraten :) –
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! –
Die Ignorierliste muss mit einem '*' abgeschlossen werden. So etwas wie 'public /' wird das Unignore in den nächsten Zeilen ignorieren, es muss 'public/* 'sein. –