Jak mogę dodać pusty katalog do repozytorium Git?


4262

Jak mogę dodać pusty katalog (nie zawierający plików) do repozytorium Git?


16
Chociaż nie jest to użyteczne, istnieje sposób na włamanie pustego (naprawdę pustego) katalogu do repozytorium . checkoutJednak nie będzie w przypadku bieżących wersji Git.
tiwo

335
@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.

Dokonywanie @GreenAsJade „s komentarz trwałe:

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”.


25
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).
Carlos Campderrós,

69
zauważ różnicę 1: 1.) pusty folder, 2.) folder z plikiem .gitignore. ;-)
Peter Perháč

6
Jest to idealne rozwiązanie dla folderów pamięci podręcznej .
redolent

10
Niestety skutkuje to niepustym katalogiem, zawiera on jeden ukryty plik.
pedorro

1090

Nie możesz Zobacz często zadawane pytania na temat Git .

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.


67
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.


58
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.


39
+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.

Alternatywnie, jak zauważono w innej odpowiedzi , katalog może zawierać zamiast tego opis READMElub README.mdplik .

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


1
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:

  1. Umieszczenie READMEpliku lub innego pliku z pewną zawartością, aby katalog nie był pusty, lub
  2. 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 .


8
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 \;

21
Możesz zignorować katalog .git: find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
steffen

3
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ć.


4
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.
Jozuego

33

Sposób tworzenia folderu dziennika Ruby on Rails :

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

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,

echo log/dev.log >> .gitignore

ale prawdopodobnie to wiedziałeś.


23
Co to ma wspólnego z Ruby on Rails?
Pytania do kolonistów,


30

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:

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

Alternatywnie, możesz po prostu wykluczyć ignorowanie każdego pliku README:

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

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

find -name README.emptydir

28

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!

  1. Załóżmy, że jesteś w swoim repozytorium.
  2. Utwórz pusty katalog:

    $ mkdir path/to/empty-folder
    
  3. 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).

  4. 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 :

$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' 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).


11
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:

.generated

1
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.

Wystarczy spojrzeć na: http://code.google.com/p/markemptydirs


14

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.

Mam nadzieję, że uznasz to za przydatne.


13

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.


1
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 .


9

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 READMEpliku wyjaśniającego, do czego będzie używany katalog.


8

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.


6
Wolałbym użyćfind . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Tino

8

Rozwiązanie Jamie Flournoy działa świetnie. Oto nieco ulepszona wersja, aby zachować .htaccess:

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

Dzięki takiemu rozwiązaniu masz możliwość popełnienia pusty folder, na przykład /log, /tmpczy /cachei folder pozostanie pusta.


2
Chce zachować pusty katalog, a nie plik.
gvsrepins

2
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ą.


2
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.


To faktycznie działa, ale myślę, że dezorientuje mnie IntelliJ ...: |
rogerdpack

Stworzyłem na podstawie tego lepsze rozwiązanie, które nie ma tych wad: stackoverflow.com/a/58543445/277882
ntninja

7

Wielu już odpowiedziało na to pytanie. Po prostu dodajemy tutaj wersję PowerShell.

Znajdź wszystkie puste foldery w katalogu

Dodaj tam pusty plik .gitkeep

Get-ChildItem 'Path to your Folder' -Recurse -Directory | Where-Object {[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0} | ForEach-Object { New-Item ($_.FullName + "\.gitkeep") -ItemType file}

Nice. (͡☉ ͜ʖ ͡☉)
FiringSquadWitness

6

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! ;)

wprowadź opis zdjęcia tutaj


6

Ł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.


4

Dodanie jeszcze jednej opcji do walki.

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ć:

$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore

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ą.


4

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:

$ php -r "var_export(glob('empty/.*'));"
array (
  0 => 'empty/.',
  1 => 'empty/..',
)

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 ...)


4

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:

commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: Nobody <none>
Date: Thu Jan 1 00:00:00 1970 +0000

Bez wiadomości, bez zatwierdzonych plików.

Stosowanie

Aby dodać pusty katalog do repozytorium GIT:

git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir

Aby przekonwertować wszystkie istniejące puste katalogi na submoduły:

find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;

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…


3

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.


60
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
            }
        }
?>

Więc zrób

git commit -m "message"
git push
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.