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.


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

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.


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



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.

/ ** /


Dziękuję Ci! Używam w ten sposób i jest to bardzo pomocne
sebasira
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.