Wann wird ein führender Schrägstrich in Gitignore verwendet?

108

Ich versuche, die .gitignoreSyntax 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 .gitignoreDatei 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:

  1. 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/.../dirusw., wobei <root>die Lage der ist - .gitignoreDatei.
  2. 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 .gitignoreDateispeicherort 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 dirVerzeichnisse. 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 dirdank 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 downloaderVerzeichnis, 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 downloaderVerzeichnis 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 - .gitignoreDatei (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.

Swahnee
quelle
8
Tolle Frage und wirklich nette Erklärung, das hat mich auch gestört und deine Nachforschungen haben mir die Dinge klar gemacht. Nachdem ich dies gelesen habe, würde ich sagen, dass es eine gute Praxis ist, Pfade immer mit einem Schrägstrich zu beginnen, wenn sie von root ausgehen sollen. Dies macht die Absicht offensichtlicher.
Martinsos
4
Danke :) Ich stimme Ihrer Anmerkung zur Verwendung von Schrägstrichen zu, um Absichten deutlicher zu machen.
Swahnee
8
Dies sollte Teil der .gitignore-Dokumentation sein. Viel einfacher zu verstehen!
Rmorrin
Ich würde gerne sehen, wie dieser großartige Beitrag in Frage- und Antwortabschnitte unterteilt wird ...
Barett

Antworten:

25

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:

$ cat .gitignore
/*
!/foo
Sonnenwende333
quelle
24

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.

tne
quelle