Sind mehrere `.gitignore`s verpönt?

238

Wenn ein Repo nicht aus mehreren unabhängigen Projekten besteht, scheint es am einfachsten zu sein, nur eine .gitignoreDatei im Stammverzeichnis des Repos zu haben als verschiedene. Gibt es eine Standard-Best Practice für diese oder eine Online-Analyse, wann ein Ansatz besser ist als der andere?

Conley Owens
quelle

Antworten:

253

Ich kann mir mindestens zwei Situationen vorstellen, in denen Sie mehrere .gitignoreDateien in verschiedenen (Unter-) Verzeichnissen haben möchten .

  • Unterschiedliche Verzeichnisse haben unterschiedliche Dateitypen, die ignoriert werden müssen. Beispielsweise .gitignoreignoriert das Verzeichnis im obersten Verzeichnis Ihres Projekts generierte Programme, während Documentation/.gitignoredie generierte Dokumentation ignoriert wird.

  • Ignorieren angegebenen Dateien nur in bestimmten (Unter-) Verzeichnis (Sie verwenden können , /sub/fooin .gitignore, obwohl).

Bitte denken Sie daran, dass Muster in der .gitignoreDatei rekursiv auf das (Unter-) Verzeichnis angewendet werden, in dem sich die Datei befindet, und auf alle ihre Unterverzeichnisse, es sei denn, das Muster enthält '/' (z. B. namegilt das Muster für alle namein einem bestimmten Verzeichnis und allen Unterverzeichnissen genannten /nameDateien , während es für die Datei gilt mit diesem Namen nur im angegebenen Verzeichnis).

Jakub Narębski
quelle
1
Ah, aus irgendeinem Grund dachte ich, dass /Documentation/*.html dies abdecken würde, aber ich denke, dass der Platzhalter * nur mit Verzeichnissen auf einer Ebene übereinstimmt.
Conley Owens
9
@ ConleyOwens: Mit modernem Git können Sie verwenden Documentation/**/*.html(beachten Sie, dass jeder Schrägstrich das Muster verankert; der /foowird verwendet, um die Datei direkt im Verzeichnis zu verankern)
Jakub Narębski
97

Als tangentiale Anmerkung ist ein Fall, in dem die Möglichkeit, mehrere .gitignoreDateien zu haben, sehr nützlich ist, wenn Sie ein zusätzliches Verzeichnis in Ihrer Arbeitskopie wünschen, das Sie niemals festschreiben möchten. Fügen Sie einfach ein 1-Byte .gitignore(das nur ein einzelnes Sternchen enthält) in dieses Verzeichnis ein und es wird niemals in git statususw. angezeigt.

Aristoteles Pagaltzis
quelle
4
Sie können auch die Datei ".git / info / exclude" verwenden
Ayell
10
Sicher, wenn es Ihnen nichts ausmacht, eine Datei an einem Ort außerhalb des Repository-Stamms öffnen zu müssen, schreiben Sie einen ganzen Pfad hinein und denken Sie daran, den Eintrag zu bereinigen, wenn Sie das Verzeichnis löschen. Vergleichen Sie das mit printf \* > .gitignore(die Bereinigung erfolgt automatisch, wenn Sie das Verzeichnis löschen). Ich bin sicher, dass es Situationen gibt, in denen .git/info/excludedie Wahl besser ist, aber nicht viele.
Aristoteles Pagaltzis
Ja, wenn Sie eine Datei anstelle eines Ordners ausschließen möchten, zum Beispiel: p
Ayell
4
In meiner Antwort sagte ich: "Wenn Sie ein zusätzliches Verzeichnis in Ihrer Arbeitskopie möchten, das Sie niemals festschreiben möchten".
Aristoteles Pagaltzis
1
Da es im Root .gitignore weniger Unordnung schafft, gefällt mir dieser Ansatz sehr gut.
David A. Gray
59

