Znalazłem kolekcję slackbuildów, niektóre, których potrzebuję, są na GitHubie. https://github.com/PhantomX/slackbuilds/ Nie chcę pobierać całego gita.
git clone https://github.com/PhantomX/slackbuilds.git
Ale zdobądź tylko slackbuild dla tego .
Jak to zrobić? Czy to możliwe?
Komentarze
- stackoverflow.com/a/13738951/2072269
Odpowiedź
W końcu pobierzesz całą historię, więc nie widzę w niej zbytniej korzyści, ale ty może pobierać określone części przy użyciu „rzadkich” transakcji. Cytując ten post dotyczący przepełnienia stosu :
Kroki do zrobienia rzadkiego clone są następujące:
mkdir <repo> cd <repo> git init git remote add -f origin <url>
Tworzy to puste repozytorium razem z pilotem i pobiera wszystkie obiekty, ale ich nie sprawdza. Następnie do:
git config core.sparseCheckout true
Teraz musisz zdefiniować, które pliki / foldery chcesz faktycznie pobrać. W tym celu należy umieścić je w
.git/info/sparse-checkout
, np .:echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
Wreszcie, zaktualizuj swoje puste repozytorium stanem z pilota:
git pull origin master
Warto rzucić okiem na rozszerzony samouczek i prawdopodobnie powinieneś przeczytać oficjalną dokumentację rzadkich płatności .
Lepiej byłoby też użyć płytkiego klonu . Zamiast git pull
komenda podana wcześniej, spróbuj:
git pull --depth=1 origin master
Komentarze
- Otrzymuję
error: Sparse checkout leaves no entry on working directory
po wykonaniu polecenia git pull po wprowadzeniu modyfikacjicore.sparseCheckout
i.git/info/sparse-checkout
- Poprawka:
git init; git remote ...
po prostu skonfigurowałem, nic nie jest pobierane. Chodzi o to, by rzadko znaleźć tylko interesujące Cię obiekty. - @vonbrand, które ' są tym, co
-f
opcja jest dla: ” Z opcją -f, git fetch < name > jest uruchamiany natychmiast po skonfigurowaniu informacji zdalnych. ” - Po
git remote add -f origin <url>
git nadal pobiera całe repozytorium . W moim przypadku nie ' nie chcę na to tracić czasu, nawet jeśli nie ' nie sprawdzam całego repozytorium. - W rzadkich płatnościach określamy, co chcemy sprawdzić, ale czy istnieje sposób na wykluczenie kilku katalogów i sprawdzenie reszty?
Odpowiedź
git clone --filter
z git 2.19 działa teraz na GitHubie (testowane 2020-09 -18, git 2.25.1)
Ta opcja została dodana wraz z aktualizacją zdalnego protokołu i naprawdę zapobiega pobieraniu obiektów z serwer.
Na przykład, aby sklonować tylko obiekty wymagane dla d1
tego repozytorium: https://github.com/cirosantilli/test-git-partial-clone Potrafię:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git checkout master -- d1
Polecenie clone uzyskuje tylko:
- pojedynczy obiekt zatwierdzenia z końcówką
master
gałęzi - wszystkie 4 obiekty drzewa repozytorium:
- katalog najwyższego poziomu zatwierdzenia
- trzy katalogi
d1
,d2
,master
Następnie polecenie checkout
pobiera tylko brakujące obiekty blob (pliki) z serwera:
-
d1/a
-
d1/b
Jeszcze lepiej, później GitHub prawdopodobnie zacznie wspierać:
--filter=blob:none \ --filter=tree:0 \
gdzie --filter=tree:0
z Git 2.20 uniemożliwi niepotrzebne clone
pobieranie wszystkich obiektów drzewa i pozwolenie na odłożenie ich do checkout
. Ale w moim teście 18.09.2020, który kończy się niepowodzeniem z:
fatal: invalid filter-spec "combine:blob:none+tree:0"
prawdopodobnie dlatego, że --filter=combine:
filtr złożony ( dodany w Git 2.24, sugerowany przez wiele --filter
) nie jest jeszcze zaimplementowany.
Zauważyłem, które obiekty zostały pobrane z:
git verify-pack -v .git/objects/pack/*.pack
jak wspomniano na: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Nie daje mi bardzo jasnych informacji o tym, czym dokładnie jest każdy obiekt, ale podaje typ każdego obiektu (commit
, tree
, blob
), a ponieważ w tym minimalnym repozytorium jest tak mało obiektów, mogę jednoznacznie wywnioskować, co obiekt jest.
git rev-list --objects --all
dało wyraźniejsze dane wyjściowe ze ścieżkami dla drzew / obiektów blob, ale niestety pobiera niektóre obiekty, gdy go uruchamiam, co utrudnia określenie co zostało pobrane kiedy, daj mi znać, czy ktoś ma lepsze polecenie.
DO ZROBIENIA znaleźć komunikat GitHub, który mówi, kiedy zaczęli go wspierać. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ z 17.01.2020 już wspomina --filter blob:none
.
git sparse-checkout
I myślę, że to polecenie jest przeznaczone do zarządzania plikiem ustawień, który mówi ” interesują mnie tylko te poddrzewa „, więc przyszłe polecenia będą miały wpływ tylko na te poddrzewa. Ale jest to trochę trudne, ponieważ obecna dokumentacja jest trochę … rzadka 😉
Samo w sobie nie zapobiega pobieraniu obiektów blob.
Jeśli to rozumienie jest poprawne, byłoby to dobre uzupełnienie git clone --filter
opisanego powyżej, ponieważ zapobiegałoby niezamierzonemu pobieraniu większej liczby obiektów, jeśli zamierzasz wykonywać operacje git w częściowym sklonowanym repozytorium .
Kiedy próbowałem na Git 2.25.1:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git sparse-checkout init
nie działało, ponieważ init
faktycznie pobrał wszystkie obiekty.
Jednak w Git 2.28 nie pobrał obiektów zgodnie z oczekiwaniami. Ale jeśli to zrobię:
git sparse-checkout set d1
d1
nie jest pobierany i wyrejestrowywany, mimo że wyraźnie o tym mowa powinno: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-parts-clones Z zastrzeżeniem:
Miej oko na to, że funkcja częściowego klonowania stanie się ogólnie dostępna [1].
[1]: GitHub nadal ocenia tę funkcję wewnętrznie, gdy jest włączona na kilku wybranych repozytoriach (w tym przykład użyty w tym poście). Gdy funkcja ustabilizuje się i dojrzeje, będziemy na bieżąco informować Cię o jej postępach.
Więc tak, po prostu zbyt trudno jest być pewnym moment, częściowo dzięki radościom płynącym z tego, że GitHub jest zamkniętym źródłem. Ale miejmy to na oku.
Opis polecenia
Serwer powinien być skonfigurowany z:
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
Podział poleceń:
-
--filter=blob:none
pomija wszystkie obiekty blob, ale nadal pobiera wszystkie obiekty drzewa -
--filter=tree:0
pomija niepotrzebne drzewa: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
już sugeruje--single-branch
, zobacz także: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
jest wymagany do przezwyciężeniagit clone
błędów protokołu: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
--filter=combine:FILTER1+FILTER2
to składnia umożliwiająca użycie wielu filtrów w raz, próba przekazania--filter
z jakiegoś powodu kończy się niepowodzeniem i: ” nie można łączyć wielu specyfikacji filtrów „. Zostało to dodane w Git 2.24 pod adresem e987df5fe62b8b29be4cdcdeb3704681ada2b29e ” list-objects-filter: zaimplementuj filtry złożone ”Edytuj: na Git 2.28 eksperymentalnie widzę, że
--filter=FILTER1 --filter FILTER2
ma również ten sam efekt, ponieważ GitHub nie implementuje jeszczecombine:
od 2020-09- 18 i narzekafatal: invalid filter-spec "combine:blob:none+tree:0"
. TODO wprowadzone w której wersji?
Format --filter
jest udokumentowany na man git-rev-list
.
Dokumenty w drzewie Git:
- https://github.com/git/git/blob/v2.19.0/Documentation/technical/partial-clone.txt
- https://github.com/git/git/blob/v2.19.0/Documentation/rev-list-options.txt#L720
- https://github.com/git/git/blob/v2.19.0/t/t5616-partial-clone.sh
Przetestuj lokalnie
Poniższy skrypt w sposób powtarzalny generuje https://github.com/cirosantilli/test-git-partial-clone repozytorium lokalnie, klonuje lokalnie i obserwuje sklonowane dane:
#!/usr/bin/env bash set -eu list-objects() ( git rev-list --all --objects echo "master commit SHA: $(git log -1 --format="%H")" echo "mybranch commit SHA: $(git log -1 --format="%H")" git ls-tree master git ls-tree mybranch | grep mybranch git ls-tree master~ | grep root ) # Reproducibility. export GIT_COMMITTER_NAME="a" export GIT_COMMITTER_EMAIL="a" export GIT_AUTHOR_NAME="a" export GIT_AUTHOR_EMAIL="a" export GIT_COMMITTER_DATE="2000-01-01T00:00:00+0000" export GIT_AUTHOR_DATE="2000-01-01T00:00:00+0000" rm -rf server_repo local_repo mkdir server_repo cd server_repo # Create repo. git init --quiet git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 # First commit. # Directories present in all branches. mkdir d1 d2 printf "d1/a" > ./d1/a printf "d1/b" > ./d1/b printf "d2/a" > ./d2/a printf "d2/b" > ./d2/b # Present only in root. mkdir "root" printf "root" > ./root/root git add . git commit -m "root" --quiet # Second commit only on master. git rm --quiet -r ./root mkdir "master" printf "master" > ./master/master git add . git commit -m "master commit" --quiet # Second commit only on mybranch. git checkout -b mybranch --quiet master~ git rm --quiet -r ./root mkdir "mybranch" printf "mybranch" > ./mybranch/mybranch git add . git commit -m "mybranch commit" --quiet echo "# List and identify all objects" list-objects echo # Restore master. git checkout --quiet master cd .. # Clone. Don"t checkout for now, only .git/ dir. git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo cd local_repo # List missing objects from master. echo "# Missing objects after --no-checkout" git rev-list --all --quiet --objects --missing=print echo echo "# Git checkout fails without internet" mv ../server_repo ../server_repo.off ! git checkout master echo echo "# Git checkout fetches the missing directory from internet" mv ../server_repo.off ../server_repo git checkout master -- d1/ echo echo "# Missing objects after checking out d1" git rev-list --all --quiet --objects --missing=print
Dane wyjściowe w Git v2.19.0:
# List and identify all objects c6fcdfaf2b1462f809aecdad83a186eeec00f9c1 fc5e97944480982cfc180a6d6634699921ee63ec 7251a83be9a03161acde7b71a8fda9be19f47128 62d67bce3c672fe2b9065f372726a11e57bade7e b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b 84de03c312dc741d0f2a66df7b2f168d823e122a d2 0975df9b39e23c15f63db194df7f45c76528bccb d2/a 41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master ef29f15c9a7c5417944cc09711b6a9ee51b01d89 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e a0234da53ec608b54813b4271fbf00ba5318b99f root 93ca1422a8da0a9effc465eccbcb17e23015542d root/root master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec 040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a d2 040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f root # Missing objects after --no-checkout ?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb ?308150e8fddde043f3dbbb8573abb6af1df96e63 # Git checkout fails without internet fatal: "/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo" does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. # Git checkout fetches the missing directory from internet remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. # Missing objects after checking out d1 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb
Wnioski: wszystkie obiekty blob spoza . Na przykład.0975df9b39e23c15f63db194df7f45c76528bccb
, czyli d2/b
, nie ma po sprawdzeniu d1/a
.
Zwróć uwagę, że brakuje również root/root
i mybranch/mybranch
, ale --depth 1
ukrywa to przed lista brakujących plików. Jeśli usuniesz --depth 1
, pojawią się one na liście brakujących plików.
Mam sen
Ta funkcja może zrewolucjonizować Git.
Wyobraź sobie, że masz całą bazę kodu swojego przedsiębiorstwa w jednym repozytorium bez brzydkich narzędzi innych firm, takich jak repo
.
Wyobraź sobie przechowywanie dużych obiektów blob bezpośrednio w repozytorium bez żadnych brzydkich rozszerzeń innych firm .
Wyobraź sobie, że GitHub pozwoliłby na metadane pliku / katalogu , takie jak gwiazdki i uprawnienia, dzięki czemu możesz przechowywać wszystkie swoje osobiste rzeczy w jednym repozytorium.
Wyobraź sobie, że podmoduły były traktowane dokładnie jak zwykłe katalogi : po prostu poproś o drzewo SHA, a mechanizm podobny do DNS rozwiązuje Twoje żądanie , pierwsze sprawdzenie Twojego lokalnego ~/.git
, następnie najpierw bliżej serwerów (serwer lustrzany / pamięć podręczna przedsiębiorstwa) i na GitHubie.
Odpowiedź
Wypróbuj to:
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
Komentarze
- To to najprostszy sposób. Nie pobiera całego repozytorium. Pamiętaj, że musimy dodać
/trunk
i usunąć/tree/master
. Więcej tutaj - Dzięki! Chcę tylko sklonować folder repozytorium, a nie wszystkie foldery w repozytorium. I to naprawdę działa dla mnie.
Odpowiedź
Działające rozwiązanie:
Ty musisz wyłączyć kompresję:
git config --global core.compression 0
wtedy musisz użyć płytkiego klonu
git clone --depth=1 <url>
wtedy najważniejszym krokiem jest przejście do sklonowanego projektu
cd <shallow cloned project dir>
teraz otwórz klon, krok po kroku
git fetch --depth=N, with increasing N
np.
git fetch --depth=4
wtedy
git fetch --depth=100
następnie
git fetch --depth=500
możesz wybrać, ile kroków chcesz, zastępując to N,
i na koniec pobrać wszystkie pozostałe wersje używając,
git fetch --unshallow
zagłosuj za, jeśli to pomoże 🙂
Odpowiedz
Wreszcie udało mi się to dzięki powyższemu. Edytowałem plik bezpośrednio, otrzymując błędy przez przypadkowe umieszczenie cudzysłowów. Twój plik .git / info / sparse-checkout powinien zawierać tylko katalog, bez cudzysłowów. Oto przykład: ten gigantyczny projekt: https://github.com/SharePoint/sp-dev-fx-webparts , chciałem tylko edytor scenariusza reakcji w katalog próbek. https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / aware-script-editor
Postępowałem zgodnie z powyższymi wskazówkami i działało, gdy mój plik .git / info / sparse-checkout miał właśnie to w sobie
samples / react-script-editor
Odpowiedź
Spowoduje to sklonowanie określonego folderu i usunięcie całej historii, która nie jest z nim związana.
git clone --single-branch -b {branch} [email protected]:{user}/{repo}.git git filter-branch --subdirectory-filter {path/to/folder} HEAD git remote remove origin git remote add origin [email protected]:{user}/{new-repo}.git git push -u origin master
Komentarze
- Spowoduje to sklonowanie całej historii (
--depth=1
, których należy unikać) i wszystkich innych katalogów (???
, aby uniknąć?).
Odpowiedź
W przypadku repozytoriów GitHub możesz sklonować dowolne -katalogi dowolnego repozytorium GitHub (w dowolnym miejscu) przy użyciu https://github.com/HR/github-clone
Komentarze
- Niestety jest to nieodpowiednie dla scenariuszy Dockerfile, ponieważ spowodowałoby to konieczność użycia całego Pythona jako zależności tylko po to, aby użyć go raz podczas budowania obrazu.
Odpowiedź
Odpowiem z określonymi ograniczeniami.
- W VSO SSH zostało wyłączone ze względów bezpieczeństwa, więc nie można było używać archiwum git. Obsługiwany był tylko PAT / CredentialProvider.
- Nasza gałąź miała ogromny kod, więc git clone zajęłoby minimum 15 minut.
Oto co zrobiłem:
- Jednorazowy proces ręczny: w VSO UI utwórz nowy gałąź zdalna mówi „emptyBranch”, która ma zero plików (wszystkie są usuwane).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(całkiem szybko) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(pobiera tylko określony folder)