Wie funktionieren negierte Muster in .gitignore?

91

Ich versuche, eine Gitignore-Datei mit negierten Mustern (Zeilen beginnend mit!) Zu verwenden, aber es funktioniert nicht so, wie ich es erwartet habe.

Als minimales Beispiel habe ich die folgende Verzeichnisstruktur:

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt

und in meiner Gitignore-Datei habe ich Folgendes:

aaa/
!aaa/ccc/

Mein Verständnis (basierend auf dieser Dokumentseite ) ist, dass die Datei aaa / ccc / otherfile.txt nicht ignoriert werden sollte, aber tatsächlich ignoriert git alles unter aaa.

Verstehe ich diesen Satz falsch: "Ein optionales Präfix!, Das das Muster negiert; jede übereinstimmende Datei, die von einem vorherigen Muster ausgeschlossen wurde, wird wieder aufgenommen."

Übrigens ist dies unter Windows mit msysgit 1.7.0.2.

Chris Perkins
quelle

Antworten:

156

Ich denke, was Sie eigentlich tun möchten, ist:

aaa/*
!aaa/ccc

Du sagst es "schau nicht rein aaa", also untersucht es niemals den Weg aaa/ccc. Wenn Sie den Platzhalter verwenden, liest er immer noch den Inhalt von aaa, dann stimmt jeder Eintrag mit dem Platzhalter überein und wird ignoriert, außer aaa/cccder, der wieder eingefügt wird.

Cascabel
quelle
2
@iconoclast: Dann machst du wahrscheinlich etwas anderes. Stellen Sie eine weitere Frage (mit vollständigen Informationen), wenn Sie Hilfe benötigen.
Cascabel
Dies funktionierte auch nicht für mich: / apps / *! / Apps / myApps / FluidTest / bin /
Jarrod Smith
5
@ Jarrod Es funktioniert; du machst nur etwas anderes. Sie müssen diese Methode aus genau den in der Antwort angegebenen Gründen rekursiv verwenden. ! apps / myApps, apps / myApps / * und so weiter.
Cascabel
Ahh sorry ich verstehe jetzt. Aber SO lässt mich nicht wieder abstimmen.
Jarrod Smith
Ich frage mich, warum es bei aaa / ** / * nicht funktioniert! Aaa / ccc / eee (ignoriere alles außer Dateien auf einem bestimmten Pfad)
Phương Nguyễn
19

Wenn Sie alles ausschließen möchten aaa, aber aaa/cccalles darunter einschließen möchten , sollten Sie Folgendes verwenden:

aaa/*
!aaa/ccc
!aaa/ccc/*

Die erste Zeile weist git an, alles darunter zu ignorieren aaa, die zweite sagt ihm, dass er den Ordner nicht ignorieren soll, der aaa/cccdie dritte Zeile tatsächlich "aktiviert", die dann anweist, nicht alles darunter zu ignorieren aaa/ccc.

xmak
quelle
1
Die dritte Zeile machte für mich keinen Unterschied.
James Hopkin
2
Um alles in jedes Unterverzeichnis aaa/cccauf jeder Ebene aufnehmen zu können, funktionierte für mich !aaa/ccc/**stattdessen!aaa/ccc/*
boclodoa
3

Wenn jemand immer noch keine neu ignorierten Elemente in einer git statuslaufenden git update-indexHand sieht, kann git helfen, die Änderungen zu sehen (zumindest in Version 1.9.x von gitbash).

alexkb
quelle