Sie können mehrere haben .gitignore, jeder natürlich in einem eigenen Verzeichnis.
Um herauszufinden , welche gitignore Regel verantwortlich ist eine Datei, die Verwendung zu ignorieren git check-ignore: git check-ignore -v -- afile.

Und Sie können eine andere Version einer .gitignoreDatei pro Zweig haben: Ich habe diese Art von Konfiguration bereits gesehen, um sicherzustellen, dass ein Zweig eine Datei ignoriert, während der andere Zweig dies nicht tut: siehe diese Frage zum Beispiel .

Wenn Ihr Repo mehrere unabhängige Projekte enthält, ist es jedoch am besten, diese als Submodule zu bezeichnen .
Dies wären die tatsächlichen Best Practices, mit denen jedes dieser Projekte unabhängig (mit den jeweiligen .gitignoreDateien) geklont werden kann, während auf eine bestimmte Revision in einem globalen übergeordneten Projekt verwiesen wird.
Weitere Informationen finden Sie unter Die wahre Natur von Submodulen .


Beachten Sie, dass Sie seit Git 1.8.2 (März 2013) a git check-ignore -v -- yourfileausführen können, um zu sehen, welcher Gitignore-Lauf (von welcher .gitignoreDatei) auf ' yourfile' angewendet wird , und um besser zu verstehen, warum diese Datei ignoriert wird.
Siehe " Welche gitignoreRegel ignoriert meine Datei? "

VonC
quelle
17

Pro Single

  • Einfach zu finden.

  • Das Aufspüren von Ausschlussregeln kann ziemlich schwierig sein, wenn ich mehrere Gitignore auf mehreren Ebenen im Repo habe.

  • Bei mehreren Dateien kommt es in der Regel auch zu einer gewissen Duplizierung.

Pro mehrere

  • Umfang "Wissen" auf den Teil des Dateibaums, in dem es benötigt wird.

  • Da Git nur Dateien verfolgt, ist ein leerer Gitignore die einzige Möglichkeit, ein "leeres" Verzeichnis festzuschreiben.

    (Und vor Git 1.8 war die einzige Möglichkeit, ein Muster wie dieses auszuschließen my/**.example, das Erstellen my/.gitignoremit dem Muster **.foo. Dieser Grund gilt jetzt nicht mehr, wie Sie es tun können /my/**/*.example.)


Ich bevorzuge eine einzelne Datei, in der ich alle Ausschlüsse finden kann. Ich habe noch nie .svn pro Verzeichnis verpasst, und ich werde auch .gitignore pro Verzeichnis nicht verpassen.

Das heißt, mehrere Gitignoren sind ziemlich häufig. Wenn Sie sie verwenden, sollten Sie sie zumindest konsequent verwenden, damit sie angemessen funktionieren. Sie können sie beispielsweise nur eine Ebene vom Stamm entfernt in Verzeichnisse einfügen.

Paul Draper
quelle
"Ein leerer Gitignore ist die einzige Möglichkeit, ein" leeres "Verzeichnis festzuschreiben." Tatsächlich finde ich, dass das Hochladen einer einzelnen README-Datei (oder einer dafür benannten Datei empty) häufiger vorkommt.
März 2377
6
.gitkeep ist auch eine gute Möglichkeit, dies zu tun ... nur eine weitere Konvention. Ich mag die Idee, eine Readme-Datei zu verwenden, weil Sie dann in dieser Readme-Datei erklären können, wofür das Verzeichnis verwendet wird.
Gavin Pickin
8

Es gibt viele Szenarien , in denen Sie ein Verzeichnis Ihrer Git Repo begehen wollen , aber ohne die Dateien darin, zum Beispiel der logs, cache, uploadsVerzeichnisse usw.

Ich füge also immer eine .gitignoreDatei in diesen Verzeichnissen mit folgendem Inhalt hinzu:

*
!.gitignore

Mit dieser .gitignoreDatei verfolgt Git keine Dateien in diesen Verzeichnissen, ermöglicht mir jedoch, die .gitignoreDatei und damit das Verzeichnis selbst zum Repo hinzuzufügen .

Lukman
quelle