Ich bin verwirrt darüber, wie man den Inhalt eines Verzeichnisses in git richtig ignoriert.
Angenommen, ich habe die folgende Verzeichnisstruktur:
my_project
|--www
|--1.txt
|--2.txt
|--.gitignore
Was ist der Unterschied zwischen diesem:
www
Und das?
www/*
Der Grund, warum ich diese Frage stelle, ist: Wenn in git ein Verzeichnis leer ist, wird git ein solches leeres Verzeichnis nicht in das Repository aufnehmen. Also habe ich die Lösung ausprobiert, bei der eine zusätzliche Gitkeep-Datei unter dem Verzeichnis hinzugefügt wird, damit sie nicht leer ist. Als ich diese Lösung ausprobiert habe, schreibe ich in der .gitignore-Datei wie folgt:
www
!*.gitkeep
Es funktioniert nicht (Ich beabsichtige, alle Inhalte unter www zu ignorieren, aber das Verzeichnis beizubehalten). Aber wenn ich folgendes versuche:
www/*
!*.gitkeep
Dann funktioniert es! Ich denke, es muss einige Unterschiede zwischen den beiden Ansätzen geben.
bin
undbin/
besteht darin, dass erstere Dateien oder Ordner ignorieren, letztere nur Ordner. Ich kenne den Unterschied nicht mitbin/*
Antworten:
Im moment gibt es Unterschiede zwischen
www
,www/
undwww/*
.Grundsätzlich finden Sie in der Dokumentation und in meinen eigenen Tests
www
eine Übereinstimmung mit einer Datei oder einem Verzeichnis, diewww/
nur mit einem Verzeichniswww/*
übereinstimmt , während Verzeichnisse und Dateien darin übereinstimmenwww
.Ich werde nur auf die Unterschiede zwischen
www/
undwww/*
hier eingehen, da die Unterschiede zwischenwww
undwww/
offensichtlich sind.Denn
www/
git ignoriert das Verzeichniswww
selbst, was bedeutet, dass git nicht einmal hineinschaut. Aber fürwww/*
git überprüft git alle Dateien / Ordner im Innerenwww
und ignoriert sie alle mit dem Muster*
. Es scheint zu den gleichen Ergebnissen zu führen, da git einen leeren Ordner nicht verfolgt,www
wenn alle untergeordneten Dateien / Ordner ignoriert werden. Und in der Tat werden die Ergebnisse für den Fall von OP mitwww/
oder für sichwww/*
allein keinen Unterschied machen . Aber es macht Unterschiede, wenn es mit anderen Regeln kombiniert wird.Was ist zum Beispiel, wenn wir
www/1.txt
alle anderen nur einschließen, aber ignorieren wollenwww
?Folgendes
.gitignore
wird nicht funktionieren.Während das Folgende
.gitignore
funktioniert, warum?Bei ersteren ignoriert git das Verzeichnis einfach
www
und schaut nicht einmal hinein, um eswww/1.txt
erneut einzuschließen. Die erste Regel schließt das übergeordnete Verzeichnis aus,www
jedoch nichtwww/1.txt
, undwww/1.txt
kann daher nicht " wieder aufgenommen " werden.Bei letzterem ignoriert git jedoch zuerst alle Dateien / Ordner unter
www
und schließt dann wieder eine davon einwww/1.txt
.In diesem Beispiel können die folgenden Zeilen in der Dokumentation hilfreich sein:
quelle
www/1.txt
undwww/
würdest dann das Gleiche tun wie beim zweiten Ansatz ...Ich analysiere nur die Dokumentation, und soweit ich das beurteilen kann, unterscheiden sie sich nur in fortgeschritteneren Mustern, z
Ich habe Test der oben und wenn Sie ersetzen
!/foo
mit!/foo/*
, man bekommt in der Tat ein anderes Ergebnis.Hinweis
Schließt jede Datei aus
foo
, aberschließt nur Verzeichnisse mit dem Namen foo aus.
quelle
Abgesehen von den perfekten Antworten, die Sie bereits erhalten haben, sollten Sie beachten, dass Sie sie
.gitignore
überall in Ihrem Projekt haben können, einschließlich Unterordnern.So möchten , wenn Sie alle Dateien in ignorieren
www
, aber whant derwww
Ordner versioniert werden, anstatt einen leeren verwenden.gitkeep
,.dummy
oder was auch immer nennen Sie sich entscheiden, warum nicht nutzen.gitignore
es, zu sagen , alle Dateien zu ignorieren?Im Stammverzeichnis
.gitignore
(a) sagen Sie nichts über denwww
Ordner oder dessen Inhalt.In
www/.gitignore
(b) geben Sie Folgendes ein:Auf diese Weise sieht alles besser organisiert aus (zumindest für mich).
quelle
Um alles in einem Verzeichnis außer Punktedateien zu ignorieren, können Sie das folgende Glob-Muster in Ihrem Verzeichnis verwenden
.gitignore
:Sie brauchen also kein Extra
.gitignore
, sondern fügen einfach eine.keep
Datei zu Ihremwww
Verzeichnis hinzu.quelle