Wie lautet die richtige Syntax für die .gitignore
Datei, um Dateien in einem Verzeichnis zu ignorieren?
Wäre es
config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*
oder
/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*
?
.gitignore
differenzierbare zwischen Dateien und Verzeichnissen , dass es ignoriert? Bedeutetdata
vs zum Beispieldata/
verschiedene Dinge?data
ignoriert übereinstimmende Dateien und Verzeichnisse,data/
ignoriert nur übereinstimmende Verzeichnisse.Antworten:
MUSTERFORMAT
Eine leere Zeile entspricht keinen Dateien und kann daher als Trennzeichen für die Lesbarkeit dienen.
Eine Zeile, die mit beginnt,
#
dient als Kommentar.Ein optionales Präfix,
!
das das Muster negiert. Alle übereinstimmenden Dateien, die von einem vorherigen Muster ausgeschlossen wurden, werden wieder aufgenommen. Wenn ein negiertes Muster übereinstimmt, überschreibt dies Musterquellen mit niedrigerer Priorität.Wenn das Muster mit einem Schrägstrich endet, wird es zum Zweck der folgenden Beschreibung entfernt, es wird jedoch nur eine Übereinstimmung mit einem Verzeichnis gefunden. Mit anderen Worten, stimmt mit
foo/
einem Verzeichnisfoo
und Pfaden darunterfoo
überein, stimmt jedoch nicht mit einer regulären Datei oder einem symbolischen Link überein (dies stimmt mit der allgemeinen Funktionsweise von pathspec in git überein).Wenn das Muster keinen Schrägstrich enthält
/
, behandelt git es als Shell-Glob-Muster und sucht nach einer Übereinstimmung mit dem Pfadnamen relativ zum Speicherort der.gitignore
Datei (relativ zur obersten Ebene des Arbeitsbaums, wenn nicht aus einer.gitignore
Datei).Andernfalls behandelt git das Muster als Shell-Glob, der für den Verzehr
fnmatch(3)
mit demFNM_PATHNAME
Flag geeignet ist : Platzhalter im Muster stimmen nicht mit einem/
im Pfadnamen überein . Zum BeispielDocumentation/*.html
passtDocumentation/git.html
aber nichtDocumentation/ppc/ppc.html
odertools/perf/Documentation/perf.html
.Ein führender Schrägstrich entspricht dem Anfang des Pfadnamens. Zum Beispiel
/*.c
passtcat-file.c
aber nichtmozilla-sha1/sha1.c
.Mehr finden Sie hier
git help gitignore
oder
man gitignore
quelle
man
Seite oder eines offiziellen Dokuments das beste Format für SO ist ...Es wäre das erstere. Gehen Sie auch nach Erweiterungen anstatt nach Ordnerstruktur.
Dh meine Beispiel-C # -Entwicklungs-Ignorierdatei:
Aktualisieren
Ich dachte, ich würde ein Update aus den Kommentaren unten bereitstellen. Obwohl die Frage des OP nicht direkt beantwortet wird, finden Sie im Folgenden weitere Beispiele für die
.gitignore
Syntax.Community-Wiki (wird ständig aktualisiert):
.gitignore für Visual Studio-Projekte und -Lösungen
Weitere Beispiele mit spezifischem Sprachgebrauch finden Sie hier (dank Chris McKnights Kommentar):
https://github.com/github/gitignore
quelle
range
. So passt es*.Obj
auch*.obj
.Pfade, die Schrägstriche enthalten, werden als relativ zu dem Verzeichnis angesehen, das die .gitignore-Datei enthält - normalerweise die oberste Ebene Ihres Repositorys. Sie können sie jedoch auch in Unterverzeichnissen ablegen.
Da die Pfade in allen von Ihnen angegebenen Beispielen Schrägstriche enthalten, sind die beiden Versionen identisch. Das einzige Mal, dass Sie einen führenden Schrägstrich einfügen müssen, ist, wenn noch keiner im Pfad vorhanden ist. Verwenden Sie beispielsweise, um foo nur auf der obersten Ebene des Repositorys zu ignorieren
/foo
. Durch einfaches Schreiben wirdfoo
alles, was als foo bezeichnet wird, irgendwo im Repository ignoriert.Ihre Platzhalter sind ebenfalls überflüssig. Wenn Sie ein gesamtes Verzeichnis ignorieren möchten, benennen Sie es einfach:
Der einzige Grund, Platzhalter so zu verwenden, wie Sie es haben, ist, wenn Sie beabsichtigen, anschließend etwas im Verzeichnis zu ignorieren:
quelle
Ein führender Schrägstrich gibt an, dass der Ignoriereintrag nur für das Verzeichnis gültig sein soll, in dem sich die Gitignore-Datei befindet. Wenn Sie angeben
*.o
, werden alle .o-Dateien in diesem Verzeichnis und alle Unterverzeichnisse/*.o
ignoriert , während sie in diesem Verzeichnis einfach ignoriert werden, während sie wiederum/foo/*.o
nur in /foo/*.o ignoriert werden.quelle
Wenn Sie eine Gitignore-Datei auf der obersten Ebene ablegen und für jeden Ordner darunter verwenden möchten, verwenden Sie sie
/**/
.Um beispielsweise alle
*.map
Dateien in einem/src/main/
Ordner und Unterordnern zu ignorieren, verwenden Sie:quelle
**
. Einer war genug für mich.Beide Beispiele in der Frage sind tatsächlich sehr schlechte Beispiele, die zu Datenverlust führen können!
Mein Rat: Niemals
/*
an Verzeichnisse in .gitignore-Dateien anhängen , es sei denn, Sie haben einen guten Grund!Ein guter Grund wäre zum Beispiel, was Jefromi schrieb: "Wenn Sie beabsichtigen, später etwas im Verzeichnis zu ignorieren" .
Der Grund, warum dies sonst nicht getan werden sollte, ist, dass das Anhängen
/*
an Verzeichnisse einerseits so funktioniert, dass alle Inhalte des Verzeichnisses ordnungsgemäß ignoriert werden, andererseits aber eine gefährliche Nebenwirkung hat:Wenn Sie in Ihrem Repository ausführen
git stash -u
(um verfolgte und nicht verfolgte Dateien vorübergehend zu speichern) odergit clean -df
(um nicht verfolgte, aber ignorierte Dateien zu löschen), werden alle Verzeichnisse, die mit einem angehängten ignoriert/*
werden, irreversibel gelöscht !Einige Hintergrundinformationen
Ich musste das auf die harte Tour lernen. Jemand in meinem Team hat
/*
an einige Verzeichnisse in unserem .gitignore angehängt. Im Laufe der Zeit hatte ich Gelegenheiten, in denen bestimmte Verzeichnisse plötzlich verschwanden. Verzeichnisse mit Gigabyte lokaler Daten, die von unserer Anwendung benötigt werden. Niemand konnte es erklären und ich musste immer alle Daten erneut herunterladen. Nach einer Weile bekam ich eine Vorstellung, dass es damit zu tun haben könntegit stash
. Eines Tages wollte ich mein lokales Repo bereinigen (während ignorierte Dateien beibehalten wurden) und ich benutztegit clean -df
und wieder waren meine Daten weg. Diesmal hatte ich genug und untersuchte das Problem. Ich habe endlich herausgefunden, dass der Grund der angehängte ist/*
.Ich gehe davon aus, dass
directory/*
dies irgendwie dadurch erklärt werden kann, dass alle Inhalte des Verzeichnisses ignoriert werden, nicht jedoch das Verzeichnis selbst. Daher wird es weder als verfolgt betrachtet noch ignoriert, wenn Dinge gelöscht werden. Auch wenngit status
undgit status --ignored
ein etwas anderes Bild darauf geben.Wie zu reproduzieren
Hier erfahren Sie, wie Sie das Verhalten reproduzieren. Ich benutze derzeit Git 2.8.4.
Ein Verzeichnis
localdata/
mit einer Dummy-Datei (important.dat
) wird in einem lokalen Git-Repository erstellt und der Inhalt wird durch Einfügen/localdata/*
in die.gitignore
Datei ignoriert . Wenn jetzt einer der beiden genannten Git-Befehle ausgeführt wird, geht das Verzeichnis (unerwartet) verloren.Wenn Sie eine
git status --ignored
hier machen, erhalten Sie:Jetzt entweder tun
oder
In beiden Fällen ist das angeblich ignorierte Verzeichnis
localdata
verschwunden!Ich bin mir nicht sicher, ob dies als Fehler angesehen werden kann, aber ich denke, es ist zumindest eine Funktion, die niemand braucht.
Ich werde das der Git-Entwicklungsliste melden und sehen, was sie darüber denken.
quelle
Es wäre:
oder möglicherweise sogar:
Für den Fall, dass
filter
undform
die einzigen Verzeichnisse in lib sind, die einbase
Unterverzeichnis haben, das ignoriert werden muss (sehen Sie es als Beispiel dafür, was Sie mit den Sternchen tun können).quelle
Der erste. Diese Dateipfade sind relativ zu Ihrer Gitignore-Datei.
quelle
Ich unterhalte einen GUI- und CLI-basierten Dienst, mit dem Sie
.gitignore
unter https://www.gitignore.io ganz einfach Vorlagen erstellen können .Sie können entweder die gewünschten Vorlagen in das Suchfeld eingeben oder den Befehlszeilenalias installieren und ausführen
$ gi swift,osx
quelle
Eine Beispiel- Gitignore- Datei kann für ein Android Studio-Projekt wie folgt aussehen
quelle