Wie verfolge ich Verzeichnisse, aber nicht deren Dateien mit Git?


85

Ich habe vor kurzem angefangen, Git zu verwenden und habe Probleme mit nur einer Sache. Wie kann ich Verzeichnisse verfolgen, ohne deren Inhalt zu verfolgen?

Zum Beispiel erlaubt die Site, an der ich arbeite, Uploads. Ich möchte das Upload-Verzeichnis so verfolgen, dass es beim Verzweigen usw. erstellt wird, aber offensichtlich nicht die darin enthaltenen Dateien (Testdateien während der Entwicklungsverzweigung oder die realen Dateien im Master).

In meinem .gitignore habe ich Folgendes:

Uploads /*.*

Habe auch versucht (was das ganze Verzeichnis ignoriert):

Uploads /

Dieses Verzeichnis kann auch Unterverzeichnisse enthalten (Uploads / Thumbs / Uploads / Videos /). Ich möchte diese, aber nicht ihre Dateien verfolgen können.

Ist das mit Git möglich? Ich habe überall gesucht, ohne eine Antwort zu finden.


Git verfolgt nur Dateien. Sie können mit Git-Hooks herumspielen und eine Datei verfolgen, die die Verzeichnisliste enthält (automatisch mithilfe der Hooks generiert). Obwohl ich nicht ganz sicher bin, ob das möglich wäre.
Šimon Tóth

Konkreter: Git verfolgt den Inhalt und (für Git) ein leeres Verzeichnis ist kein Inhalt. Sie können sich streiten, ob Sie zustimmen oder nicht, aber als weitere "Problemumgehung" können Sie darüber nachdenken, die Verzeichnisse bei Build / Installation / bei Bedarf zu erstellen. Allerdings: Ich benutze auch die " .placeholder-file" -Lösung;)
KingCrunch

1
Anstatt .placeholder zu verwenden, verwende ich eine .gitignore-Datei. Dies kümmert sich nicht nur um die Ausschlüsse innerhalb des Verzeichnisses, sondern fungiert auch selbst als Platzhalter.
Abizern

Antworten:


113

Git verfolgt keine Verzeichnisse, sondern Dateien. Um dies zu erreichen, müssen Sie mindestens eine Datei verfolgen. Angenommen, Ihre .gitignoreDatei sieht ungefähr so ​​aus:

upload/*

Du kannst das:

$ touch upload/.placeholder
$ git add -f upload/.placeholder

Wenn Sie das vergessen, werden -fSie sehen:

$ git Upload / .placeholder hinzufügen
Die folgenden Pfade werden von einer Ihrer .gitignore-Dateien ignoriert:
hochladen
Verwenden Sie -f, wenn Sie sie wirklich hinzufügen möchten.
fatal: keine Dateien hinzugefügt

Wenn Sie dies tun, werden git statusSie sehen:

# Auf Zweigstellenmaster
#
# Erstes Festschreiben
#
# Zu verpflichtende Änderungen:
# (benutze "git rm --cached ..." um die Bühne zu verlassen)
#
# neue Datei: upload / .placeholder
#

Natürlich können Sie dann:

$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder

Danke, das ist genau das, was ich brauche.
Ben

11
Eine übliche Konvention für einen Platzhalter ist eine Gitignore-Datei.
Cascabel

2
@Jefromi In der Tat hatte ich, wie meine Kommentare an Abizern, nie in Betracht gezogen, die .gitignoreDatei als Platzhalter zu verwenden.
Peter Farmer

1
Hoppla, irgendwie habe ich diese Kommentare verpasst.
Cascabel

2
Git verfolgt keine Verzeichnisse, es verfolgt Dateien klingt lustig, wenn sie Ihnen beibringen, dass alles eine Datei unter UNIX ist, sogar ein Verzeichnis ist eine Datei
Green

38

Ich habe hier darüber geschrieben .

Fügen Sie einen .gitignore in das Verzeichnis ein.


1
Schöner kleiner Artikel und Kommentare! Hatte noch nie darüber nachgedacht, .gitignore als Platzhalterdatei zu verwenden ....
Peter Farmer

Vielen Dank. Ich habe etwas gelernt, indem ich einen Beitrag geschrieben und Kommentare erhalten habe.
Abizern

1
Es scheint eine beliebte Namenskonvention zu geben.gitkeep
Tarabyte

Ich habe gerade diesen "ha-ha" -Moment bekommen, ich wünschte, ich könnte 6 verschiedene Male
upvoten



6

Um nur Verzeichnisse, aber nicht die Dateien zu verfolgen, habe ich Folgendes getan. Dank des Kommentars von @ PeterFarmer zu Git-Tracking-Dateien konnte ich alle Verzeichnisse außer den Dateien wie unten beschrieben behalten.

# exclude everything in every folder
/data/**/*.*

# include only .gitkeep files
!/data/**/*.gitkeep

Das Hinzufügen dieser zur .gitignore-Datei erledigt die Arbeit. Das Folgende ist meine Ordnerstruktur.

data/
├── processed
│   ├── dataset1.csv
│   └── dataset2.csv
├── raw
│   ├── raw_dataset1.json
└── test
    ├── subfolder
    │   └── dataset2.csv
    └── reviews.csv

Wenn ich das tue git add . && git status, erkennt git nur Ordner, aber keine Dateien.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitignore
        new file:   data/processed/.gitkeep
        new file:   data/raw/.gitkeep
        new file:   data/test/.gitkeep
        new file:   data/test/subfolder/.gitkeep

Beachten Sie Folgendes für Ihre .gitignore-Dateien:

Der vorangestellte Schrägstrich sucht nur nach dem Stammverzeichnis.

/ dir

Double Asterisk sucht nach null oder mehr Verzeichnissen.

/ ** /


Vielen Dank! Ich benutze diesen Weg und es ist sehr hilfreich
sebasira
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.