Angenommen, ich habe ein Verzeichnis ignoriert, möchte jedoch bestimmte Unterverzeichnisse darin aufheben. Also habe ich das Setup:
/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/
Und ich möchte alles außer dem KEEP_ME
Verzeichnis ignorieren . Ich würde hoffen, dass das Ignorieren ungefähr so aussieht:
/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/
Aber das funktioniert nicht und es gibt auch nicht mehrere Permutationen zum selben Thema.
Eine, die funktioniert, ist
/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/
Aber das fühlt sich ein wenig restriktiv und ausführlich an?
Antworten:
Entsprechend dem Musterformatabschnitt der gitignore-Dokumentation :
Daher muss das zuvor ausgeschlossene übergeordnete Verzeichnismuster
/uploads/rubbish/stuff/keep/
ausschließlich negiert werden, bevor sein Inhalt negiert wird:Um Unterverzeichnisse aufzunehmen,
/uploads/rubbish/stuff/keep/
fügen Sie die dritte Zeile hinzu:quelle
.gitignore
und es funktioniert großartig!*.zip
Selbst wenn Sie etwas hinzufügen
.gitignore
, können Sie git zwingen , es dem Index hinzuzufügen"KEEP_ME" scheint jedoch ein Verzeichnis zu sein und git mag normalerweise keinen leeren Ordner. Daher sollten Sie stattdessen eine "Platzhalter" -Datei-Datei hinzufügen, wenn der Ordner leer ist
quelle
git add --force
für jedes neue Element oder jeden neuen Ordner in verwendenKEEP_ME
.git add -u
Danach werden Updates nur hinzugefügt (wenn Sie beispielsweise eine ausführen), als wären die Dateien "nicht signiert". Das.keep_me
macht nichts, es ist nur eine Datei, damit git den Ordner bearbeitet.git add --force
ist die falsche Lösung dafür. Wenn Sie ein Verzeichnis verschieben oder die Datei in ein anderes Verzeichnis verschieben, löscht gits Tracking die Datei, fügt sie jedoch nicht dem neuen Speicherort hinzu, und Sie müssen diesgit add --force
erneut tun . Durch Aufheben der Zuordnung zu einem generischen Muster verfolgt git die Bewegung einer Datei innerhalb des Repos.Ich habe versucht herauszufinden, wie ein bestimmter Ordner eingeschlossen werden kann, wenn alle Ordner mit dem generischen Ausschluss ausgeschlossen werden
Wenn Sie das
/*
am Ende Ihres generischen Ausschlusses hinzufügen , schließen Sie weiterhin alle Build-Dateien aus**/build/*
Anschließend fügen Sie eine weitere Zeile hinzu, um den Pfad zu korrigieren, der eingeschlossen werden soll
Lassen Sie uns einen Gitignore, der liest
quelle
Die Antworten von Buo-Ren Lin und John sind sehr hilfreich, aber ich musste beide kombinieren.
Wenn ich andere Unterordner sowie Dateien innerhalb von Uploads ausschließen wollte, musste ich vor dem angegebenen Ordner explizit beliebige Verzeichnisse angeben, sowohl beim Ausschließen des Ordners als auch beim Einschließen des Unterordners
Ich fand es auch notwendig, sowohl den Unterordner als auch seinen Inhalt explizit wieder einzuschließen, um beide Elemente im Ordner und in den Unterordnern anzuzeigen.
quelle
Die Lösung, die als die am besten bewertete Antwort dargestellt wird, ist falsch und als solche leicht nachweisbar.
Beginnen Sie damit, alles in Uploads / * zu ignorieren:
Heben Sie nun das übergeordnete Verzeichnis des ignorierten Materials wie oben beschrieben auf:
Zeigt keine nicht verfolgten Dateien an.
Damit es funktioniert, müssen Sie alle Dateien unter dem
uploads/
Baum (uploads/**/*
nicht nur die oberste Ebeneuploads/*
) ignorieren und dann alle übergeordneten Verzeichnisse des Baums hinzufügen, die Sie behalten möchtenWelches gibt:
Wenn wir früher hatten
uploads/*
in der.gitignore
oben, dann wird alle Zwischendateien enthalten gewesen wären als gut, so zum Beispieluploads/rubbish/a
zeigen würde , oben in dem Statusbefehl auf.quelle