Wie füge ich der Gitignore-Datei Dateien ohne Punkte hinzu (alle Dateien ohne Erweiterung)?

110

Wie der Titel schon sagt, ist es möglich, der gitignore-Datei "Dateien ohne Punkte" hinzuzufügen?

Ich kann mir vorstellen, dass dies all diese lästigen Dateien ohne Erweiterung erledigen würde.

Die Unfun Cat
quelle
2
Es gibt einige erweiterungs Dateien , die Sie nicht ignorieren wollen: README, LICENSEoder COPYING, INSTALL, Makefileusw., obwohl Sie immer-add zwingen, und dann werden sie verfolgt
Jakub Narębski
@ JakubNarębski guter Punkt. Ich habe es in meine Antwort aufgenommen, um mehr Sichtbarkeit zu erreichen.
VonC
Mögliches Duplikat von Gitignore ohne Binärdateien
Mad Physicist

Antworten:

120

Sie können eine ähnliche Kombination ausprobieren:

*
!/**/
!*.*

Diese gitignoreAusschlussregel (ein negiertes Muster ) sollte alle Dateien außer denen mit einer Erweiterung ignorieren.

Wie unten von Mad Physicist erwähnt , lautet die Regel:

Es ist nicht möglich, eine Datei erneut einzuschließen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen ist. (*)
(*: es sei denn, bestimmte Bedingungen sind in Git 2.?+ erfüllt, siehe unten)

Aus diesem Grund !/**/ist es wichtig, die übergeordneten Ordner rekursiv in die weiße Liste aufzunehmen, wenn Dateien in die weiße Liste aufgenommen werden sollen.

Ich erwähnte dieselbe Regel in ähnlichen Fällen wie:


Wie Jakub Narębski kommentiert , möchten Sie möglicherweise nicht alle Dateien ohne Erweiterung ignorieren .

Mein Rat:

  • Fügen Sie zuerst die wichtige Datei ohne Erweiterung hinzu
  • Bearbeiten Sie dann Ihre .gitignoreDateien wie oben gezeigt: Die bereits versionierten Dateien werden nicht ignoriert (auch wenn sie keine Erweiterung haben). Alle anderen werden ignoriert.

Für zukünftige erweiterungslose Dateien, die Sie versionieren möchten:

git add -f -- myFile

Beachten Sie, dass es mit git 2.9.x / 2.10 (Mitte 2016?) Möglicherweise möglich ist, eine Datei erneut einzuschließen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen wird, wenn der wieder aufgenommene Pfad keinen Platzhalter enthält .

Nguyễn Thái Ngọc Duy ( pclouds) versucht, diese Funktion hinzuzufügen:

Da jedoch eine der Regeln für die Wiedereingliederung lautete:

Der Verzeichnisteil in den Regeln zum erneuten Einschließen muss wörtlich sein (dh keine Platzhalter).

Das hätte hier sowieso nicht funktioniert.

VonC
quelle
1
Die Antwort ist völlig richtig. Aber vielleicht besser .gitignorewäre **und !**.*. Ich weiß, dass dies keinen Unterschied macht, wenn das Sternchen vorne platziert wird, aber es ist expliziter und fundierter, wie Muscheln mit Platzhaltern umgehen ...
Willem Van Onsem
7
Hinweis: Um mit anderen Ausschlussregeln arbeiten zu können, muss dies der erste Regelsatz in Ihrer .gitignore-Datei sein
Erik
Sie können auch bestimmte erweiterungslose Dateien wieder einschließen, z !Makefile. B. mit . Beachten Sie, dass ich Probleme mit dieser Lösung in Git 1.7.1 hatte, während sie in 1.9.0 einwandfrei funktionierte. In meinem Fall funktionierte das Hinzufügen einer Datei im Stammverzeichnis einwandfrei, aber das Hinzufügen einer Datei mit einer Erweiterung in einem Unterverzeichnis wurde als ignoriert angezeigt. Dies scheint daran zu liegen, dass 1.7.1 das **Muster noch nicht unterstützt hat, siehe hier !
mxmlnkn
1
**wurde in Git hinzugefügt 1.8.2. Gibt es einen Nachteil gegenüber der Verwendung !*/anstelle von !/**/?
mxmlnkn
@TamaMcGlinn Das sieht aus wie ein regulärer Ausdruck: gitignore unterstützt keine regulären Ausdrucke.
VonC
50
*
!*/
!*.*

* sagt git, alles zu ignorieren.

!*/hebt dann alles auf, was ein Verzeichnis ist. Das ist entscheidend.

!*.* hebt die Zuordnung aller Dateien mit einer Erweiterung auf.

Ohne die !*/Regel würden Verzeichnisse ohne ein .im Namen nicht aufgelistet und keine Ihrer gewünschten Dateien würde außerhalb des Stammordners hinzugefügt.

Als Referenz lesen Sie diese beiden Abschnitte in der .gitignore Dokumentation auffallen:

Ein optionales Präfix "!" was das Muster negiert; Alle übereinstimmenden Dateien, die von einem vorherigen Muster ausgeschlossen wurden, werden wieder aufgenommen. Es ist nicht möglich, eine Datei erneut einzuschließen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen ist. Git listet aus Leistungsgründen keine ausgeschlossenen Verzeichnisse auf, daher haben alle Muster in enthaltenen Dateien keine Auswirkung, unabhängig davon, wo sie definiert sind. Setzen Sie einen Backslash ("\") vor das erste "!" für Muster, die mit einem wörtlichen "!" beginnen, zum Beispiel "! wichtig! .txt".

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, foo / stimmt mit einem Verzeichnis foo und Pfaden darunter überein, stimmt jedoch nicht mit einer regulären Datei oder einem symbolischen Link foo überein (dies stimmt mit der allgemeinen Funktionsweise von pathspec in Git überein).

Verrückter Physiker
quelle
1
Guter Fang. +1. Ich hatte vergessen, meine Antwort mit der Regel zu aktualisieren, die ich kürzlich in anderen Antworten von Minen verwendet hatte. Ich habe meine Antwort entsprechend aktualisiert.
VonC
0

In meinen Ordnern befinden sich viele Dateien mit *.c, *.h, *.txt, *.csvusw. Erweiterungen und Binärdateien ohne Erweiterung. Also musste ich alle ausgeführten Dateien ignorieren *.c,*.hund .gitignore, so funktioniert das für mich aus dem .gitignoreBeispiel:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
Antranig Avakian
quelle