Pracuję z repozytorium z bardzo dużą liczbą plików, których wypisanie zajmuje kilka godzin. Zastanawiam się, czy Git działałby dobrze z tego rodzaju repozytorium teraz, gdy obsługuje rzadkie pobrania, ale każdy przykład, który mogę znaleźć, robi następujące rzeczy:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
Problem z tą sekwencją poleceń polega na tym, że oryginalny klon również wykonuje pobieranie. Jeśli dodasz -n do oryginalnego polecenia clone, polecenie odczytu drzewa spowoduje następujący błąd:
błąd: Rzadkie wyewidencjonowywanie nie pozostawia żadnego wpisu w katalogu roboczym
Jak można wykonać rzadkie wyewidencjonowanie bez uprzedniego wyewidencjonowania wszystkich plików?
git worktree add --no-checkout
będzie działać również (nie tylkogit clone --no-checkout
) z git 2.9 (tylko 2016). Zobacz moją odpowiedź poniżejOdpowiedzi:
W 2020 roku istnieje prostszy sposób radzenia sobie z rzadkim pobieraniem pieniędzy bez martwienia się o pliki .git. Oto jak to zrobiłem:
Zauważ, że wymaga zainstalowanego gita w wersji 2.25. Przeczytaj więcej na ten temat tutaj: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
AKTUALIZACJA:
Powyższe
git clone
polecenie nadal sklonuje repozytorium wraz z jego pełną historią, ale bez sprawdzania plików. Jeśli nie potrzebujesz pełnej historii, możesz dodać parametr --depth do polecenia, na przykład:źródło
sparse-checkout --cone
funkcję na stackoverflow.com/a/59515426/6309--filter
) do odpowiedzi.--depth
parametr, który pozwala nam zrobić płytki klon. Czy to pomoże? @Tao, nie jestem pewien, jak użyć--filter
w tym przypadku, nie próbowałem. Czy mógłbyś podać przykład lub opublikować inną odpowiedź na ten temat?Należy pamiętać, że ta odpowiedź powoduje pobranie pełnej kopii danych z repozytorium.
git remote add -f
Polecenie sklonowania całego repozytorium. Ze strony podręcznika mangit-remote
:Spróbuj tego:
Teraz zobaczysz, że masz „przycięte” pobranie z obecnymi tylko plikami z path / within_repo / to / allowed_subdir (i w tej ścieżce).
Zauważ, że w linii poleceń Windows nie możesz cytować ścieżki, tzn. Musisz zmienić szóste polecenie na to:
jeśli nie, otrzymasz cudzysłowy w pliku sparse-checkout i to nie zadziała
źródło
git remote add
Pliki do pobrania dowodzenia wszystko dlatego, że to, co-f
robi - mówi ona natychmiast sprowadzić, zanim pan określił rozrzedzone opcje kasie. Ale pominięcie lub zmiana kolejności to nie pomoże. Rzadkie pobrania dotyczą tylko drzewa roboczego, a nie repozytorium. Jeśli zamiast tego chcesz, aby twoje repozytorium przeszło na dietę, musisz zamiast tego spojrzeć na opcje--depth
lub--single-branch
.Klon Git ma opcję (
--no-checkout
lub-n
), która robi to, co chcesz.Na liście poleceń po prostu zmień:
Do tego:
Następnie możesz skorzystać z rzadkiej płatności zgodnie z pytaniem.
źródło
--depth <depth>
opcji na git clone. Spowoduje to pobranie tylko ostatnich<depth>
zatwierdzeń z historii. Obecnie nie ma sposobu na częściowe pobranie pojedynczego zatwierdzenia za pomocą git, chociaż jeśli twój pilot go obsługuje, możesz użyćgit archive --remote
do pobrania częściowych zestawów plików.Miałem podobny przypadek użycia, z wyjątkiem tego, że chciałem pobrać tylko zatwierdzenie dla tagu i wyczyścić katalogi. Używanie
--depth 1
sprawia, że jest to naprawdę rzadkie i może naprawdę przyspieszyć działanie.źródło
Znalazłem odpowiedź, której szukałem, z jednej linijki opublikowanej wcześniej przez pavek (dzięki!), Więc chciałem udzielić pełnej odpowiedzi w jednej odpowiedzi, która działa w systemie Linux (GIT 1.7.1):
Zmieniłem nieco kolejność poleceń, ale nie wydaje się to mieć żadnego wpływu. Kluczem jest obecność końcowego ukośnika „/” na końcu ścieżki w kroku 5.
źródło
Niestety żadna z powyższych nie zadziałała, więc spędziłem bardzo dużo czasu próbując różnych kombinacji
sparse-checkout
plików.W moim przypadku chciałem pominąć foldery z konfiguracjami IntelliJ IDEA.
Oto co zrobiłem:
Biegać
git clone https://github.com/myaccount/myrepo.git --no-checkout
Biegać
git config core.sparsecheckout true
Utworzono
.git\info\sparse-checkout
z następującą zawartościąUruchom polecenie „git checkout -”, aby pobrać wszystkie pliki.
Aby to zadziałało, trzeba było dodać
/*
po nazwie folderu.Mam git 1.9
źródło
Tak, możliwe jest pobranie folderu zamiast pobierania całego repozytorium. Nawet jakiekolwiek / ostatnie zatwierdzenie
Niezły sposób na zrobienie tego
-r HEAD pobierze tylko ostatnią wersję, zignoruje całą historię.
Zanotuj trunk i / specific-folder
Skopiuj i zmień adres URL przed i po
/trunk/
. Mam nadzieję, że to komuś pomoże. Cieszyć się :)Zaktualizowano 26 września 2019 r
źródło
git 2.9 (czerwiec 2016) uogólni
--no-checkout
opcjęgit worktree add
(polecenie, które pozwala na pracę z wieloma drzewami roboczymi dla jednego repozytorium )Zobacz commit ef2a0ac (29 marca 2016) autorstwa Ray Zhang (
OneRaynyDay
) .Pomagali: Eric Sunshine (
sunshineco
) i Junio C Hamano (gitster
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu 0d8683c , 13 kwietnia 2016 r.)git worktree
Strona podręcznika zawiera teraz:źródło
Kroki do rzadkiego wyewidencjonowania tylko określonego folderu:
źródło
Na podstawie tej odpowiedzi przez apenwarr i ten komentarz przez Miral wymyśliłem następujący roztwór, który uratował mi prawie 94% miejsca na dysku podczas klonowania repozytorium git linux lokalnie, podczas gdy tylko chce jednego podkatalogu Dokumentacja:
Zeszłam więc z 2,9 GB do 182 MB, co już jest fajne.
Jednak nie udało mi się z tym zadziałać
git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test
( wskazano tutaj ), ponieważ wtedy wszystkie brakujące pliki zostały dodane jako usunięte pliki do indeksu. Więc jeśli ktoś zna odpowiednikgit clone --filter=blob:none
forgit fetch
, prawdopodobnie możemy zaoszczędzić trochę więcej megabajtów. (Przeczytanie strony podręcznika podręcznikagit-rev-list
również wskazuje, że jest coś podobnego--filter=sparse:path=…
, ale to też nie zadziałało.(Wszyscy próbowali z git 2.20.1 z Debian Buster.)
źródło
--filter=sparse:path=…
.Jestem nowy w git, ale wygląda na to, że jeśli wykonam git checkout dla każdego katalogu, to działa. Ponadto plik sparse-checkout musi mieć końcowy ukośnik po każdym wskazanym katalogu. Ktoś z większym doświadczeniem proszę potwierdzić, że to zadziała.
Co ciekawe, jeśli wyewidencjonujesz katalog, którego nie ma w pliku sparse-checkout, wydaje się, że nie ma to znaczenia. Nie pojawiają się w statusie git, a git read-tree -m -u HEAD nie powoduje usunięcia go. git reset --hard również nie powoduje usunięcia katalogu. Czy ktoś bardziej doświadczony chciałby skomentować, co myśli git o katalogach, które są wyewidencjonowane, ale których nie ma w rzadkim pliku checkout?
źródło
W moim przypadku chcę pominąć
Pods
folder podczas klonowania projektu. Zrobiłem krok po kroku jak poniżej i to działa dla mnie. Mam nadzieję, że to pomoże.Notatka: Jeśli chcesz pominąć więcej folderów, po prostu dodaj więcej linii w pliku sparse-checkout.
źródło