Was sind die Unterschiede zwischen .gitignore und .gitkeep?

1926

Was sind die Unterschiede zwischen .gitignoreund .gitkeep? Sind sie dasselbe mit einem anderen Namen oder haben beide eine andere Funktion?

Ich scheine nicht in der Lage zu sein, viel Dokumentation zu finden .gitkeep.

Matty
quelle

Antworten:

3439

.gitkeep ist nicht dokumentiert, da es keine Funktion von Git ist.

Git kann kein vollständig leeres Verzeichnis hinzufügen . Personen, die leere Verzeichnisse in Git verfolgen möchten, haben die Konvention erstellt, Dateien .gitkeepin diese Verzeichnisse aufzunehmen. Die Datei kann beliebig genannt werden; Git weist diesem Namen keine besondere Bedeutung zu.

Es gibt eine konkurrierende Konvention .gitignore, den leeren Verzeichnissen eine Datei hinzuzufügen , um sie zu verfolgen, aber einige Leute sehen dies als verwirrend an, da das Ziel darin besteht, die leeren Verzeichnisse beizubehalten und nicht zu ignorieren. .gitignorewird auch verwendet, um Dateien aufzulisten, die von Git bei der Suche nach nicht verfolgten Dateien ignoriert werden sollten.

Wooble
quelle
414
Wäre es nicht eine bessere Lösung, eine READMEDatei in das ansonsten leere Unterverzeichnis zu stellen, die einige Informationen darüber enthält, wofür dieses Unterverzeichnis verwendet werden soll? Es scheint verwirrend, eine Datei namens zu haben .gitkeep, die eigentlich nicht Teil von git ist.
Tamouse
423
@tamouse Oft reicht der Pfad des leeren Verzeichnisses (z. B. Namen der Ordner) aus, um seinen Zweck auszudrücken (Beispiele: Vorlagen / Cache, Upload / Daumen usw.). In diesen Fällen fühlt es sich überflüssig an, in jede dieser Dateien eine Readme-Datei einzufügen.
Halil Özgür
16
Personen, die leere Verzeichnisse im Auge behalten möchten, sollten in einer README-Datei angeben, dass das Verzeichnis erstellt werden muss, oder die Verzeichnisse mit ihrem Build-Tool oder einem beliebigen Tool erstellen, für das das Verzeichnis vorhanden sein muss. /
32
@tamouse, @omouse: Eine .gitignoreDatei mit zwei Zeilen: *und !.gitignoreist mehr als ausreichend klar, um zu vermitteln, was los ist. Wenn weitere Ausarbeitungen erforderlich sind, fügen Sie mithilfe der # Syntax einen Kommentar am Anfang der Datei hinzu .
Droogans
63
Es ist anzumerken, dass das beliebte Rails-Framework diese Konvention mithilfe von .keepDateien geringfügig geändert hat, anstatt .gitkeepdiese leeren Ordner beizubehalten, da git nicht das einzige Quellcodeverwaltungssystem ist, das leere Ordner nicht verfolgt. Weitere Details hier: github.com/rails/rails/issues/2800
Claudio Floreani
330

.gitkeepist nur ein Platzhalter. Eine Dummy-Datei, damit Git das Verzeichnis nicht vergisst, da Git nur Dateien verfolgt.


Wenn Sie ein leeres Verzeichnis möchten und sicherstellen möchten, dass es für Git "sauber" bleibt, erstellen Sie ein Verzeichnis .gitignoremit den folgenden Zeilen:

# .gitignore sample
###################

# Ignore all files in this dir...
*

# ... except for this one.
!.gitignore

Wenn Sie möchten, dass nur ein Dateityp für Git sichtbar ist, finden Sie hier ein Beispiel zum Herausfiltern aller .txtDateien mit Ausnahme von .gitignore und allen Dateien:

# .gitignore to keep just .txt files
###################################

# Filter everything...
*

# ... except the .gitignore...
!.gitignore

# ... and all text files.
!*.txt

('#' zeigt Kommentare an.)

sjas
quelle
3
Ich mag diese Praxis selbst. Wenn sich in diesen Verzeichnissen Quellcode befinden würde, wäre .gitkeep nicht erforderlich, und im Allgemeinen werden temporäre / Cache- / Benutzerinhalte generiert, die beim Testen sowieso generiert werden, sodass Sie diese Dateien auch .gitignore müssen
chrisan
1
Warum brauchst du !vor .gitignore? Ist das, um dem Punkt zu entkommen?
Wird
7
@ Will - Nein, das !negiert den folgenden Teil, wie es normalerweise bei der Programmierung der Fall ist.
Sjas
3
Es besteht keine Notwendigkeit zu setzen !.gitignorein einem Git - Datei ignorieren, fügen Sie entweder die Datei dann bearbeiten oder Kraft fügen Sie ihn mit entsprechendem Inhalt ( „*“ alles zu ignorieren, oder gar nichts zu einfach sicherstellen , dass der Ordner vorhanden ist ) weiteres Beispiel .
AD7six
13
Über Ihren Link: Since the git ignore file is already in the repo it is not necessary to not-ignore it - it is already tracked.------ Wenn dies nicht der Fall ist und Sie keine zwingende Hinzufügung vornehmen, können Sie dies möglicherweise vergessen. In trivialen Fällen kein Problem, aber wenn es sich um eine größere Datei handelt, sind Sie möglicherweise verärgert. Die Verwendung !.gitignoreverhindert, dass Sie sich in den Fuß schießen. Ich bevorzuge es, mich in der Vergangenheit verbrannt zu haben.
Sjas
125
.gitignore

ist eine Textdatei, die eine Liste von Dateien in Ihrem Verzeichnis enthält, die git ignoriert oder nicht im Repository hinzufügt / aktualisiert.

.gitkeep

Da Git leere Verzeichnisse zu einem Repository entfernt oder nicht hinzufügt, ist .gitkeep eine Art Hack (ich glaube nicht, dass es offiziell als Teil von Git benannt ist), um leere Verzeichnisse im Repository zu behalten.

Führen Sie einfach eine aus touch /path/to/emptydirectory/.gitkeep, um die Datei hinzuzufügen, und Git kann dieses Verzeichnis nun im Repository verwalten.

Jim Munro
quelle
18
Sie können so viele .gitignores haben, wie Sie möchten, wenn Sie nicht jedes Mal den vollständigen Pfad zu jedem Ordner angeben möchten.
Sjas
1
Ich versuche, leere Verzeichnisse in .gitkeepDateien zu erwähnen, aber es werden keine leeren Verzeichnisse verfolgt. Nur Ordner verfolgen, wo .gitkeepDateien vorhanden sind. warum so?
Pardeep Jain
2
.gitkeep funktioniert nicht wie .gitignore. Es ist keine Liste von Verzeichnissen, die man behalten muss. Es ist lediglich eine leere Datei, die sich in dem Verzeichnis befindet, das Sie behalten möchten. Es kann so benannt werden, wie Sie möchten .keep usw. Sie können also ein Verzeichnis wie / foo / bar haben und die Gitkeep-Datei lautet /foo/bar/.gitkeep
Jim Munro
@sjas Wie würden .gitignoreSie durch mehrere s davon abgehalten, jedes Mal den vollständigen Pfad zu jedem Ordner anzugeben? Ich glaube, mir fehlt etwas Offensichtliches.
Willwsharp