Pytanie Jak mogę dodać pusty katalog do repozytorium Git?


Jak mogę dodać pusty katalog (który nie zawiera żadnych plików) do repozytorium Git?


3477
2017-09-22 16:41


pochodzenie


Chociaż nie jest to przydatne, jest sposób na zhakowanie pustego (naprawdę pustego) katalogu do repozytorium. Nie będzie checkout z obecnymi wersjami Gita. - tiwo
@tiwo Ja się nie zgadzam, że to nie jest użyteczne. Twoja hierarchia katalogów jest częścią twojego projektu, więc powinna być kontrolowana w wersji. - JBentley
W moim przypadku chciałbym dodać strukturę katalogów dla plików tmp, ale nie same pliki tmp. W ten sposób mój tester ma poprawną strukturę (w przeciwnym razie są błędy), ale nie zatykam moich zatwierdzeń danymi tmp. Więc tak, to jest dla mnie przydatne! - Adam Marshall
@AdamMarshall Myślę, że tiwo mówił, że hack nie jest przydatny, ponieważ jest ignorowany przez kasę. Tmp dirs brzmi jak przydatna funkcja dla VCS. - Quantum7
Dlaczego nie ma procedury, która tworzy pliki tmp również utworzyć katalog tmp? - RyPeck


Odpowiedzi:


Innym sposobem na pozostawienie pustego katalogu (w repozytorium) jest utworzenie .gitignore plik wewnątrz tego katalogu, który zawiera następujące cztery linie:

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

Wtedy nie musisz porządkować zamówienia tak, jak musisz to robić w m104 rozwiązanie.

Daje to także korzyści, że pliki w tym katalogu nie będą wyświetlane jako "nieśledzone", gdy wykonasz status git.

Zrobienie @GreenAsJadeKomentarz jest trwale:

Myślę, że warto zauważyć, że to rozwiązanie dokładnie to, o co pyta, ale nie jest to może to, czego szukało wiele osób, które patrzą na to pytanie. To rozwiązanie gwarantuje, że katalog pozostanie pusty. Mówi "Naprawdę nigdy nie chcę, żeby pliki były tu sprawdzane". W przeciwieństwie do "Nie mam tu jeszcze żadnych plików do odprawy, ale potrzebuję tu katalogu, pliki mogą być później".


3365
2018-05-31 22:10



Myślę, że warto zauważyć, że to rozwiązanie działa dokładnie o jakie pytanie się pyta, ale nie jest to może to, czego szukało wielu ludzi, patrzących na to pytanie. To rozwiązanie gwarantuje, że katalog pozostaje pusty. Mówi "Naprawdę nigdy nie chcę, żeby pliki były tu sprawdzane". W przeciwieństwie do "Nie mam tu jeszcze żadnych plików do odprawy, ale potrzebuję tu katalogu, pliki mogą być później". - GreenAsJade
Myślę, że rozwiązanie README zaproponowane przez @JOHNMee powinno być używane razem z tym; Plik .gitignore zawiera wyjaśnienie tego, co chcemy trzymać poza kontrolą wersji, podczas gdy plik README wyjaśnia, jaki jest cel katalogu, który jest bardzo ważną informacją. - pedromanoel
@pedromanoel Piszę dokumentację, którą umieścisz w README w środku .gitignore plik (jako komentarze). - Carlos Campderrós
Znajdź 1 różnicę: 1.) pusty folder, 2.) folder z plikiem .gitignore. ;-) - Peter Perháč
Technicznie nie jest to pusty katalog ... - Arash Saidi


Nie możesz. Zobacz Git FAQ.

Obecnie projekt indeksu git   (obszar przemieszczania) zezwala tylko na pliki   być na liście i nikt nie jest wystarczająco kompetentny   aby zmiana była pusta   katalogi mają na sobie wystarczająco dużo uwagi   w tej sytuacji, aby temu zaradzić.

Katalogi są dodawane automatycznie   podczas dodawania plików w nich. Że   to, katalogi nigdy nie muszą być dodawane   do repozytorium i nie są śledzone   na własną rękę.

Możesz powiedzieć "git add <dir>" i to   doda tam pliki.

Jeśli naprawdę potrzebujesz katalogu do   istnieje w kasie powinieneś utworzyć   plik w nim. .gitignore działa dobrze dla   ten cel; możesz zostawić to puste,   lub wpisz nazwy plików   spodziewać się pojawienia w katalogu.


983
2017-09-22 16:42



