Come tenere traccia delle directory ma non dei loro file con Git?


86

Recentemente ho iniziato a utilizzare Git e ho problemi con una sola cosa. Come posso monitorare le directory senza tenere traccia dei loro contenuti?

Ad esempio, il sito su cui sto lavorando consente i caricamenti. Voglio tenere traccia della directory dei caricamenti in modo che venga creata durante la ramificazione, ecc. Ma ovviamente non i file al suo interno (i file di prova durante lo sviluppo del ramo oi file reali nel master).

Nel mio .gitignore ho quanto segue:

carica /*.*

Ho anche provato (che ignora l'intera directory):

caricamenti /

Questa directory può contenere anche sottodirectory (upload / thumbs / uploads / videos /) Vorrei essere in grado di tenere traccia di queste ma non dei loro file.

È possibile con Git? Ho cercato ovunque senza trovare una risposta.


Git tiene traccia solo dei file. Quello che potresti fare è giocare con git hook e tenere traccia di un file che conterrà l'elenco delle directory (generato automaticamente utilizzando gli hook). Anche se non sono del tutto sicuro che ciò sarebbe possibile.
Šimon Tóth

Più concreto: Git tiene traccia del contenuto e (per git) una directory vuota non è contenuta. Puoi discutere, che tu sia d'accordo o no, ma come un'altra "soluzione" potresti pensare di creare le directory su build / install / quando necessario. Tuttavia: utilizzo anche la soluzione " .placeholder-file";)
KingCrunch

1
Invece di utilizzare .placeholder, utilizzo un file .gitignore. Questo non solo si occupa delle esclusioni all'interno della directory, ma funge anche da segnaposto.
Abizern

Risposte:


114

Git non tiene traccia delle directory, tiene traccia dei file, quindi per ottenere ciò è necessario tenere traccia di almeno un file. Quindi supponendo che il tuo .gitignorefile assomigli a questo:

upload/*

Puoi farlo:

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

Se dimentichi -fvedrai:

$ git aggiungi upload / .placeholder
I seguenti percorsi vengono ignorati da uno dei tuoi file .gitignore:
caricare
Usa -f se vuoi davvero aggiungerli.
fatale: nessun file aggiunto

Quindi quando lo fai git statusvedrai:

# Sul master di filiale
#
# Commit iniziale
#
# Modifiche da applicare:
# (usa "git rm --cached ..." per rimuovere lo stage)
#
# nuovo file: upload / .placeholder
#

Ovviamente puoi quindi fare:

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

Grazie, è proprio quello che mi serve.
Ben

11
Una convenzione comune per un segnaposto è un file gitignore.
Cascabel

2
@Jefromi In effetti, come i miei commenti ad Abizern, non avevo mai considerato di utilizzare il .gitignorefile come segnaposto.
Peter Farmer

1
Ops, in qualche modo ho perso quei commenti.
Cascabel

3
Git non tiene traccia delle directory, tiene traccia dei file suona divertente quando ti insegnano che tutto è un file in UNIX, anche una directory è un file
Verde

38

Ne ho scritto qui .

Aggiungi un .gitignore all'interno della directory.


1
Bel piccolo articolo e commenti! Non avevo mai pensato di utilizzare .gitignore come file segnaposto ....
Peter Farmer

Grazie. Ho imparato qualcosa semplicemente scrivendo un post e ricevendo commenti.
Abizern

1
Sembra che ora ci sia una convenzione di denominazione popolare da utilizzare.gitkeep
tarabyte

ho appena ricevuto quel momento "ah ah" in questo momento, vorrei poter votare 6 volte diverse
adelowo



6

Per tenere traccia solo delle directory ma non dei file, ho fatto quanto segue. Grazie al commento di @ PeterFarmer sui file di tracciamento git, sono stato in grado di mantenere tutte le directory escludendo i file come descritto di seguito.

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

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

L'aggiunta di questo al file .gitignore farà il lavoro. Quello che segue è la mia struttura di cartelle.

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

Quando lo faccio git add . && git status, git riconosce solo le cartelle, ma non i file.

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

Tieni presente che quanto segue per i tuoi file .gitignore:

La barra anteposta cerca solo la directory principale.

/ dir

Il doppio asterisco cerca zero o più directory.

/ ** /


Grazie! Sto usando in questo modo ed è molto utile
sebasira
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.