2014-05-25 4 views

Antwort

15

Das mag seltsam erscheinen, aber dies erlaubt uns, Verzeichnisse auf verschiedene Arten abzugleichen: Dateien oder Verzeichnisse irgendwo, Verzeichnisse irgendwo oder Verzeichnisse auf der obersten Ebene. Diese Vielseitigkeit ist sehr nützlich und kann verhindern, dass eine überladene .gitignore.

(FYI, wenn Sie Git 1.8.2+, können Sie git check-ignore verwenden debuggen dabei zu helfen.)


Wenn Sie foo setzen, werden alle Dateien und Verzeichnisse foo dem Namen übereinstimmen.


Wenn Sie foo/ setzen, wird es nur Verzeichnisse foo Namen übereinstimmen.

Wenn das Muster mit einem Schrägstrich endet, wird es für den Zweck der folgenden Beschreibung entfernt, aber es würde nur eine Übereinstimmung mit einem Verzeichnis finden. Mit anderen Worten, foo/passt zu einem Verzeichnis foo und den darunter liegenden Pfaden, passt aber nicht zu einer regulären Datei oder einem symbolischen Link foo (dies entspricht der Art und Weise, wie pathspec im Allgemeinen in Git funktioniert).


Wenn Sie * hinzufügen, wie in foo/*, als Datei glob (bezogen auf die .gitignore) behandelt wird.

Andernfalls behandelt Git das Muster als Schale glob geeignet für den Verzehr durch fnmatch (3) mit der FNM_PATHNAME Flag: Platzhalter in dem Muster wird eine nicht überein/in dem Pfadnamen. Beispiel: "Documentation/*. Html" entspricht "Documentation/git.html", nicht aber "Documentation/ppc/ppc.html" oder "tools/perf/Documentation/perf.html".

So für foo/*, alle Dateien und Verzeichnisse im Verzeichnis auf oberster Ebene Git wird foo ignorieren. Es wird ignorieren foo/dir, foo/file.txt usw. (Technisch gesehen, ist dies nicht foo selbst ignorieren, aber es wird seine Kinder ignorieren. Da jedoch Git Verzeichnisse nicht verfolgen, ist es die gleiche Wirkung hat.)

FYI, foo/** würde haben das gleiche Verhalten.


Meine Empfehlung:

Wenn Sie ein Verzeichnis foo auf der obersten Ebene zu ignorieren, IMO ist es sehr klar, diese Regel zu verwenden:

Ein führender Schrägstrich entspricht die Anfang des Pfadnamens. Beispiel: "/*.c" entspricht "cat-file.c", nicht jedoch "mozilla-sha1/sha1.c".

So können Sie schreiben /foo/, und es wird das Verzeichnis foo auf der obersten Ebene, aber nirgendwo sonst ignorieren.

+1

Ich liebte wirklich Ihre frühere Erklärung, die Sie ausarbeiteten: "Der Grund dafür: Dies ermöglicht Benutzern, Verzeichnisse auf drei Arten zu vergleichen: Dateien oder Verzeichnisse überall, Verzeichnisse überall oder Verzeichnisse auf der obersten Ebene." Sehr schöne einfache Beschreibung des Zwecks von allem :) – stackoverflowuser

+0

@stackoverflowuser, ich habe versucht, für die Kürze zu bearbeiten. Ich stecke es wieder rein. Danke :) –

8

Die entsprechende Passage ist:

Git behandelt das Muster als eine Schale glob geeignet für den Verzehr durch fnmatch, mit:

  • '*' für die oberen Dateien
  • ' ** 'alles drinnen, mit unendlicher Tiefe

fnmatch ist eine Funktion, die überprüft, ob das Zeichenfolgenargument mit dem Musterargument übereinstimmt, das ein Shell-Platzhaltermuster ist.

, die nützlich ist, wenn Unterordner von einer ignorieren Regel des Ausschlusses, wie ich in „How to INCLUDE lib files inside [/Libs/x64/Release] folder in a Git repository“ erwähnen

Libs/**/* 
!Libs/x64/Release/ 

, dass alles außer Libs/x64/Release Ordner ignoriert.

In jedem Fall wird der Befehl git check-ignore -v ist sehr nützlich, die .gitignore Regel gilt für eine bestimmte Datei zu überprüfen.