Poniżej odpowiedź jest DUŻO lepsza. Fakt, że git oprogramowanie niskiego poziomu na to nie pozwala, nie ma dla mnie większego znaczenia niż JAK używać Gita, kiedy potrzebuję pustego katalogu. Dodanie 2 linii .gitignore wydaje mi się akceptowalne. - Amala
Jeśli ktoś chce przenieść pliki do nowego katalogu, nie może tego zrobić git mv jak git będzie narzekał, że nowy katalog nie znajduje się pod kontrolą wersji - lulalala
Możesz czytać "to niemożliwe, nie można itd."w całym Internecie na to częste pytanie .gitignore trick jest częstą odpowiedzią i zaspokaja wiele potrzeb. jednak to jest możliwe zrobić git śledzić naprawdę pusty informator, zobacz moją odpowiedź - ofavre
Chociaż im bardziej o tym myślę, tym bardziej wydaje mi się, że "mieszanka SHA pustego łańcucha", jeśli istnieje, faktycznie by być dobrze zdefiniowanym identyfikatorem pustego drzewa, chyba że niemożliwe byłoby stwierdzenie, czy obiekt ten jest drzewem czy kroplą. - Emil Lundberg
Widziałem wiele repozytoriów, które używają pustego pliku o nazwie .gitkeep w tym celu. - Sukima


Utwórz pusty plik o nazwie .gitkeep w katalogu i dodaj to.


598
2017-12-07 16:03



+1 to jest komunikatywne, dlaczego plik jest tam na pierwszym miejscu - djhaskin987
Dodałem odpowiedź zachęcanie do tworzenia .keep zamiast. - A-B-B
.gitkeep nie został przepisany przez Gita i sprawi, że ludzie będą się zastanawiać nad jego znaczeniem, co doprowadzi ich do wyszukiwania google, które poprowadzi ich tutaj. The .git Konwencja prefix powinna być zarezerwowana dla plików i katalogów używanych przez Git. - t-mart
@ t-mart "The .git Konwencja prefix powinna być zastrzeżona ... "Dlaczego? Git zażąda tej rezerwacji? - Limited Atonement
Tak nie jest. Chodzi o to, że może być mylące. - szablica


Zawsze możesz umieścić plik README w katalogu z wyjaśnieniem, dlaczego chcesz tego, w przeciwnym razie pustego, katalogu w repozytorium.


368
2018-03-14 23:38



+1, dobra sugestia, pusty katalog nie ma sensu, chyba że będzie używany w przyszłości. Dlatego utwórz w nim plik README i napisz, do czego służy ten katalog, i jakie pliki zostaną w nim umieszczone w przyszłości. To rozwiązuje oba problemy. - saeedgnu
Zgadzam się. Puste foldery są denerwujące i powinny być wyjaśnione we wszystkich odpowiednio obsługiwanych repozytoriach dowolnego rodzaju. - Sold Out Activist
@iso Nonsens. Struktura katalogów zawierająca puste katalogi może być wysoce pożądana w wielu sytuacjach (np. W aplikacji MVC, w której chcesz mieć katalog modeli, ale nie ma jeszcze gotowych do tworzenia modeli, lub udostępnionego katalogu widoków, do którego chcesz dodać widoki wspólne, później ). Co więcej, umieszczenie README w każdym z nich jest przesadą, ponieważ oczywiste jest, po co są, i łatwo jest zapomnieć o umieszczeniu README w każdym z nich. I musisz pamiętać, aby usunąć README po dodaniu do nich innych plików. Zasadniczo, git powinien zdecydowanie zezwalać na puste katalogi. - Jez
@Jez: Nie zgadzam się. Chodzi o to, że git jest przeznaczony do kontrolowania (i indeksowania) kodu źródłowego. Co ważne, id zatwierdzenia to mieszanie zawartości. To znaczy, musi mieć zawartość. Nie potrzebujesz README w każdy część drzewa, tylko węzły liści. Jeśli masz miejsca, w których zamierzasz umieścić kod, ale bez kodu, a nawet nie będziesz mieć czasu na echo "miejsca dla modeli" >> README, to masz pomysł, a nie zatwierdzenie. To nie jest interesujące dla gita. Powiedzenie "Chcę, aby uruchomiona aplikacja miała puste katalogi XYZ" to środowisko wykonawcze problem, a nie problem źródłowy. Zrób to z twoim instalatorem. - Joe Atzberger
@ jbo5112 Tak, "specjalny kod", do którego się odnosisz, to "instalator", o którym wspomniałem. Twoja instalacja aplikacji webapp już musi obsłużyć tworzenie bazy danych, lokalnej konfiguracji, ciągnięcie zależności lub 100 innych operacji, ale kilka pustych katalogów jest poza nią? Spróbuj gradle, pasażera, szefa kuchni, prymitywny plik Makefile itp. Nie ma żadnej różnicy w bezpieczeństwie między tworzeniem katalogów a innymi (potencjalnie znacznie bardziej skomplikowanymi / niebezpiecznymi) pracami związanymi z instalowaniem aplikacji. A jeśli naprawdę nie masz żadnych dep, config, DB itp. I nie ma instalatora, to po prostu użyj README. Żadna sprawa nie wymaga obu. - Joe Atzberger


touch .keep

W systemie Linux tworzy pusty plik o nazwie .keep. Ta nazwa jest preferowana .gitkeep ponieważ ten pierwszy jest agnostyczny dla Gita, podczas gdy drugi jest specyficzny dla Gita. Po drugie, jak zauważył inny użytkownik, .git Konwencja prefix powinna być zarezerwowana dla plików i katalogów używanych przez Git.

Alternatywnie, jak zauważono w innym odpowiedź, katalog może zawierać opisowy README lub README.md plik zamiast.

Oczywiście wymaga to, aby obecność pliku nie spowodowała awarii aplikacji.


261
2018-01-29 04:29



Jest to dobre dla początkowego, nieosłoniętego katalogu, ale co, jeśli zacznie wypełniać pliki? Wtedy Git zauważy je i zażąda ich jako plików nieśledzonych. Wybrana odpowiedź działa znacznie bardziej elegancko, aby umożliwić zachowanie katalogu, ale bezpiecznie zignorować zawartość. - JakeGould
Pytanie i przeważająca powszechna obawa dotyczy dodania pustego katalogu. Jeśli później ma plik rezydentny, oczywiście usuń plik .keep plik lub po prostu go zignoruj. Jeśli zamiast tego pliki w katalogu mają być ignorowane, to zupełnie inne pytanie. - A-B-B
Zasugerowano, że git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep" zrobi to we wszystkich nieskrytych pustych katalogach. - A-B-B
Nie podoba mi się to rozwiązanie, trudno zgadnąć, co ten plik robi. Ponadto, jeśli generujesz pliki w swoim środowisku deweloperskim (np. Dzienniki lub obrazy itp.), Nie oznacza to, że ten plik nie jest wersjonowany i przechodzi do produkcji, co nie jest miłe. - danielrvt
Windows nie lubi plików bez nazw i wymaga do tego specjalnej magii (zwanej też bashową aplikacją terminalową lub odpowiednikiem). - EntangledLoops


Dlaczego potrzebowalibyśmy pustych folderów z wersjami

Po pierwsze:

Pusty katalog nie może być częścią drzewa w systemie wersjonowania Git.

To po prostu nie będzie śledzone. Istnieją jednak scenariusze, w których "wersjonowanie" pustego katalogu może być przydatne, na przykład:

  • budować wstępnie zdefiniowana struktura folderów przydatne foldery projektu i udostępnienie tej struktury każdemu użytkownikowi / współautorowi repozytorium; lub, jako wyspecjalizowany przypadek powyższego, tworzenie folderu dla pliki tymczasowe, taki jak cache/ lub logs/ katalogi
  • niektóre projekty po prostu nie będzie działać bez niektórych folderów (co często jest oznaką źle zaprojektowanego projektu, ale jest to częsty scenariusz w realnym świecie i być może mogą istnieć, powiedzmy, problemy z uprawnieniami).

Niektórzy sugerowali obejścia

Wielu użytkowników sugeruje:

  1. Umieszczenie a README plik lub inny plik z pewną zawartością, aby katalog nie był pusty, lub
  2. Tworząc .gitignore plik z pewnego rodzaju "odwróconą logiką" (tj. w celu uwzględnienia wszystkich plików), który na końcu służy temu samemu celowi podejścia nr 1.

Podczas oba rozwiązania na pewno działają Uważam, że nie są spójne z sensownym podejściem do wersji Git.

  • Dlaczego powinieneś umieścić fałszywe pliki lub README, które być może naprawdę nie chcesz w swoim projekcie?
  • Dlaczego warto korzystać .gitignore zrobić coś (konserwacja plików), co jest przeciwieństwem tego, do czego jest przeznaczone (nie licząc pliki), mimo że jest to możliwe?

Podejście .gitkeep

Użyj pusty plik o nazwie .gitkeep w celu wymuszenia obecności folderu w systemie wersjonowania.

Chociaż może się wydawać, że nie jest to duża różnica:

  • Używasz pliku, który ma pojedynczy cel utrzymania tego folderu. Nie umieszczasz tam żadnych informacji, których nie chcesz umieścić.

    Na przykład powinieneś używać README jako, dobrze, README z przydatnymi informacjami, a nie jako wymówki, aby zachować folder.

    Rozdzielanie obaw jest zawsze dobrą rzeczą i wciąż możesz dodać .gitignore ignorować niechciane pliki.

  • Nazwal to .gitkeep czyni to bardzo jasno i prosto z samej nazwy pliku (a także do innych programistów, co jest dobre dla wspólnego projektu i jednego z podstawowych celów repozytorium Git), że ten plik jest

    • Plik niezwiązany z kodem (ze względu na wiodącą kropkę i nazwę)
    • Plik wyraźnie powiązany z Git
    • Tego cel (trzymać) jest wyraźnie określone i spójne i semantycznie przeciwstawne w jego znaczeniu ignorować

Przyjęcie

Widziałem .gitkeep podejście przyjęte przez bardzo ważne ramy, takie jak Laravel, Angular-CLI.


204
2017-12-04 23:32



Tęskniłeś za jedną myślą - jaki jest powód utrzymywania i pusty folder (np. / Logs, / tmp, / uploads)? Tak - jest to folder pusty. :) Jeśli chcesz zachować pusty folder, musisz zignorować znajdujące się w nim pliki. - Roman
@RomanAllenstein: niekoniecznie. Może się zdarzyć, że utworzymy repozytorium o określonej strukturze, które później może zostać zapełnione. Pliki te zostaną dodane do repozytorium zaraz po ich utworzeniu, a denerwujące będzie rozpoczęcie usuwania lub edycji plików .gitignore (i niebezpiecznych, ponieważ prawdopodobnie nawet nie zdajesz sobie sprawy, że nie są śledzone: git ignoruje je ) - dangonfast
downvote: verbose answer. - Behnam
@Behnam: Wezmę sprawę, ale moje badania na temat S.O. meta nie ma żadnego wpływu na pełne odpowiedzi, o ile zapewniają one wystarczająco dużo szczegółów i jasności, aby były przydatne dla każdego czytelnika (i każdego poziomu umiejętności). Wciąż jestem bardzo otwarty na każdą krytykę i dziękuję, że publicznie zadeklarowałeś przyczynę, przyjmuję to bardzo pozytywnie. - Cranio
Jeśli edytujesz odpowiedź, by ją zastąpić .gitkeep z każdą inną nazwą pliku bez prefiksu git otrzymujesz moją wiadomość, myślę, że ta jest najlepszą i najbardziej informatywną odpowiedzią. Powód: Myślę, że ".git *" powinien być zarezerwowany dla plików git zalecanych, a to tylko zwykły symbol zastępczy. Moje pierwsze przypuszczenie, gdy zobaczyłem, że to na przykład plik ".gitkeep" zostałby automatycznie zignorowany (to byłaby dobra funkcja), ale tak nie jest, prawda? - Johnny


Jak opisano w innych odpowiedziach, Git nie może reprezentować pustych katalogów w swoim obszarze przemieszczania. (Zobacz Git FAQ.) Jednakże, jeśli dla twoich potrzeb katalog jest wystarczająco pusty, jeśli zawiera .gitignore tylko plik, możesz go utworzyć .gitignore pliki w pustych katalogach tylko przez:

find . -type d -empty -exec touch {}/.gitignore \;

119
2018-05-03 15:17



Możesz zignorować katalog .git: find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \; - steffen
Prostszą odmianą dla większości sytuacji jest find * -type d -empty -exec touch {}/.gitignore \; - akhan
Ponieważ OS X tworzy plik .DS_Store w prawie każdym directoy, to tam nie działa. Jedynym znalezionym rozwiązaniem (NIEBEZPIECZNY!) Było usunięcie wszystkich plików .DS_Store za pierwszym razem find . -name .DS_Store -exec rm {} \; a następnie użyj preferowanego wariantu z tej odpowiedzi. Pamiętaj, aby wykonać to tylko w odpowiednim folderze! - zerweck
Czy ktoś wie sposób to zrobić w systemie Windows z wiersza polecenia? Widziałem tutaj kilka rozwiązań w Ruby i Pythonie, ale chciałbym mieć rozwiązanie barebone, jeśli można nim zarządzać. - Mig82
@akhan Dodawanie czegoś do .gitignore nie ma wpływu na -empty flaga find dowództwo. Mój komentarz dotyczy usuwania .DS_Store pliki w drzewie katalogów, więc -empty flaga może zostać zastosowana. - zerweck


Andy Lester ma rację, ale jeśli twój katalog musi być pusty, a nie pusty pusty, możesz umieścić puste .gitignore plik tam jako obejście.

Poza tym jest to kwestia implementacji, a nie podstawowy problem z projektowaniem pamięci masowej Git. Jak już wielokrotnie wspominano na liście mailingowej Git, powodem tego nie jest fakt, że nikt nie zadbał o to, by przesłać łatkę, nie dlatego, że nie można tego zrobić, czy nie.


57
2017-09-22 17:28



Dokładnie to powiedziałem. Oba akapity zostały omówione we fragmencie najczęściej zadawanych pytań. - Andy Lester
Sądzę, że odkładanie na bok jest mało interesujące i przydatne, aby wiedzieć - można je naprawić, po prostu nie spodziewaj się go w najbliższym czasie, gdy w większości przypadków jest to łatwe rozwiązanie. - wnoise
Przepraszam, nie przeczytałem ostatniego akapitu i chociaż przeczytałem pierwszy akapit, nie jestem pewien, dlaczego powtórzyłem te informacje. - Aristotle Pagaltzis
Oczywiście ta dodatkowa odpowiedź służy podkreśleniu faktu. - Michael Johnson
Przyszedłem tutaj, patrząc na przypadek, w którym kompilacja spadła, jeśli katalog nie istnieje i domyślnie jest pusty, ale nie musi być pusty. Tworzenie pliku .gitignore działa prawidłowo. - Joshua


The Ruby on Rails droga:

mkdir log && touch log/.gitkeep && git add log/.gitkeep

Teraz katalog logów zostanie dołączony do drzewa. Jest bardzo przydatny podczas wdrażania, więc nie będziesz musiał pisać rutyny, aby tworzyć katalogi logów.

Logów można trzymać przez wydawanie,

echo log/dev.log >> .gitignore

ale prawdopodobnie to wiedziałeś.


29
2017-10-22 13:24



Co to ma wspólnego z Ruby on Rails? - Quolonel Questions
@QuolonelQuestions github.com/rails/rails/blob/master/activerecord/test/migrations/... - Radon Rosborough


Git nie śledzi pustych katalogów. Zobacz Git FAQ po więcej wyjaśnień. Sugerowanym rozwiązaniem jest umieszczenie .gitignore plik w pustym katalogu. Nie podoba mi się to rozwiązanie, ponieważ .gitignore jest "ukryty" przez konwencję uniksową. Również nie ma wyjaśnienia, dlaczego katalogi są puste.

Proponuję umieścić plik README w pustym katalogu wyjaśniający, dlaczego katalog jest pusty i dlaczego musi być śledzony w Git. Z plikiem README, jeśli chodzi o Git, katalog nie jest już pusty.

Prawdziwe pytanie brzmi: dlaczego potrzebujesz pustego katalogu w git? Zwykle masz jakiś skrypt budujący, który może stworzyć pusty katalog przed skompilowaniem / uruchomieniem. Jeśli nie, to zrób jeden. To o wiele lepsze rozwiązanie niż umieszczanie pustych katalogów w git.

Więc masz jakiś powód, dla którego potrzebujesz pustego katalogu w git. Umieść ten powód w pliku README. W ten sposób inni programiści (i przyszli ty) wiedzą, dlaczego pusty katalog musi tam być. Będziesz także wiedział, że możesz usunąć pusty katalog, gdy problem wymagający pustego katalogu został rozwiązany.


Aby wyświetlić każdy pusty katalog, użyj następującego polecenia:

find -name .git -prune -o -type d -empty -print

Aby utworzyć zastępcze pliki README w każdym pustym katalogu:

find -name .git -prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

Aby zignorować wszystko w katalogu oprócz pliku README, umieść następujące linie w swoim .gitignore:

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

Alternatywnie możesz po prostu wykluczyć każdy Plik README zignorowany:

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

Aby wyświetlić listę wszystkich plików README po ich utworzeniu:

find -name README.emptydir

26
2018-05-06 15:45