Ich versuche, die .gitignore
Syntax klarer zu verstehen , insbesondere was https://github.com/github/gitignore gitignores betrifft.
Ich sehe, dass der führende Schrägstrich verwendet wird, um nur Pfadnamen relativ zum Speicherort der .gitignore
Datei abzugleichen (von http://git-scm.com/docs/gitignore ):
Ein führender Schrägstrich entspricht dem Anfang des Pfadnamens. Zum Beispiel entspricht "/*.c" "cat-file.c", aber nicht "mozilla-sha1 / sha1.c".
Aber was passiert, wenn ich den führenden Schrägstrich entferne? Soweit ich verstanden habe, gibt es zwei Fälle:
- Wenn das Muster keinen Schrägstrich enthält (oder nur einen abschließenden Schrägstrich enthält, was bedeutet, dass es mit einem Verzeichnis übereinstimmen sollte), wird die Suche im gesamten Verzeichnisbaum durchgeführt. Zum Beispiel kann das Muster
dir/
paßt auf<root>/dir
,<root>/a/dir
,<root>/a/b/c/.../dir
usw., wobei<root>
die Lage der ist -.gitignore
Datei. - Wenn das Muster einen Schrägstrich enthält, der sich nicht in der hinteren Position befindet (es ist nicht das letzte Zeichen), wird es nur mit Pfadnamen relativ zum
.gitignore
Dateispeicherort abgeglichen .
Dies sind die Beispiele, die ich gemacht habe, um dieses Verhalten zu überprüfen:
# Directory structure:
<root>
├─ dir/
│ └─ test
├─ src/
│ ├─ dir/
│ │ └─ test
test file is there only because Git does not track empty directories.
Erster Test:
# .gitignore
dir/
# git status
nothing to commit
Git ignoriert also beide dir
Verzeichnisse. Dies steht im Einklang mit Fall Nummer 1: Das Muster hat keine Schrägstriche (mit Ausnahme des nachfolgenden), sodass Git den gesamten Verzeichnisbaum überwacht und alles ignoriert, was mit dem Muster übereinstimmt.
Zweiter Test:
# .gitignore
/dir/
# git status
Untracked files:
src/
Hier ignoriert Git dir
dank des führenden Schrägstrichs im Muster nur das Verzeichnis direkt unter dem Stammverzeichnis.
Dritter Test:
# .gitignore
dir/*
# git status
Untracked files:
src/
Dies steht im Einklang mit Fall Nummer 2: Das Muster enthält einen Schrägstrich, sodass es ab dem Stammverzeichnis als Pfadname betrachtet wird.
Jetzt ist es Zeit für die eigentliche Frage. Betrachten wir diese Gitignore-Datei : Wenn sie beispielsweise das Verzeichnis ignorieren downloader/
, ignorieren sie dann nicht tatsächlich jedes einzelne downloader
Verzeichnis, das im gesamten Verzeichnisbaum gefunden wird? Das ist es, woran ich seit dem, was ich zuvor über Gits Arbeit gesehen habe, denken muss.
Wenn ich also zufällig ein benutzerdefiniertes Modul mit einem downloader
Verzeichnis darin habe, wird es dann unerwartet ignoriert, ebenso wie das reguläre im Stammverzeichnis von Magento? Dies ist eine etwas rethorische Frage, da sie mir tatsächlich bereits passiert ist und einen wirklich schwer zu findenden Fehler erzeugt hat.
Also, in der Magento - .gitignore
Datei (was ich zu beziehen bin nur als Beispiel, btw) eine Menge der Muster Schrägstriche enthält, so dass sie richtig gegen Pfadnamen abgestimmt sind von der Wurzel beginnen, aber es gibt einige Fälle, wie downloader/
oder errors/
dass , wenn ich mich nicht irre, sind potenziell gefährlich und sollten wahrscheinlich in /downloader/
und geändert werden /errors/
.
Als allgemeinere Frage sollte ich immer den führenden Schrägstrich für Muster verwenden, die keine Schrägstriche enthalten (mit Ausnahme des nachfolgenden), wenn ich einen Pfadnamen explizit ausgehend von root auswählen möchte, und ihn nicht für Muster verwenden, die Schrägstriche enthalten, oder sollte ich Verwenden Sie zur Verdeutlichung immer den führenden Schrägstrich? Was denkst du darüber?
Vielen Dank fürs Lesen und Entschuldigung für den langen Beitrag.
Antworten:
Ich wollte nur für eine mögliche schnelle zukünftige Referenz zusammenfassen - der führende Schrägstrich verankert die Übereinstimmung mit der Wurzel. Im folgenden Beispiel würde der Platzhalter ohne den Schrägstrich auch alles in foo ausschließen, da er
*
den Baum rekursiv nach unten bewegt. Mit/*
schließt es jedoch alles außer dem Ordner foo und seinem Inhalt aus:quelle
Sie haben Ihre eigene Frage vollständig beantwortet. Wenn Sie sich das Github / Gitignore-Repo genauer ansehen, werden Sie feststellen, dass die meisten Dateien inkonsistente Regeln für das Schreiben von Mustern verwenden. Es ist sehr wahrscheinlich, dass die meisten von Leuten beigesteuert wurden, die sich nicht die Mühe gemacht haben, die Dokumentation zu lesen oder Dinge zu testen, wie Sie es getan haben.
Wenn das hilft: Sie haben Recht, seien Sie zuversichtlich.
Wenn Sie in solchen Kooperationsprojekten Fehler sehen, zögern Sie nicht, Ihr Wissen einzubringen. Es gibt sogar einen Präzedenzfall, wenn Sie Ihr Vertrauen weiter stärken müssen.
quelle