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

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 modyfikacji core.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:

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

Format --filter jest udokumentowany na man git-rev-list.

Dokumenty w drzewie Git:

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 

GitHub upstream .

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:

  1. Jednorazowy proces ręczny: w VSO UI utwórz nowy gałąź zdalna mówi „emptyBranch”, która ma zero plików (wszystkie są usuwane).
  2. git clone --depth=1 --single-branch --branch emptyBranch <remote> (całkiem szybko)
  3. git checkout <branchToSyncTo> <directoryToSyncTo> (pobiera tylko określony folder)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *