@tiwo I dla jednego nie zgadzam się, że to nie jest przydatne. Hierarchia katalogów jest częścią twojego projektu, więc powinna być kontrolowana wersja.
JBentley
114
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 występują błędy), ale nie blokuję moich zatwierdzeń danymi tmp. Tak, to mi się przyda!
Adam Marshall
45
@AdamMarshall Myślę, że tiwo powiedział, że hack nie jest użyteczny, ponieważ jest ignorowany przez kasę. Katalogi Tmp brzmią jak przydatna funkcja dla VCS.
Quantum7
31
Dlaczego procedura tworzenia plików tmp również nie utworzy katalogu tmp?
RyPeck,
Odpowiedzi:
4125
Innym sposobem na pozostawienie katalogu (prawie) pustego (w repozytorium) jest utworzenie .gitignorepliku w tym katalogu, który zawiera te cztery wiersze:
# Ignore everything in this directory
*
# Except this file
!.gitignore
Nie musisz wtedy porządkować zamówienia tak, jak musisz to zrobić w rozwiązaniu m104 .
Daje to również tę korzyść, że pliki w tym katalogu nie będą wyświetlane jako „bez śledzenia”, gdy wykonujesz status git.
Myślę, że warto zauważyć, że to rozwiązanie działa dokładnie tak, jak postawiono pytanie, ale może nie jest to, czego szukało wiele osób przyglądających się temu pytaniu. To rozwiązanie gwarantuje, że katalog pozostanie pusty. Mówi: „Naprawdę nigdy nie chcę, aby pliki były tutaj rejestrowane”. W przeciwieństwie do „Nie mam jeszcze żadnych plików do sprawdzenia, ale potrzebuję katalogu tutaj, pliki mogą pojawić się później”.
Myślę, że rozwiązanie README zaproponowane przez @JohnMee powinno być używane razem z tym; plik .gitignore zawiera wyjaśnienie tego, co chcemy zachować poza kontrolą wersji, podczas gdy plik README wyjaśnia, jaki jest cel katalogu, które są bardzo ważnymi informacjami.
pedromanoel
18
@pedromanoel piszę dokumentację będzie można umieścić w READMEwewnątrz .gitignorepliku (w komentarzach).
Obecnie konstrukcja indeksu git (obszar przejściowy) pozwala tylko na wyświetlanie plików i nikt nie jest wystarczająco kompetentny, aby dokonać zmiany, aby zezwolić na puste katalogi, troszczył się wystarczająco o tę sytuację, aby to naprawić.
Katalogi są dodawane automatycznie podczas dodawania plików w nich zawartych. Oznacza to, że katalogi nigdy nie muszą być dodawane do repozytorium i same nie są śledzone.
Możesz powiedzieć „ git add <dir>”, a tam dodasz pliki.
Jeśli naprawdę potrzebujesz katalogu, aby istniał w kasach, powinieneś utworzyć w nim plik. .gitignore działa dobrze w tym celu; możesz pozostawić puste lub wpisać nazwy plików, które mają się pojawiać w katalogu.
Poniżej odpowiedź jest DUŻO lepsza. Fakt, że git na niskim poziomie oprogramowania nie pozwala, nie ma dla mnie znaczenia tak bardzo, jak W JAKI SPOSÓB używać Gita, gdy potrzebuję pustego katalogu. Dodanie 2-wierszowego .gitignore wydaje mi się do przyjęcia.
Amala,
1
Cóż, jeśli ktoś chce przenieść pliki do nowego katalogu, nie może tego zrobić, git mvponieważ git będzie narzekać, że nowy katalog nie jest pod kontrolą wersji
lulalala
16
Możesz przeczytać „ to niemożliwe, nie możesz itp. ” W Internecie na to częste pytanie. .gitignoreSztuką jest częstą odpowiedzią i zaspokaja wiele potrzeb. Jakkolwiek jest możliwe, aby git track był naprawdę pustym katalogiem, patrz moja odpowiedź
ofavre
2
Chociaż im więcej o tym myślę, tym bardziej wydaje mi się, że „skrót SHA pustego łańcucha”, jeśli istnieje, w rzeczywistości byłby dobrze zdefiniowanym identyfikatorem pustego drzewa, chyba że nie można stwierdzić, czy ten obiekt jest drzewo lub kropelka.
Emil Lundberg,
21
Widziałem wiele repozytoriów, które używają .gitkeepdo tego celu pustego pliku .
Sukima
759
Utwórz pusty plik o nazwie .gitkeepw katalogu i dodaj go.
Zamiast tego dodałem odpowiedź zachęcającą do tworzenia .keep.
Acumenus
205
.gitkeepnie został przepisany przez Git i sprawi, że ludzie ponownie zgadną jego znaczenie, co doprowadzi ich do wyszukiwania w Google, co doprowadzi ich tutaj. .gitKonwencja przedrostek powinien być zarezerwowany dla plików i katalogów, które sama Git używa.
t-mart
10
@ t-mart " .gitKonwencja prefiksów powinna być zarezerwowana ..." Dlaczego? Czy git prosi o tę rezerwację?
Ograniczone Zadośćuczynienie
9
W takim przypadku plik READMElub ABOUTbyłby tak samo dobry lub lepszy. Zostawiając notatkę dla następnego faceta, tak jak wszyscy robiliśmy to przed adresami URL.
Dave
5
Nie działa, jeśli piszesz test jednostkowy, który powinien przetestować kod w pustym katalogu ...
thebjorn
436
Zawsze możesz umieścić plik README w katalogu z wyjaśnieniem, dlaczego chcesz ten katalog, w przeciwnym razie pusty, w repozytorium.
+1, Dobra sugestia, pusty katalog nie ma żadnego sensu, chyba że zostanie użyty w przyszłości. Utwórz w nim plik README i napisz, do czego służy ten katalog oraz jakie pliki zostaną w nim umieszczone w przyszłości. To rozwiązuje oba problemy.
saeedgnu
63
@ilius Nonsense. Struktura katalogów zawierająca puste katalogi może być bardzo pożądana w wielu sytuacjach (np. Aplikacja MVC, w której chcesz katalog modeli, ale jeszcze nie zająłeś się tworzeniem żadnych modeli lub katalog widoków udostępnionych, do którego planujesz później dodać widoki udostępnione) ). Co więcej, umieszczenie README w każdym z nich jest przesadą, ponieważ jest oczywiste, po co są i łatwo zapomnieć o umieszczeniu README w każdym z nich. I musisz pamiętać, aby usunąć plik README, gdy dodasz do nich inne pliki. Zasadniczo git powinien zdecydowanie zezwalać na puste katalogi.
Jez
20
@Jez: Nie zgadzam się. Chodzi o to, że git jest zaprojektowany do kontrolowania (i indeksowania) kodu źródłowego. Co ważne, identyfikator zatwierdzenia jest skrótem zawartości. To znaczy, musi mieć treść. Nie potrzebujesz README w każdej części drzewa, tylko węzły liści. Jeśli masz miejsca, w których zamierzasz umieścić kod, ale nie ma kodu, a nawet nie poświęcisz czasu na echo „miejsce na modele” >> README, to masz pomysł, a nie zatwierdzenie. Git nie jest interesujący. Powiedzenie „Chcę, aby działająca aplikacja miała puste katalogi XYZ”, to problem w czasie wykonywania , a nie problem źródłowy. Poradzić sobie z instalatorem.
Joe Atzberger
6
@JoeAtzberger To brakująca funkcja, a nie celowe ograniczenie. Z Git FAQ: Obecnie konstrukcja indeksu Git (obszar przejściowy) pozwala tylko na wyświetlanie plików, a nikt nie jest wystarczająco kompetentny, aby dokonać zmiany, aby pozwolić pustym katalogom dbać o tę sytuację, aby temu zaradzić.
jbo5112
7
@ jbo5112 Tak, „kod specjalny”, o którym mówisz, to „instalator”, o którym wspomniałem. Twoja instalacja aplikacji internetowych musi już obsługiwać tworzenie bazy danych, konfigurację lokalną, pobieranie zależności lub 100 innych operacji, ale kilka pustych katalogów jest poza tym? Wypróbuj gradle, pasażer, szef kuchni, prymitywny plik Makefile itp. Nie ma różnicy w bezpieczeństwie między tworzeniem katalogów a inną (potencjalnie znacznie bardziej skomplikowaną / niebezpieczną) pracą związaną z instalacją aplikacji. A jeśli naprawdę nie masz deps, config, DB itp. I nie masz instalatora, skorzystaj z README. Żaden przypadek nie wymaga wykonania obu tych czynności.
Joe Atzberger,
348
touch .keep
W systemie Linux tworzy to pusty plik o nazwie .keep. Jak na to jest warte, ta nazwa jest agnostyczna dla Git, podczas gdy .gitkeepbyłaby specyficzna dla Git. Po drugie, jak zauważył inny użytkownik, .gitkonwencja prefiksów powinna być zarezerwowana dla plików i katalogów, z których korzysta sam Git.
Jest to dobre w przypadku początkowego pustego katalogu, ale co, jeśli zacznie się wypełniać plikami? Wtedy Git je zauważy i uzna za pliki nieśledzone. Wybrana tutaj odpowiedź działa o wiele bardziej elegancko, pozwalając zachować katalog, a następnie bezpiecznie zignorować zawartość.
JakeGould,
14
Pytanie i główny problem dotyczy dodania pustego katalogu. Jeśli później ma plik rezydentny, oczywiście usuń .keepplik lub po prostu go zignoruj. Jeśli zamiast tego pliki w katalogu mają zostać zignorowane, to zupełnie inne pytanie.
Acumenus
3
Zasugerowano, że git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"zrobi to we wszystkich nie śledzonych pustych katalogach.
Acumenus
1
Nie podoba mi się to rozwiązanie, ciężko zgadnąć, co robi ten plik. Ponadto, jeśli generujesz pliki w środowisku deweloperskim (takie jak logi lub obrazy itp.), Nie powstrzymuje to przed wersjonowaniem tych plików i przejściem do produkcji, co nie jest przyjemne.
danielrvt
1
Windows nie lubi plików bez nazw i wymaga specjalnej magii, aby to osiągnąć (aka aplikacja typu terminal lub podobna).
EntangledLoops
303
Po co nam puste foldery z wersją
Po pierwsze:
Pusty katalog nie może być częścią drzewa w systemie wersjonowania Git .
To po prostu nie będzie śledzone. Są jednak scenariusze, w których „wersjonowanie” pustych katalogów może mieć znaczenie, na przykład:
rusztowanie wstępnie zdefiniowanej struktury folderów , udostępniając ją każdemu użytkownikowi / współautorowi repozytorium; lub, w wyspecjalizowanym przypadku powyżej, utworzenie folderu dla plików tymczasowych , takich jak a cache/lub logs/katalogi, w których chcemy udostępnić folder, ale .gitignorejego zawartość
w związku z powyższym niektóre projekty nie będą działać bez niektórych folderów (co często jest oznaką źle zaprojektowanego projektu, ale jest to częsty scenariusz w świecie rzeczywistym i być może mogą wystąpić problemy z pozwoleniem, które można rozwiązać).
Niektóre sugerowane obejścia
Wielu użytkowników sugeruje:
Umieszczenie READMEpliku lub innego pliku z pewną zawartością, aby katalog nie był pusty, lub
Tworzenie .gitignorepliku z pewnego rodzaju „logiką odwrotną” (tj. Obejmującą wszystkie pliki), która na końcu służy temu samemu celowi podejścia nr 1.
Chociaż oba rozwiązania na pewno działają, uważam je za niespójne z sensownym podejściem do wersji Git.
Dlaczego powinieneś umieszczać fałszywe pliki lub pliki README, których być może tak naprawdę nie chcesz w swoim projekcie?
Po .gitignoreco robić coś ( utrzymywanie plików), co jest przeciwieństwem tego, do czego jest przeznaczony (z wyłączeniem plików), chociaż jest to możliwe?
. podejście gitkeep
Użyj pustego pliku o nazwie .gitkeepw celu wymuszenia obecności folderu w systemie kontroli wersji.
Chociaż może się to nie wydawać tak dużą różnicą:
Używasz pliku, którego jedynym celem jest utrzymanie folderu. Nie umieszczasz tam żadnych informacji, których nie chcesz umieszczać.
Na przykład powinieneś używać plików README jako plików README z przydatnymi informacjami, a nie pretekstem do przechowywania folderu.
Oddzielenie problemów jest zawsze dobrą rzeczą i nadal możesz dodać znak, .gitignoreaby zignorować niechciane pliki.
Nadanie jej .gitkeepnazwy sprawia, że z samej nazwy pliku (a także innych programistów , co jest dobre dla wspólnego projektu i jednego z głównych celów repozytorium Git), jest bardzo jasne i proste, że ten plik to
Plik niezwiązany z kodem (ze względu na wiodącą kropkę i nazwę)
Plik wyraźnie powiązany z Git
Jego cel ( utrzymanie ) jest jasno określony, spójny i semantycznie przeciwny w znaczeniu ignorowania
Adopcja
Widziałem .gitkeeppodejście przyjęte przez bardzo ważne platformy, takie jak Laravel , Angular-CLI .
Pominąłeś jedną myśl - jaki jest powód przechowywania i pustego folderu (np. / Logs, / tmp, / uploads)? Tak - folder pozostanie pusty. :) Więc jeśli chcesz zachować folder pusty, musisz zignorować znajdujące się w nim pliki.
Rzym.
14
@RomanAllenstein: niekoniecznie. Może się zdarzyć, że utworzysz repozytorium o określonej strukturze, które później może zostać zapełnione. Pliki te zostaną dodane do repozytorium, jak tylko zostaną utworzone, i denerwujące będzie rozpoczęcie usuwania lub edytowania plików .gitignore (i niebezpieczne, ponieważ prawdopodobnie nawet nie zdajesz sobie sprawy, że nie są śledzone: git je ignoruje )
blueFast
45
@Behnam: Podejdę do głosu, ale moje badania nad meta SO nie wykazują zainteresowania pełnymi odpowiedziami, 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). Nadal jestem bardzo otwarty na wszelkie uwagi krytyczne i dziękuję, że podaliście publicznie powód, bardzo pozytywnie do tego podchodzę.
Cranio
4
Jeśli edytujesz swoją odpowiedź, aby zastąpić .gitkeepją inną nazwą pliku bez prefiksu git, uzyskasz moje poparcie, myślę, że ta odpowiedź jest najlepsza i najbardziej pouczająca. Powód: Myślę, że „.git *” powinno być zarezerwowane dla plików przepisanych przez git, podczas gdy jest to tylko symbol zastępczy. Moje pierwsze przypuszczenie, gdy zobaczyłem, że na przykład plik „.gitkeep” zostałby automatycznie zignorowany (to byłaby fajna funkcja), ale tak nie jest, prawda?
Johnny
5
Zastanawiam się, dlaczego ludzie tak trudno zrozumieć, dlaczego ktoś chce dodawać „puste” foldery do git. Musisz gdzieś zacząć, prawda? Zwykle zaczynasz od struktury folderów projektów i - niestety - na początku projektu nic tam jeszcze nie ma. Po zakończeniu repo projektu pracownicy zespołu mogą sklonować i rozpocząć pracę nad SAMĄ strukturą.
BitTickler,
127
Jak opisano w innych odpowiedziach, Git nie może reprezentować pustych katalogów w swoim obszarze testowym. (Zobacz często zadawane pytania na temat Git .) Jeśli jednak, dla twoich celów, katalog jest wystarczająco pusty, jeśli zawiera .gitignoretylko plik, możesz tworzyć .gitignorepliki w pustych katalogach tylko poprzez:
find . -type d -empty -exec touch {}/.gitignore \;
Prostszą odmianą dla większości sytuacji jestfind * -type d -empty -exec touch {}/.gitignore \;
akhan
2
Ponieważ OS X tworzy plik .DS_Store w prawie każdym Directoy, nie działa to tam. Jedynym (NIEBEZPIECZNYM!) Obejściem, które znalazłem, było usunięcie wszystkich plików .DS_Store za pośrednictwem, find . -name .DS_Store -exec rm {} \;a następnie użycie preferowanego wariantu z tej odpowiedzi. Pamiętaj, aby wykonać to tylko w odpowiednim folderze!
zerweck
1
Czy ktoś wie, jak to zrobić w systemie Windows z wiersza polecenia? Widziałem tutaj kilka rozwiązań w Ruby i Python, ale chciałbym rozwiązanie typu barebone, jeśli można nim zarządzać.
Mig82
1
@akhan Dodanie czegoś do .gitignorenie ma wpływu na -emptyflagę findpolecenia. Mój komentarz dotyczy usuwania .DS_Storeplików z drzewa katalogów, aby -emptymożna było zastosować flagę.
zerweck
68
Andy Lester ma rację, ale jeśli twój katalog musi być pusty, a nie pusty pusty, możesz umieścić tam pusty .gitignoreplik jako obejście.
Nawiasem mówiąc, jest to kwestia implementacji, a nie podstawowy problem projektowania pamięci Git. Jak wielokrotnie wspomniano na liście mailowej Git, powodem tego nie jest to, że nikt nie dbał o to, aby przesłać łatkę, nie dlatego, że nie można lub nie należy tego robić.
Dokładnie tak powiedziałem. Oba akapity zostały omówione we fragmencie FAQ, które opublikowałem.
Andy Lester,
1
Sądzę, że ta strona jest nieciekawa i przydatna do poznania - można ją naprawić, ale nie spodziewaj się jej w najbliższym czasie, gdy w większości przypadków jest takie łatwe obejście problemu.
wnoise
Przepraszam, nie przeczytałem ostatniego akapitu i chociaż czytałem pierwszy akapit, nie jestem pewien, dlaczego powtórzyłem tę informację.
Arystoteles Pagaltzis
2
Oczywiście ta dodatkowa odpowiedź służy podkreśleniu tego faktu.
Michael Johnson,
Przybyłem tutaj, patrząc na przypadek, w którym kompilacja upadła, jeśli katalog nie istnieje i domyślnie jest pusty, ale nie musi być pusty. Tworzenie .gitignore robi dobrze.
Teraz katalog dziennika zostanie dołączony do drzewa. Jest bardzo przydatny podczas wdrażania, więc nie będziesz musiał pisać procedury tworzenia katalogów dziennika.
Git nie śledzi pustych katalogów. Więcej informacji znajdziesz w FAQ Git . Sugerowane obejście polega na umieszczeniu .gitignorepliku w pustym katalogu. Nie podoba mi się to rozwiązanie, ponieważ .gitignorejest „ukryte” przez konwencję Uniksa. Nie ma też wyjaśnienia, dlaczego katalogi są puste.
Proponuję umieścić plik README w pustym katalogu, wyjaśniając, dlaczego ten katalog jest pusty i dlaczego należy go śledzić w Git. Gdy plik README jest na miejscu, w przypadku Git katalog nie jest już pusty.
Prawdziwe pytanie brzmi: dlaczego potrzebujesz pustego katalogu w git? Zwykle masz jakiś skrypt kompilacji, który może utworzyć pusty katalog przed kompilacją / uruchomieniem. Jeśli nie, zrób taki. To zdecydowanie lepsze rozwiązanie niż umieszczanie pustych katalogów w git.
Masz więc 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 przyszły użytkownik) 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ć listę każdego pustego katalogu, 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, wstaw następujące wiersze do .gitignore:
OSTRZEŻENIE: Ta poprawka nie działa naprawdę, jak się okazuje. Przepraszam za niedogodności.
Oryginalny post poniżej:
Znalazłem rozwiązanie podczas gry z wewnętrznymi elementami Git!
Załóżmy, że jesteś w swoim repozytorium.
Utwórz pusty katalog:
$ mkdir path/to/empty-folder
Dodaj go do indeksu za pomocą polecenia hydraulicznego i pustego drzewa SHA-1 :
$ git update-index --index-info
040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-folder
Wpisz polecenie, a następnie wprowadź drugi wiersz. Naciśnij, Entera następnie Ctrl+, Daby zakończyć wprowadzanie. Uwaga: format to tryb [SPACJA] typ [SPACJA] SHA-1hash [TAB] (zakładka jest ważna, formatowanie odpowiedzi jej nie zachowuje).
Otóż to! Twój pusty folder znajduje się w twoim indeksie. Wszystko, co musisz zrobić, to zatwierdzić.
To rozwiązanie jest krótkie i najwyraźniej działa dobrze ( patrz EDYCJA! ), Ale nie jest tak łatwe do zapamiętania ...
Puste drzewo SHA-1 można znaleźć, tworząc w nim nowe puste repozytorium Git cdi wydaj polecenie git write-tree, które generuje puste drzewo SHA-1.
EDYTOWAĆ:
Korzystam z tego rozwiązania, odkąd je znalazłem. Wygląda na to, że działa dokładnie tak samo jak tworzenie submodułu, z tym wyjątkiem, że nigdzie nie zdefiniowano żadnego modułu. Prowadzi to do błędów podczas wydawania git submodule init|update. Problem polega na tym, że git update-indexprzepisuje 040000 treeczęść na 160000 commit.
Co więcej, żaden plik umieszczony pod tą ścieżką nigdy nie zostanie zauważony przez Git, ponieważ uważa, że należy on do innego repozytorium. Jest to paskudne, ponieważ można je łatwo przeoczyć!
Jeśli jednak nie korzystasz (i nie będziesz) z żadnych podmodułów Git w swoim repozytorium, a folder „pusty” pozostanie pusty lub jeśli chcesz, aby Git wiedział o jego istnieniu i zignorował jego zawartość, możesz użyć ta poprawka. Postępowanie w zwykły sposób z submodułami wymaga więcej kroków niż to ulepszenie.
Czy po umieszczeniu pustego folderu w indeksie i zatwierdzeniu jest to możliwe git svn dcommitz pożądanym rezultatem?
Ograniczone Zadośćuczynienie
2
Jest mało prawdopodobne, aby ta poprawka działała z dowolnym innym narzędziem. Jak stwierdzono w ostrzeżeniu i edycji, odradzam korzystanie z niego, chyba że w dość ograniczonym przypadku.
ofavre
1
I oczywiście właśnie dlatego mieszanie się z wewnętrznymi elementami gita jest przeciwwskazane.
Casey
@abhisekp Jak to w ogóle możliwe?
PyRulez
1
@PyRulez dobrze, w świecie oprogramowania nic nie jest niemożliwe. : D Właściwie podążyłem za odpowiedzią.
abhisekp,
21
Powiedzmy, że potrzebujesz pustego katalogu o nazwie tmp :
Dwie rzeczy: Możesz po prostu „echo” * '> tmp / .gitignore ”zamiast dotykać, a„ git commit -m ”nie zatwierdza zmian dokonanych po dodaniu plików do indeksu.
Christoffer Hammarström
6
Jeśli to zrobisz echo bla > file, nie dostaniesz, file: File existsponieważ >nadpisze plik, jeśli już tam jest, lub utworzy nowy, jeśli nie istnieje.
psyrendust
3
/bin/shkulturowe założenie! * Jeśli „tutaj” jest cshi zmienna noclobberjest ustawiona, to naprawdę dostaniesz file: File exists. Jeśli ktoś powie „Rozumiem”, nie zakładaj, że to idiota i odpowiedz „Nie, nie rozumiesz”. * c2.com/cgi/wiki?AmericanCulturalAssumption
clacke
1
@clacke Jeśli ktoś zdecyduje się użyć innej powłoki niż wszyscy inni, powinien wyraźnie to powiedzieć, jeśli napotyka problemy. W przeciwieństwie do narodowości, każdy ma wolny wybór łupin.
SeldomNeedy
2
@SeldomNeedy Może szukają pomocy, ponieważ nawet nie wiedzą, że używają innej powłoki niż wszyscy inni.
clacke
20
Może dodanie pustego katalogu wydaje się być ścieżką najmniejszego oporu, ponieważ masz skrypty, które oczekują, że ten katalog istnieje (być może dlatego, że jest celem generowanych plików binarnych). Innym podejściem byłoby zmodyfikowanie skryptów w celu utworzenia katalogu zgodnie z potrzebami .
mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed
W tym przykładzie możesz wpisać (zepsuty) symboliczny link do katalogu, aby uzyskać do niego dostęp bez prefiksu „.generated” (ale jest to opcjonalne).
ln -sf .generated/bin bin
git add bin
Aby wyczyścić drzewo źródłowe, możesz po prostu:
rm -rf .generated ## this should be in a "clean" script or in a makefile
Jeśli często sugerujesz podejście do sprawdzania w prawie pustym folderze, masz niewielką złożoność usuwania zawartości bez usuwania pliku „.gitignore”.
Możesz zignorować wszystkie wygenerowane pliki, dodając następujące elementy do katalogu głównego .gitignore:
Uwaga: Symboliczne łącze, które zasugerowałem, jest „zepsute” w czystej kasie, ponieważ .generatedkatalog początkowo nie istnieje. Nie będzie już zepsuty po wykonaniu kompilacji.
nobar
2
Zgadzam się, że w niektórych przypadkach jest to bardzo dobry pomysł, ale w innych (takich jak dystrybucja projektu, w którym masz inaczej pusty szkielet z folderami, takimi jak modele / i widoki /), chciałbyś, aby użytkownik miał te katalogi pod ręką niż ręczne czytanie dokumentacji, a może być trochę więcej oczekiwać, że po sklonowaniu repozytorium uruchomią jakiś skrypt instalacyjny. Myślę, że ta odpowiedź w połączeniu z odpowiedzią README @ john-mee powinna obejmować większość, jeśli nie wszystkie przypadki.
moopet
14
Mam również problem z pustymi katalogami. Problem z używaniem plików zastępczych polega na tym, że trzeba je tworzyć i usuwać, jeśli nie są już potrzebne (ponieważ później dodano podkatalogi lub pliki. Przy dużych drzewach źródłowych zarządzanie tymi plikami zastępczymi może być kłopotliwe i powodować błędy skłonny.
Dlatego postanowiłem napisać narzędzie typu open source, które może automatycznie zarządzać tworzeniem / usuwaniem takich plików zastępczych. Jest napisany dla platformy .NET i działa pod Mono (.NET dla Linux) i Windows.
Lubię odpowiedzi @ Artur79 i @mjs, więc użyłem kombinacji obu i uczyniłem ją standardową dla naszych projektów.
find . -type d -empty -exec touch {}/.gitkeep \;
Jednak tylko garstka naszych programistów pracuje na komputerach Mac i Linux. Dużo pracy w systemie Windows i nie mogłem znaleźć równoważnego prostego linijki, aby osiągnąć to samo. Niektórzy mieli szczęście, że zainstalowali Cygwin z innych powodów, ale przepisywanie Cygwin tylko z tego powodu wydawało się przesadą.
Edytuj, aby uzyskać lepsze rozwiązanie
Ponieważ większość naszych programistów ma już zainstalowanego Anta , pierwszą rzeczą, o której pomyślałem, było zebranie pliku kompilacji Anta, aby osiągnąć to niezależnie od platformy. To nadal można znaleźć tutaj
Jednak później pomyślałem, że lepiej byłoby przekształcić to w małe polecenie narzędzia, więc odtworzyłem go za pomocą Pythona i opublikowałem tutaj w PyPI . Możesz go zainstalować, po prostu uruchamiając:
pip3 install gitkeep2
Pozwoli ci to na tworzenie i usuwanie .gitkeepplików rekurencyjnie, a także pozwoli ci dodawać do nich wiadomości, aby Twoi rówieśnicy zrozumieli, dlaczego te katalogi są ważne. Ten ostatni kawałek to bonus. Pomyślałem, że byłoby miło, gdyby .gitkeeppliki mogły być samodokumentujące.
$ gitkeep --help
Usage: gitkeep [OPTIONS] PATH
Add a .gitkeep file to a directory in order to push them into a Git repo
even if they're empty.
Read more about why this is necessary at: https://git.wiki.kernel.org/inde
x.php/Git_FAQ#Can_I_add_empty_directories.3F
Options:
-r, --recursive Add or remove the .gitkeep files recursively for all
sub-directories in the specified path.
-l, --let-go Remove the .gitkeep files from the specified path.
-e, --empty Create empty .gitkeep files. This will ignore any
message provided
-m, --message TEXT A message to be included in the .gitkeep file, ideally
used to explain why it's important to push the specified
directory to source control even if it's empty.
-v, --verbose Print out everything.
--help Show this message and exit.
Wiem, że opublikowałeś to jako przykład złego argumentu, ale doceniam link, ponieważ jest to właściwie uzasadniony argument przeciwko śledzeniu katalogów. ;-)
clacke
1
Ta odpowiedź wydaje się niespójna, ponieważ w następnym poście w odnośniku do wątku Linus Torvald mówi, że spodziewa się, że będą musieli dodać śledzenie katalogu: markmail.org/message/libip4vpvvxhyqbl . Mówi, że „z zadowoleniem przyjąłby łatki [dodające obsługę śledzenia pustych katalogów]”
Patrick M
Patrick, używa tam również słowa „idiotyczny”. Podejrzewam, że jego sformułowanie odnosi się do ludzi tutaj w tym wątku, więc zakładam, że sam nie zaimplementuje w Git czegoś „idiotycznego”.
user2334883,
10
Gdy dodajesz .gitignoreplik, jeśli zamierzasz w nim umieścić dowolną ilość treści (którą Git ma zignorować), możesz dodać pojedynczą linię z gwiazdką, *aby upewnić się, że przypadkowo nie dodasz ignorowanej treści .
I wspomniałem, że zachowa również .htaccess. Przykład: jeśli oprogramowanie ma katalog plików dziennika (np. Oxygen Eshop), który nie powinien być dostępny przez Internet, w katalogu znajduje się plik .htaccess. Jeśli umieścisz wyżej wspomniany plik .gitignore w folderze, plik .htaccess nie zostanie zatwierdzony, a folder będzie dostępny za pośrednictwem Internetu.
Rzym.
Jeśli masz plik .htaccess, który jest pod kontrolą wersji, oznacza to, że już go zawiera katalog pod kontrolą wersji. Tak więc problem został już rozwiązany - plik .gitignore staje się nieistotny.
Ponkadoodle
1
@Wallacoloo W związku z pytaniem, które masz rację, mimo to plik jest użyteczny, użyję go do takiego katalogu przesyłania, w którym pliki będą chronione przez .htaccess. Wbrew wyjaśnieniom Rzymian plik .htaccess zostanie popełniony, ponieważ jest wykluczony przez regułę ignorowania. [stary wątek, wiem]
David
7
Zawsze buduję funkcję, aby sprawdzić pożądaną strukturę folderów i buduję ją dla siebie w ramach projektu. To rozwiązuje ten problem, ponieważ puste foldery są przechowywane w Git przez proxy.
function check_page_custom_folder_structure () {
if (!is_dir(TEMPLATEPATH."/page-customs"))
mkdir(TEMPLATEPATH."/page-customs");
if (!is_dir(TEMPLATEPATH."/page-customs/css"))
mkdir(TEMPLATEPATH."/page-customs/css");
if (!is_dir(TEMPLATEPATH."/page-customs/js"))
mkdir(TEMPLATEPATH."/page-customs/js");
}
To jest w PHP, ale jestem pewien, że większość języków obsługuje tę samą funkcjonalność, a ponieważ tworzenie folderów jest obsługiwane przez aplikację, foldery zawsze tam będą.
Tak więc wszyscy jesteśmy na tej samej stronie, już tego nie robię. To strata czasu. .gitkeepKonwencja jest znacznie lepsza praktyka.
Łagodny Fuzz,
Nie rozumiem, jak może to być strata czasu. Gdy Twoja TEMPLATEPATH jest oczywiście dynamiczna, nie możesz użyć rozwiązania .gitkeep. I nawet przy niedynamicznej strukturze folderów powinieneś dodać więcej rzeczy zamiast usuwania bardzo dobrego rozwiązania sprawdzania katalogów, np. Sprawdzania uprawnień i chmod plików. Dodanie sposobu oznaczania katalogów w globalnym .gitignore byłoby dla mnie idealne. Coś w stylu #keep / path / to / dir
Jochen Schultz
7
Oto hack, ale zabawne, że to działa (Git 2.2.1). Podobne do sugestii @Teka, ale łatwiejsze do zapamiętania:
Dodaj submoduł do dowolnego repozytorium ( git submodule add path_to_repo)
Spowoduje to dodanie folderu i pliku .submodules. Zatwierdź zmianę.
Usuń .submodulesplik i zatwierdź zmianę.
Teraz masz katalog, który jest tworzony, gdy zatwierdzanie jest sprawdzane. Interesującą rzeczą jest to, że jeśli spojrzysz na zawartość obiektu drzewa tego pliku, otrzymasz:
krytyczny: niepoprawna nazwa obiektu b64338b90b4209263b50244d18278c0999867193
Nie zachęciłbym go jednak do użycia, ponieważ może przestać działać w przyszłych wersjach Gita. Co może spowodować uszkodzenie repozytorium.
Jeśli chcesz dodać folder, który pomieści wiele danych przejściowych w wielu katalogach semantycznych, jednym z podejść jest dodanie czegoś takiego do swojego katalogu głównego .gitignore ...
/app/data/**/*.*
!/app/data/**/*.md
Następnie możesz zatwierdzić opisowe pliki README.md (lub puste pliki, nie ma to znaczenia, o ile możesz kierować je unikalnie tak jak *.mdw tym przypadku) w każdym katalogu, aby upewnić się, że wszystkie katalogi pozostaną częścią repo, ale pliki (z rozszerzeniami) są ignorowane. OGRANICZENIE: .w nazwach katalogów nie są dozwolone!
Możesz wypełnić wszystkie te katalogi plikami xml / images lub czymkolwiek i dodawać kolejne katalogi w /app/data/miarę upływu czasu wraz z rozwojem potrzeb pamięci dla Twojej aplikacji (pliki README.md służą do zapisania w opisie tego, do czego służy każdy katalog pamięci) dokładnie).
Nie ma potrzeby dalszej zmiany .gitignorelub decentralizacji poprzez utworzenie nowego .gitignoredla każdego nowego katalogu. Prawdopodobnie nie jest to najmądrzejsze rozwiązanie, ale jest zwięzłe gitignore i zawsze działa dla mnie. Ładnie i prosto! ;)
Łatwym sposobem na to jest dodanie .gitkeeppliku do katalogu, który chcesz (obecnie) pozostawić pusty.
Zobacz tę odpowiedź SOF, aby uzyskać więcej informacji - która wyjaśnia również, dlaczego niektórzy uważają, że konkurencyjna konwencja dodawania pliku .gitignore (jak podano w wielu odpowiedziach tutaj) jest myląca.
Zakładając, że chcesz do tego dodać katalog git, do wszystkich celów związanych z git, powinien pozostać pusty i nigdy nie śledzić jego zawartości, .gitignorejak sugeruje to tutaj wielokrotnie, załatwi sprawę .
Format, jak wspomniano, to:
*
!.gitignore
Teraz, jeśli chcesz to zrobić w wierszu poleceń, jednym zamachem, podczas gdy w katalogu, który chcesz dodać, możesz wykonać:
Sam mam skrypt powłoki, którego używam do tego celu. Nazwij skrypt, jak chcesz i dodaj go gdzieś na ścieżce dołączania lub bezpośrednio do niego:
#!/bin/bash
dir=''
if [ "$1" != "" ]; then
dir="$1/"
fi
echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore
Dzięki temu możesz albo wykonać go z katalogu, który chcesz dodać, albo odwołać się do katalogu jako pierwszego i jedynego parametru:
$ ignore_dir ./some/directory
Inną opcją (w odpowiedzi na komentarz przez @GreenAsJade), jeśli chcesz śledzić pusty folder, który MAJ zawierać śledzone pliki w przyszłości, ale będzie pusta do tej pory można ommit *z .gitignorepliku i sprawdzić , że w. Zasadniczo wszystko, co mówi plik, to „nie ignoruj mnie ”, ale poza tym katalog jest pusty i śledzony.
Twój .gitignoreplik wyglądałby następująco:
!.gitignore
To wszystko, sprawdź to, a masz pusty, ale śledzony katalog, w którym możesz śledzić pliki w późniejszym czasie.
Powodem, dla którego sugeruję zachowanie tej jednej linii w pliku, jest to, że podaje .gitignorecel. W przeciwnym razie ktoś po linii może pomyśleć o jego usunięciu. Może to pomóc, jeśli umieścisz komentarz nad linią.
Czasami masz do czynienia ze źle napisanymi bibliotekami lub oprogramowaniem, które potrzebują „prawdziwego” pustego i istniejącego katalogu. Ułożenie prostego .gitignorelub .keepmoże je złamać i spowodować błąd. W tych przypadkach pomocne mogą być następujące elementy, ale nie ma gwarancji ...
Najpierw utwórz potrzebny katalog:
mkdir empty
Następnie dodajesz uszkodzony symboliczny link do tego katalogu (ale w każdym innym przypadku niż opisany powyżej przypadek użycia, użyj READMEwyjaśnienia):
ln -s .this.directory empty/.keep
Aby zignorować pliki w tym katalogu, możesz dodać go do katalogu głównego .gitignore:
echo "/empty" >> .gitignore
Aby dodać zignorowany plik, użyj parametru, aby go wymusić:
git add -f empty/.keep
Po zatwierdzeniu masz zepsuty link symboliczny w indeksie, a git tworzy katalog. Uszkodzony link ma pewne zalety, ponieważ nie jest zwykłym plikiem i nie wskazuje zwykłego pliku. Tak więc pasuje nawet do części pytania „(która nie zawiera plików)”, nie z intencji, ale ze znaczenia:
find empty -type f
To polecenie pokazuje pusty wynik, ponieważ w tym katalogu nie ma żadnych plików. Dlatego większość aplikacji, które pobierają wszystkie pliki z katalogu, zwykle nie widzi tego linku, przynajmniej jeśli robi to „plik istnieje” lub „jest czytelny”. Nawet niektóre skrypty nie znajdą tam żadnych plików:
Ale zdecydowanie zalecam stosowanie tego rozwiązania tylko w szczególnych okolicznościach, dobre napisanie READMEw pustym katalogu jest zwykle lepszym rozwiązaniem. (I nie wiem, czy to działa z systemem plików Windows ...)
Czytając odpowiedzi @ofavre i @ stanislav-bashkyrtsev przy użyciu zepsutych odniesień do podmoduła GIT w celu utworzenia katalogów GIT, jestem zaskoczony, że nikt nie zasugerował jeszcze tej prostej zmiany pomysłu, aby wszystko było rozsądne i bezpieczne:
Zamiast włamać fałszywy submoduł do GIT , po prostu dodaj pusty prawdziwy .
Podczas tworzenia odwołania do podmodułu Git zapisze najnowszy skrót zatwierdzenia, więc nie musisz się martwić o mnie (lub GitLab) używającego go do wstrzykiwania złośliwych plików. Niestety nie znalazłem żadnego sposobu na wymuszenie, który identyfikator zatwierdzenia jest używany podczas realizacji transakcji, więc będziesz musiał ręcznie sprawdzić, czy identyfikator zatwierdzenia referencyjnego jest e84d7b81f0033399e325b8037ed2b801a5c994e0używany git submodule statuspo dodaniu repo.
Nadal nie rodem rozwiązanie, ale najlepsze, prawdopodobnie może mieć bez kogoś uzyskiwanie ręce naprawdę , naprawdę brudne w kodzie GIT.
Dodatek: Odtwarzanie tego zatwierdzenia
Powinieneś być w stanie odtworzyć to dokładne zatwierdzenie, używając (w pustym katalogu):
# Initialize new GIT repository
git init
# Set author data (don't set it as part of the `git commit` command or your default data will be stored as “commit author”)
git config --local user.name "Nobody"
git config --local user.email "none"# Set both the commit and the author date to the start of the Unix epoch (this cannot be done using `git commit` directly)
export GIT_AUTHOR_DATE="Thu Jan 1 00:00:00 1970 +0000"
export GIT_COMMITTER_DATE="Thu Jan 1 00:00:00 1970 +0000"# Add root commit
git commit --allow-empty --allow-empty-message --no-edit
Tworzenie powtarzalnych zatwierdzeń GIT jest zaskakująco trudne…
Nie możesz Jest to celowa decyzja projektantów wydana przez opiekunów Git. Zasadniczo celem systemu zarządzania kodem źródłowym, takiego jak Git, jest zarządzanie kodem źródłowym, a puste katalogi nie są kodem źródłowym. Git jest również często opisywany jako narzędzie do śledzenia zawartości, a puste katalogi nie są treściami (wręcz przeciwnie), więc nie są śledzone.
Sprzeciwiam się temu poglądowi. Struktura to treść, a wszystko, co wymieniasz, przyczynia się do zawartości.
ThomasH
20
Pusty plik nie jest także kodem źródłowym ani treścią. To tylko imię. Jednak Git z przyjemnością śledzi puste pliki. Nie sądzę, aby była to celowa decyzja projektowa, aby Git odmówił śledzenia pustych katalogów. Myślę, że śledzenie pustych katalogów to funkcja, która po prostu nie jest potrzebna w 99% przypadków, więc nie zadali sobie trudu wykonania dodatkowej pracy wymaganej do poprawnego działania. Git może to zrobić, jeśli ktoś tak bardzo chce tę funkcję, aby ją wdrożyć. Wątpię, aby opiekunowie Git byliby przeciwni takiej łatce, gdyby została wykonana poprawnie.
Dan Molding,
1
@TobyAllen tutaj jest zaktualizowanym linkiem FAQ . Najlepszą odpowiedzią jest również to, co jest zalecane przez FAQ z dokładniejszymi instrukcjami.
Daniel Da Cunha,
3
Jest to brakująca funkcja (i niski priorytet), a nie celowe ograniczenie. Z Git FAQ: Obecnie konstrukcja indeksu Git (obszar przejściowy) pozwala tylko na wyświetlanie plików, a nikt nie jest wystarczająco kompetentny, aby dokonać zmiany, aby pozwolić pustym katalogom dbać o tę sytuację, aby temu zaradzić.
jbo5112
Naprawdę się nie zgadzam. Mogę znaleźć różne powody, dla których chcę śledzić pusty folder. Na przykład opracowuję bardzo lekki framework PHP MVC dla moich projektów. Mam określone foldery do umieszczania modeli, widoków itp. Kiedy tworzę nową witrynę w oparciu o moją platformę, foldery te są puste, ponieważ domyślnie nie ma modeli ani widoków, ale potrzebuję tego folderu, inaczej mój program wygrał działa!
Gladen,
2
Możesz zapisać ten kod jako create_readme.php i uruchomić kod PHP z katalogu głównego swojego projektu Git.
> php create_readme.php
Dodaje pliki README do wszystkich pustych katalogów, aby katalogi te zostały dodane do indeksu.
<?php
$path = realpath('.');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
if ( is_dir($name) && ! is_empty_folder($name) ){
echo "$name\n" ;
exec("touch ".$name."/"."README");
}
}
function is_empty_folder($folder) {
$files = opendir($folder);
while ($file = readdir($files)) {
if ($file != '.' && $file != '..')
return true; // Not empty
}
}
?>
checkout
Jednak nie będzie w przypadku bieżących wersji Git.Odpowiedzi:
Innym sposobem na pozostawienie katalogu (prawie) pustego (w repozytorium) jest utworzenie
.gitignore
pliku w tym katalogu, który zawiera te cztery wiersze:Nie musisz wtedy porządkować zamówienia tak, jak musisz to zrobić w rozwiązaniu m104 .
Daje to również tę korzyść, że pliki w tym katalogu nie będą wyświetlane jako „bez śledzenia”, gdy wykonujesz status git.
Dokonywanie @GreenAsJade „s komentarz trwałe:
źródło
README
wewnątrz.gitignore
pliku (w komentarzach).Nie możesz Zobacz często zadawane pytania na temat Git .
źródło
git mv
ponieważ git będzie narzekać, że nowy katalog nie jest pod kontrolą wersji.gitignore
Sztuką jest częstą odpowiedzią i zaspokaja wiele potrzeb. Jakkolwiek jest możliwe, aby git track był naprawdę pustym katalogiem, patrz moja odpowiedź.gitkeep
do tego celu pustego pliku .Utwórz pusty plik o nazwie
.gitkeep
w katalogu i dodaj go.źródło
.keep
..gitkeep
nie został przepisany przez Git i sprawi, że ludzie ponownie zgadną jego znaczenie, co doprowadzi ich do wyszukiwania w Google, co doprowadzi ich tutaj..git
Konwencja przedrostek powinien być zarezerwowany dla plików i katalogów, które sama Git używa..git
Konwencja prefiksów powinna być zarezerwowana ..." Dlaczego? Czy git prosi o tę rezerwację?README
lubABOUT
byłby tak samo dobry lub lepszy. Zostawiając notatkę dla następnego faceta, tak jak wszyscy robiliśmy to przed adresami URL.Zawsze możesz umieścić plik README w katalogu z wyjaśnieniem, dlaczego chcesz ten katalog, w przeciwnym razie pusty, w repozytorium.
źródło
W systemie Linux tworzy to pusty plik o nazwie
.keep
. Jak na to jest warte, ta nazwa jest agnostyczna dla Git, podczas gdy.gitkeep
byłaby specyficzna dla Git. Po drugie, jak zauważył inny użytkownik,.git
konwencja prefiksów powinna być zarezerwowana dla plików i katalogów, z których korzysta sam Git.Alternatywnie, jak zauważono w innej odpowiedzi , katalog może zawierać zamiast tego opis
README
lubREADME.md
plik .Oczywiście wymaga to, aby obecność pliku nie spowodowała awarii aplikacji.
źródło
.keep
plik lub po prostu go zignoruj. Jeśli zamiast tego pliki w katalogu mają zostać zignorowane, to zupełnie inne pytanie.git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"
zrobi to we wszystkich nie śledzonych pustych katalogach.Po co nam puste foldery z wersją
Po pierwsze:
To po prostu nie będzie śledzone. Są jednak scenariusze, w których „wersjonowanie” pustych katalogów może mieć znaczenie, na przykład:
cache/
lublogs/
katalogi, w których chcemy udostępnić folder, ale.gitignore
jego zawartośćNiektóre sugerowane obejścia
Wielu użytkowników sugeruje:
README
pliku lub innego pliku z pewną zawartością, aby katalog nie był pusty, lub.gitignore
pliku z pewnego rodzaju „logiką odwrotną” (tj. Obejmującą wszystkie pliki), która na końcu służy temu samemu celowi podejścia nr 1.Chociaż oba rozwiązania na pewno działają, uważam je za niespójne z sensownym podejściem do wersji Git.
.gitignore
co robić coś ( utrzymywanie plików), co jest przeciwieństwem tego, do czego jest przeznaczony (z wyłączeniem plików), chociaż jest to możliwe?. podejście gitkeep
Użyj pustego pliku o nazwie
.gitkeep
w celu wymuszenia obecności folderu w systemie kontroli wersji.Chociaż może się to nie wydawać tak dużą różnicą:
Używasz pliku, którego jedynym celem jest utrzymanie folderu. Nie umieszczasz tam żadnych informacji, których nie chcesz umieszczać.
Na przykład powinieneś używać plików README jako plików README z przydatnymi informacjami, a nie pretekstem do przechowywania folderu.
Oddzielenie problemów jest zawsze dobrą rzeczą i nadal możesz dodać znak,
.gitignore
aby zignorować niechciane pliki.Nadanie jej
.gitkeep
nazwy sprawia, że z samej nazwy pliku (a także innych programistów , co jest dobre dla wspólnego projektu i jednego z głównych celów repozytorium Git), jest bardzo jasne i proste, że ten plik toAdopcja
Widziałem
.gitkeep
podejście przyjęte przez bardzo ważne platformy, takie jak Laravel , Angular-CLI .źródło
.gitkeep
ją inną nazwą pliku bez prefiksu git, uzyskasz moje poparcie, myślę, że ta odpowiedź jest najlepsza i najbardziej pouczająca. Powód: Myślę, że „.git *” powinno być zarezerwowane dla plików przepisanych przez git, podczas gdy jest to tylko symbol zastępczy. Moje pierwsze przypuszczenie, gdy zobaczyłem, że na przykład plik „.gitkeep” zostałby automatycznie zignorowany (to byłaby fajna funkcja), ale tak nie jest, prawda?Jak opisano w innych odpowiedziach, Git nie może reprezentować pustych katalogów w swoim obszarze testowym. (Zobacz często zadawane pytania na temat Git .) Jeśli jednak, dla twoich celów, katalog jest wystarczająco pusty, jeśli zawiera
.gitignore
tylko plik, możesz tworzyć.gitignore
pliki w pustych katalogach tylko poprzez:źródło
find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
find * -type d -empty -exec touch {}/.gitignore \;
find . -name .DS_Store -exec rm {} \;
a następnie użycie preferowanego wariantu z tej odpowiedzi. Pamiętaj, aby wykonać to tylko w odpowiednim folderze!.gitignore
nie ma wpływu na-empty
flagęfind
polecenia. Mój komentarz dotyczy usuwania.DS_Store
plików z drzewa katalogów, aby-empty
można było zastosować flagę.Andy Lester ma rację, ale jeśli twój katalog musi być pusty, a nie pusty pusty, możesz umieścić tam pusty
.gitignore
plik jako obejście.Nawiasem mówiąc, jest to kwestia implementacji, a nie podstawowy problem projektowania pamięci Git. Jak wielokrotnie wspomniano na liście mailowej Git, powodem tego nie jest to, że nikt nie dbał o to, aby przesłać łatkę, nie dlatego, że nie można lub nie należy tego robić.
źródło
Sposób tworzenia folderu dziennika Ruby on Rails :
Teraz katalog dziennika zostanie dołączony do drzewa. Jest bardzo przydatny podczas wdrażania, więc nie będziesz musiał pisać procedury tworzenia katalogów dziennika.
Pliki dziennika można ukryć, wydając,
ale prawdopodobnie to wiedziałeś.
źródło
Git nie śledzi pustych katalogów. Więcej informacji znajdziesz w FAQ Git . Sugerowane obejście polega na umieszczeniu
.gitignore
pliku w pustym katalogu. Nie podoba mi się to rozwiązanie, ponieważ.gitignore
jest „ukryte” przez konwencję Uniksa. Nie ma też wyjaśnienia, dlaczego katalogi są puste.Proponuję umieścić plik README w pustym katalogu, wyjaśniając, dlaczego ten katalog jest pusty i dlaczego należy go śledzić w Git. Gdy plik README jest na miejscu, w przypadku Git katalog nie jest już pusty.
Prawdziwe pytanie brzmi: dlaczego potrzebujesz pustego katalogu w git? Zwykle masz jakiś skrypt kompilacji, który może utworzyć pusty katalog przed kompilacją / uruchomieniem. Jeśli nie, zrób taki. To zdecydowanie lepsze rozwiązanie niż umieszczanie pustych katalogów w git.
Masz więc 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 przyszły użytkownik) 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ć listę każdego pustego katalogu, użyj następującego polecenia:
Aby utworzyć zastępcze pliki README w każdym pustym katalogu:
Aby zignorować wszystko w katalogu oprócz pliku README, wstaw następujące wiersze do
.gitignore
:Alternatywnie, możesz po prostu wykluczyć ignorowanie każdego pliku README:
Aby wyświetlić listę wszystkich plików README po ich utworzeniu:
źródło
OSTRZEŻENIE: Ta poprawka nie działa naprawdę, jak się okazuje. Przepraszam za niedogodności.
Oryginalny post poniżej:
Znalazłem rozwiązanie podczas gry z wewnętrznymi elementami Git!
Utwórz pusty katalog:
Dodaj go do indeksu za pomocą polecenia hydraulicznego i pustego drzewa SHA-1 :
Wpisz polecenie, a następnie wprowadź drugi wiersz. Naciśnij, Entera następnie Ctrl+, Daby zakończyć wprowadzanie. Uwaga: format to tryb [SPACJA] typ [SPACJA] SHA-1hash [TAB] (zakładka jest ważna, formatowanie odpowiedzi jej nie zachowuje).
Otóż to! Twój pusty folder znajduje się w twoim indeksie. Wszystko, co musisz zrobić, to zatwierdzić.
To rozwiązanie jest krótkie i najwyraźniej działa dobrze ( patrz EDYCJA! ), Ale nie jest tak łatwe do zapamiętania ...
Puste drzewo SHA-1 można znaleźć, tworząc w nim nowe puste repozytorium Git
cd
i wydaj poleceniegit write-tree
, które generuje puste drzewo SHA-1.EDYTOWAĆ:
Korzystam z tego rozwiązania, odkąd je znalazłem. Wygląda na to, że działa dokładnie tak samo jak tworzenie submodułu, z tym wyjątkiem, że nigdzie nie zdefiniowano żadnego modułu. Prowadzi to do błędów podczas wydawania
git submodule init|update
. Problem polega na tym, żegit update-index
przepisuje040000 tree
część na160000 commit
.Co więcej, żaden plik umieszczony pod tą ścieżką nigdy nie zostanie zauważony przez Git, ponieważ uważa, że należy on do innego repozytorium. Jest to paskudne, ponieważ można je łatwo przeoczyć!
Jeśli jednak nie korzystasz (i nie będziesz) z żadnych podmodułów Git w swoim repozytorium, a folder „pusty” pozostanie pusty lub jeśli chcesz, aby Git wiedział o jego istnieniu i zignorował jego zawartość, możesz użyć ta poprawka. Postępowanie w zwykły sposób z submodułami wymaga więcej kroków niż to ulepszenie.
źródło
git svn dcommit
z pożądanym rezultatem?Powiedzmy, że potrzebujesz pustego katalogu o nazwie tmp :
Innymi słowy, musisz dodać plik .gitignore do indeksu, zanim będziesz mógł powiedzieć Gitowi, aby go zignorował (i wszystko inne w pustym katalogu).
źródło
echo bla > file
, nie dostaniesz,file: File exists
ponieważ>
nadpisze plik, jeśli już tam jest, lub utworzy nowy, jeśli nie istnieje./bin/sh
kulturowe założenie! * Jeśli „tutaj” jestcsh
i zmiennanoclobber
jest ustawiona, to naprawdę dostanieszfile: File exists
. Jeśli ktoś powie „Rozumiem”, nie zakładaj, że to idiota i odpowiedz „Nie, nie rozumiesz”. * c2.com/cgi/wiki?AmericanCulturalAssumptionMoże dodanie pustego katalogu wydaje się być ścieżką najmniejszego oporu, ponieważ masz skrypty, które oczekują, że ten katalog istnieje (być może dlatego, że jest celem generowanych plików binarnych). Innym podejściem byłoby zmodyfikowanie skryptów w celu utworzenia katalogu zgodnie z potrzebami .
W tym przykładzie możesz wpisać (zepsuty) symboliczny link do katalogu, aby uzyskać do niego dostęp bez prefiksu „.generated” (ale jest to opcjonalne).
Aby wyczyścić drzewo źródłowe, możesz po prostu:
Jeśli często sugerujesz podejście do sprawdzania w prawie pustym folderze, masz niewielką złożoność usuwania zawartości bez usuwania pliku „.gitignore”.
Możesz zignorować wszystkie wygenerowane pliki, dodając następujące elementy do katalogu głównego .gitignore:
źródło
.generated
katalog początkowo nie istnieje. Nie będzie już zepsuty po wykonaniu kompilacji.Mam również problem z pustymi katalogami. Problem z używaniem plików zastępczych polega na tym, że trzeba je tworzyć i usuwać, jeśli nie są już potrzebne (ponieważ później dodano podkatalogi lub pliki. Przy dużych drzewach źródłowych zarządzanie tymi plikami zastępczymi może być kłopotliwe i powodować błędy skłonny.
Dlatego postanowiłem napisać narzędzie typu open source, które może automatycznie zarządzać tworzeniem / usuwaniem takich plików zastępczych. Jest napisany dla platformy .NET i działa pod Mono (.NET dla Linux) i Windows.
Wystarczy spojrzeć na: http://code.google.com/p/markemptydirs
źródło
Lubię odpowiedzi @ Artur79 i @mjs, więc użyłem kombinacji obu i uczyniłem ją standardową dla naszych projektów.
Jednak tylko garstka naszych programistów pracuje na komputerach Mac i Linux. Dużo pracy w systemie Windows i nie mogłem znaleźć równoważnego prostego linijki, aby osiągnąć to samo. Niektórzy mieli szczęście, że zainstalowali Cygwin z innych powodów, ale przepisywanie Cygwin tylko z tego powodu wydawało się przesadą.
Edytuj, aby uzyskać lepsze rozwiązanie
Ponieważ większość naszych programistów ma już zainstalowanego Anta , pierwszą rzeczą, o której pomyślałem, było zebranie pliku kompilacji Anta, aby osiągnąć to niezależnie od platformy. To nadal można znaleźć tutaj
Jednak później pomyślałem, że lepiej byłoby przekształcić to w małe polecenie narzędzia, więc odtworzyłem go za pomocą Pythona i opublikowałem tutaj w PyPI . Możesz go zainstalować, po prostu uruchamiając:
Pozwoli ci to na tworzenie i usuwanie
.gitkeep
plików rekurencyjnie, a także pozwoli ci dodawać do nich wiadomości, aby Twoi rówieśnicy zrozumieli, dlaczego te katalogi są ważne. Ten ostatni kawałek to bonus. Pomyślałem, że byłoby miło, gdyby.gitkeep
pliki mogły być samodokumentujące.Mam nadzieję, że uznasz to za przydatne.
źródło
Nie możesz i niestety nigdy nie będziesz w stanie. Jest to decyzja podjęta przez samego Linusa Torvalda. On wie, co jest dla nas dobre.
Gdzieś raz czytam.
Znalazłem Re: puste katalogi .. , ale może jest jeszcze jeden.
Musisz żyć z obejściami ... niestety.
źródło
Gdy dodajesz
.gitignore
plik, jeśli zamierzasz w nim umieścić dowolną ilość treści (którą Git ma zignorować), możesz dodać pojedynczą linię z gwiazdką,*
aby upewnić się, że przypadkowo nie dodasz ignorowanej treści .źródło
Nie ma sposobu, aby Git śledził katalogi, więc jedynym rozwiązaniem jest dodanie pliku zastępczego w katalogu, który Git ma śledzić.
Plik można nazwać i zawierać dowolne pliki, ale większość osób używa pustego pliku o nazwie
.gitkeep
(chociaż niektórzy wolą agnostykę VCS.keep
).Prefiks
.
oznacza go jako plik ukryty.Innym pomysłem byłoby dodanie
README
pliku wyjaśniającego, do czego będzie używany katalog.źródło
Jak wspomniano, nie można dodawać pustych katalogów, ale tutaj jest jeden linijka, która dodaje puste pliki .gitignore do wszystkich katalogów.
ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'
Utknąłem to w pliku Rakefile dla łatwego dostępu.
źródło
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Rozwiązanie Jamie Flournoy działa świetnie. Oto nieco ulepszona wersja, aby zachować
.htaccess
:Dzięki takiemu rozwiązaniu masz możliwość popełnienia pusty folder, na przykład
/log
,/tmp
czy/cache
i folder pozostanie pusta.źródło
Zawsze buduję funkcję, aby sprawdzić pożądaną strukturę folderów i buduję ją dla siebie w ramach projektu. To rozwiązuje ten problem, ponieważ puste foldery są przechowywane w Git przez proxy.
To jest w PHP, ale jestem pewien, że większość języków obsługuje tę samą funkcjonalność, a ponieważ tworzenie folderów jest obsługiwane przez aplikację, foldery zawsze tam będą.
źródło
.gitkeep
Konwencja jest znacznie lepsza praktyka.Oto hack, ale zabawne, że to działa (Git 2.2.1). Podobne do sugestii @Teka, ale łatwiejsze do zapamiętania:
git submodule add path_to_repo
).submodules
. Zatwierdź zmianę..submodules
plik i zatwierdź zmianę.Teraz masz katalog, który jest tworzony, gdy zatwierdzanie jest sprawdzane. Interesującą rzeczą jest to, że jeśli spojrzysz na zawartość obiektu drzewa tego pliku, otrzymasz:
Nie zachęciłbym go jednak do użycia, ponieważ może przestać działać w przyszłych wersjach Gita. Co może spowodować uszkodzenie repozytorium.
źródło
Wielu już odpowiedziało na to pytanie. Po prostu dodajemy tutaj wersję PowerShell.
źródło
Jeśli chcesz dodać folder, który pomieści wiele danych przejściowych w wielu katalogach semantycznych, jednym z podejść jest dodanie czegoś takiego do swojego katalogu głównego .gitignore ...
/app/data/**/*.* !/app/data/**/*.md
Następnie możesz zatwierdzić opisowe pliki README.md (lub puste pliki, nie ma to znaczenia, o ile możesz kierować je unikalnie tak jak
*.md
w tym przypadku) w każdym katalogu, aby upewnić się, że wszystkie katalogi pozostaną częścią repo, ale pliki (z rozszerzeniami) są ignorowane. OGRANICZENIE:.
w nazwach katalogów nie są dozwolone!Możesz wypełnić wszystkie te katalogi plikami xml / images lub czymkolwiek i dodawać kolejne katalogi w
/app/data/
miarę upływu czasu wraz z rozwojem potrzeb pamięci dla Twojej aplikacji (pliki README.md służą do zapisania w opisie tego, do czego służy każdy katalog pamięci) dokładnie).Nie ma potrzeby dalszej zmiany
.gitignore
lub decentralizacji poprzez utworzenie nowego.gitignore
dla każdego nowego katalogu. Prawdopodobnie nie jest to najmądrzejsze rozwiązanie, ale jest zwięzłe gitignore i zawsze działa dla mnie. Ładnie i prosto! ;)źródło
Łatwym sposobem na to jest dodanie
.gitkeep
pliku do katalogu, który chcesz (obecnie) pozostawić pusty.Zobacz tę odpowiedź SOF, aby uzyskać więcej informacji - która wyjaśnia również, dlaczego niektórzy uważają, że konkurencyjna konwencja dodawania pliku .gitignore (jak podano w wielu odpowiedziach tutaj) jest myląca.
źródło
Dodanie jeszcze jednej opcji do walki.
Zakładając, że chcesz do tego dodać katalog
git
, do wszystkich celów związanych zgit
, powinien pozostać pusty i nigdy nie śledzić jego zawartości,.gitignore
jak sugeruje to tutaj wielokrotnie, załatwi sprawę .Format, jak wspomniano, to:
Teraz, jeśli chcesz to zrobić w wierszu poleceń, jednym zamachem, podczas gdy w katalogu, który chcesz dodać, możesz wykonać:
Sam mam skrypt powłoki, którego używam do tego celu. Nazwij skrypt, jak chcesz i dodaj go gdzieś na ścieżce dołączania lub bezpośrednio do niego:
Dzięki temu możesz albo wykonać go z katalogu, który chcesz dodać, albo odwołać się do katalogu jako pierwszego i jedynego parametru:
Inną opcją (w odpowiedzi na komentarz przez @GreenAsJade), jeśli chcesz śledzić pusty folder, który MAJ zawierać śledzone pliki w przyszłości, ale będzie pusta do tej pory można ommit
*
z.gitignore
pliku i sprawdzić , że w. Zasadniczo wszystko, co mówi plik, to „nie ignoruj mnie ”, ale poza tym katalog jest pusty i śledzony.Twój
.gitignore
plik wyglądałby następująco:To wszystko, sprawdź to, a masz pusty, ale śledzony katalog, w którym możesz śledzić pliki w późniejszym czasie.
Powodem, dla którego sugeruję zachowanie tej jednej linii w pliku, jest to, że podaje
.gitignore
cel. W przeciwnym razie ktoś po linii może pomyśleć o jego usunięciu. Może to pomóc, jeśli umieścisz komentarz nad linią.źródło
Czasami masz do czynienia ze źle napisanymi bibliotekami lub oprogramowaniem, które potrzebują „prawdziwego” pustego i istniejącego katalogu. Ułożenie prostego
.gitignore
lub.keep
może je złamać i spowodować błąd. W tych przypadkach pomocne mogą być następujące elementy, ale nie ma gwarancji ...Najpierw utwórz potrzebny katalog:
Następnie dodajesz uszkodzony symboliczny link do tego katalogu (ale w każdym innym przypadku niż opisany powyżej przypadek użycia, użyj
README
wyjaśnienia):Aby zignorować pliki w tym katalogu, możesz dodać go do katalogu głównego
.gitignore
:Aby dodać zignorowany plik, użyj parametru, aby go wymusić:
Po zatwierdzeniu masz zepsuty link symboliczny w indeksie, a git tworzy katalog. Uszkodzony link ma pewne zalety, ponieważ nie jest zwykłym plikiem i nie wskazuje zwykłego pliku. Tak więc pasuje nawet do części pytania „(która nie zawiera plików)”, nie z intencji, ale ze znaczenia:
To polecenie pokazuje pusty wynik, ponieważ w tym katalogu nie ma żadnych plików. Dlatego większość aplikacji, które pobierają wszystkie pliki z katalogu, zwykle nie widzi tego linku, przynajmniej jeśli robi to „plik istnieje” lub „jest czytelny”. Nawet niektóre skrypty nie znajdą tam żadnych plików:
Ale zdecydowanie zalecam stosowanie tego rozwiązania tylko w szczególnych okolicznościach, dobre napisanie
README
w pustym katalogu jest zwykle lepszym rozwiązaniem. (I nie wiem, czy to działa z systemem plików Windows ...)źródło
Czytając odpowiedzi @ofavre i @ stanislav-bashkyrtsev przy użyciu zepsutych odniesień do podmoduła GIT w celu utworzenia katalogów GIT, jestem zaskoczony, że nikt nie zasugerował jeszcze tej prostej zmiany pomysłu, aby wszystko było rozsądne i bezpieczne:
Zamiast włamać fałszywy submoduł do GIT , po prostu dodaj pusty prawdziwy .
Wpisz: https://gitlab.com/empty-repo/empty.git
Repozytorium GIT z dokładnie jednym zatwierdzeniem:
Bez wiadomości, bez zatwierdzonych plików.
Stosowanie
Aby dodać pusty katalog do repozytorium GIT:
Aby przekonwertować wszystkie istniejące puste katalogi na submoduły:
Podczas tworzenia odwołania do podmodułu Git zapisze najnowszy skrót zatwierdzenia, więc nie musisz się martwić o mnie (lub GitLab) używającego go do wstrzykiwania złośliwych plików. Niestety nie znalazłem żadnego sposobu na wymuszenie, który identyfikator zatwierdzenia jest używany podczas realizacji transakcji, więc będziesz musiał ręcznie sprawdzić, czy identyfikator zatwierdzenia referencyjnego jest
e84d7b81f0033399e325b8037ed2b801a5c994e0
używanygit submodule status
po dodaniu repo.Nadal nie rodem rozwiązanie, ale najlepsze, prawdopodobnie może mieć bez kogoś uzyskiwanie ręce naprawdę , naprawdę brudne w kodzie GIT.
Dodatek: Odtwarzanie tego zatwierdzenia
Powinieneś być w stanie odtworzyć to dokładne zatwierdzenie, używając (w pustym katalogu):
Tworzenie powtarzalnych zatwierdzeń GIT jest zaskakująco trudne…
źródło
Nie możesz Jest to celowa decyzja projektantów wydana przez opiekunów Git. Zasadniczo celem systemu zarządzania kodem źródłowym, takiego jak Git, jest zarządzanie kodem źródłowym, a puste katalogi nie są kodem źródłowym. Git jest również często opisywany jako narzędzie do śledzenia zawartości, a puste katalogi nie są treściami (wręcz przeciwnie), więc nie są śledzone.
źródło
Możesz zapisać ten kod jako create_readme.php i uruchomić kod PHP z katalogu głównego swojego projektu Git.
Dodaje pliki README do wszystkich pustych katalogów, aby katalogi te zostały dodane do indeksu.
Więc zrób
źródło