Jak śledzić katalogi, ale nie ich pliki za pomocą Gita?

85

Niedawno zacząłem używać Git i mam problem tylko z jedną rzeczą. Jak mogę śledzić katalogi bez śledzenia ich zawartości?

Na przykład witryna, nad którą pracuję, umożliwia przesyłanie. Chcę śledzić katalog uploads, aby był tworzony podczas rozgałęziania itp., Ale oczywiście nie pliki w nim zawarte (pliki testowe w gałęzi deweloperskiej lub prawdziwe pliki w katalogu głównym).

W moim .gitignore mam:

przesłane /*.*

Próbowałem również (co ignoruje cały katalog):

przesłane /

Ten katalog może również zawierać podkatalogi (przesłane / kciuki / przesłane / filmy /). Chciałbym móc je śledzić, ale nie ich pliki.

Czy to możliwe dzięki Git? Szukałem wszędzie, nie znajdując odpowiedzi.

Ben
źródło
Git śledzi tylko pliki. To, co możesz zrobić, to pobawić się hakami git i śledzić plik, który będzie zawierał listę katalogów (automatycznie wygenerowany przy użyciu punktów zaczepienia). Chociaż nie jestem do końca pewien, czy to byłoby możliwe.
Šimon Tóth
Bardziej konkretnie: Git śledzi zawartość i (w przypadku gita) pusty katalog nie jest treścią. Możesz się spierać, bez względu na to, czy się zgadzasz, czy nie, ale jako kolejne „obejście” możesz pomyśleć o utworzeniu katalogów przy kompilacji / instalacji / w razie potrzeby. Jednak: używam również rozwiązania „ .placeholder-file” -file;)
KingCrunch
1
Zamiast używać .placeholder, używam pliku .gitignore. Nie tylko zajmuje się to wykluczeniami w katalogu, ale sam pełni rolę symbolu zastępczego.
Abizern

Odpowiedzi:

113

Git nie śledzi katalogów, śledzi pliki, więc aby to osiągnąć, musisz śledzić co najmniej jeden plik. Zakładając, że twój .gitignoreplik wygląda mniej więcej tak:

upload/*

Możesz to zrobić:

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

Jeśli zapomnisz -f, zobaczysz:

$ git dodaj upload / .placeholder
Poniższe ścieżki są ignorowane przez jeden z plików .gitignore:
Przekazać plik
Użyj -f, jeśli naprawdę chcesz je dodać.
fatal: nie dodano żadnych plików

Wtedy, kiedy to zrobisz git status, zobaczysz:

# Na gałęzi master
#
# Wstępne zatwierdzenie
#
# Zmiany do zatwierdzenia:
# (użyj „git rm --cached ...”, aby usunąć ze sceny)
#
# nowy plik: upload / .placeholder
#

Oczywiście możesz wtedy:

$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder
Peter Farmer
źródło
Dzięki, właśnie tego potrzebuję.
Ben
11
Typową konwencją dla symbolu zastępczego jest plik gitignore.
Cascabel
2
@Jefromi Rzeczywiście, tak jak moje komentarze do Abizern, nigdy nie rozważałem użycia .gitignorepliku jako symbolu zastępczego.
Peter Farmer
1
Ups, jakoś przeoczyłem te komentarze.
Cascabel
2
Git nie śledzi katalogów, śledzi pliki, które brzmią śmiesznie, kiedy uczą cię, że wszystko jest plikiem w systemie UNIX, nawet katalog jest plikiem
Green
38

Pisałem o tym tutaj .

Dodaj .gitignore w katalogu.

Abizern
źródło
1
Ładny, mały artykuł i komentarze! Nigdy nie rozważał użycia .gitignore jako pliku zastępczego ...
Peter Farmer
Dzięki. Nauczyłem się czegoś po prostu pisząc post i otrzymując komentarze.
Abizern
1
Wygląda na to, że teraz istnieje popularna konwencja nazewnictwa.gitkeep
tarabyte
właśnie dostałem ten moment "ha-ha" teraz, chciałbym móc zagłosować 6 różnych razy
adelowo
27

Najlepszą odpowiedzią, jaką znalazłem, jest dołączenie pliku .gitignore do folderu przesyłania z tą zawartością

# Ignore everything in this directory
*
# Except this file
!.gitignore

Tutaj masz Jak mogę dodać pusty katalog do repozytorium Git?

Gonzalo Cao
źródło
To najbardziej eleganckie rozwiązanie
Muhammad Raihan Muhaimin
13

Jak dotąd najlepsze rozwiązanie:

1) Utwórz plik .gitignore

2) Napisz do środka:

*
*/
!.gitignore

3) Dodaj plik .gitignore do wybranego folderu.

Źródło: https://stackoverflow.com/a/5581995/2958543

mejiamanuel57
źródło
6

Aby śledzić tylko katalogi, ale nie pliki, wykonałem następujące czynności. Dzięki komentarzowi @ PeterFarmer na temat plików śledzenia tylko przez git, byłem w stanie zachować wszystkie katalogi z wyłączeniem plików, jak opisano poniżej.

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

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

Dodanie tego do pliku .gitignore załatwi sprawę. Oto moja struktura folderów.

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

Kiedy to robię git add . && git status, git rozpoznaje tylko foldery, ale nie pliki.

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

Pamiętaj, że w przypadku plików .gitignore:

Wstawianie ukośnika na początek szuka tylko katalogu głównego.

/ reż

Podwójna gwiazdka wyszukuje zero lub więcej katalogów.

/ ** /

metinsenturk
źródło
Dziękuję Ci! Używam w ten sposób i jest to bardzo pomocne
sebasira