Találtam egy slackbuild gyűjteményt, amelyekre szükségem van a GitHubon. https://github.com/PhantomX/slackbuilds/ Nem akarom megszerezni az összes gitet.

git clone https://github.com/PhantomX/slackbuilds.git 

De csak készítsen slackbuild-et ehhez .

Hogyan lehet ezt megtenni? Lehetséges?

megjegyzések

Válasz

Végül letölti az egész előzményt, ezért nem látok benne sok hasznot, de Ön “ritka” pénztár használatával kiválaszthatja az egyes alkatrészeket. Idézi ezt a verem túlcsorduló bejegyzést :

A ritka lépések A klón a következő:

mkdir <repo> cd <repo> git init git remote add -f origin <url> 

Ez egy üres adattárat hoz létre a távvezérlővel, és minden objektumot lekér, de nem ellenőrzi őket. Ezután do:

git config core.sparseCheckout true 

Most meg kell határoznia, mely fájlokat / mappákat szeretné ellenőrizni. Ez úgy történik, hogy felsorolja őket a .git/info/sparse-checkout, pl .:

 echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout  

Végül, de nem utolsósorban, frissítse az üres repót a távvezérlő állapotával:

git pull origin master 

Érdemes megnéznie a kiterjesztett oktatóanyag , és valószínűleg el kell olvasnia a hivatalos dokumentációt a ritka fizetéshez .

Lehet, hogy jobban jár, ha egy sekély klónt is használ. A git pull korábban megadott parancs, próbálkozzon:

git pull --depth=1 origin master 

Megjegyzések

  • Kapok error: Sparse checkout leaves no entry on working directory -et, miután elvégeztem a git húzást, miután elvégeztem a módosítást core.sparseCheckout és .git/info/sparse-checkout
  • Javítás: git init; git remote ... csak beállított dolgokat, semmi nincs letöltve. A ritka lényege az, hogy csak azokat az objektumokat szerezze be, amelyek érdeklik.
  • @vonbrand, amelyek ‘ s amit a -f opció a következőre vonatkozik: ” -f opcióval a git fetch < név > a távoli információk beállítása után azonnal fut. ”
  • Miután git remote add -f origin <url> a git továbbra is letölti a teljes repót . Az én esetemben nem akarok arra várni, hogy várakozzak erre az időre, még akkor is, ha nem ‘ nem fizetem ki a teljes repót.
  • A ritka fizetéskor meghatározzuk, mit akarunk ellenőrizni, de van-e mód arra, hogy kizárjunk néhány könyvtárat, és megnézzük a többit?

Válasz

git clone --filter a 2.19-es verziótól már működik a GitHubon (tesztelve 2020-09 -18, git 2.25.1)

Ez az opció a távoli protokoll frissítésével együtt került hozzáadásra, és valóban megakadályozza az objektumok letöltését a szerver.

Pl. csak a tároló d1 eleméhez szükséges objektumok klónozása: https://github.com/cirosantilli/test-git-partial-clone Megtehetem:

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 

A klón parancs csak:

Ezután a checkout parancs csak a hiányzó foltokat (fájlokat) tölti le a szerverről:

  • d1/a
  • d1/b

Még jobb, ha később a GitHub valószínűleg támogatni fogja:

 --filter=blob:none \ --filter=tree:0 \ 

ahol --filter=tree:0 a Git 2.20-ból megakadályozza a az összes faobjektum felesleges clone beolvasása, és lehetővé kell tenni, hogy elhalasszák a következőt: checkout. De a 2020-09-18-as tesztemen, amely nem sikerült:

fatal: invalid filter-spec "combine:blob:none+tree:0" 

feltehetően azért, mert a --filter=combine: összetett szűrő ( hozzáadva a Git 2.24-ben, több --filter) implikálásával, még nem valósult meg.

Megfigyeltem, hogy mely objektumok kerültek beolvasásra:

git verify-pack -v .git/objects/pack/*.pack 

a következő helyen említettük: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Nem ad teljesen világos jelzést arról, hogy mi is az egyes objektum, de megadja az egyes objektumok típusát (commit, tree, blob), és mivel ebben a minimális repóban olyan kevés tárgy van, egyértelműen levezethetem, hogy mindegyik Az objektum az.

git rev-list --objects --all egyértelműbb kimenetet hozott létre a fák / foltok elérési útjaival, de sajnos lekér néhány objektumot, amikor futtatom, ami megnehezíti a meghatározást mit mikor kaptak le, tudassa velem, ha valakinek van jobb parancsnoka. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ 2020-01-17-től már említ --filter blob:none.

git sparse-checkout

I Szerintem ez a parancs egy olyan beállításfájl kezelésére szolgál, amely szerint ” Csak ezek az alfák érdekelnek “, így a jövőbeni parancsok csak azokat érintik részfák. De egy kicsit nehéz megbizonyosodni róla, mert az aktuális dokumentáció kissé … ritka 😉

Ez önmagában nem akadályozza a foltok beolvasását.

Ha ez a megértés helyes, akkor ez jól kiegészíti a fent leírt git clone --filter t, mivel ez megakadályozná több objektum véletlen beolvasását, ha git műveleteket kíván végrehajtani a részleges klónozott repóban .

Amikor a Git 2.25.1 verziót próbáltam:

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 

nem működött, mert a init valójában lekérte az összes objektumot.

Azonban a 2.28-as Git-ben nem “a kívánt módon kapta meg az objektumokat. De ha mégis megteszem:

git sparse-checkout set d1 

d1 nincs beolvasva és nem ellenőrizve, pedig ez kifejezetten mondja kéne: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-part-clones Jogi nyilatkozattal:

Figyelje, hogy a részleges klónfunkció általánosan elérhetővé váljon [1].

[1]: A GitHub továbbra is belsőleg értékeli ezt a funkciót, amíg engedélyezve van néhány kiválasztott adattáron (beleértve az ebben a bejegyzésben használt példát). Amint a szolgáltatás stabilizálódik és érlelődik, folyamatosan tájékoztatjuk Önt a fejlődéséről.

Tehát igen, túl nehéz ahhoz, hogy bizonyos legyünk benne. pillanatban, részben a GitHub örömeinek köszönhetően, amelyek zárt forráskódúak. De figyeljünk rá.

Parancsbontás

A kiszolgálót a következőkkel kell konfigurálni:

git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 

Parancslista:

  • iv

kihagyja az összes foltot, de továbbra is lekéri az összes fa objektumot

  • --filter=tree:0 kihagyja a szükségtelen fákat: https://www.spinics.net/lists/git/msg342006.html

  • --depth 1 már feltételezi, hogy --single-branch, lásd még: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git

  • file://$(path) szükséges a git clone protokoll leküzdéséhez: A https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path

  • iv --filter=combine:FILTER1+FILTER2 az a szintaxis, amelyben több szűrőt kell használni egyszer a --filter átadása valamilyen okból meghiúsul: ” több szűrő nem kombinálható “. Ez a Git 2.24-es verzióval került hozzáadásra az e987df5fe62b8b29be4cdcdeb3704681ada2b29e ” list-object-filter: összetett szűrők megvalósításához ”

    Szerkesztés: a Git 2.28-on kísérletileg azt látom, hogy a --filter=FILTER1 --filter FILTER2 is ugyanolyan hatást fejt ki, mivel a GitHub még nem hajtja végre a combine: -t 2020-09- 18 és panaszkodik fatal: invalid filter-spec "combine:blob:none+tree:0". Melyik verzióban mutatta be a TODO?

  • A --filter formátuma a man git-rev-list.

    Dokumentumok a Git-fán:

    Helyi tesztelés

    A következő szkript reprodukálhatóan generálja a https://github.com/cirosantilli/test-git-partial-clone adattár helyben, megcsinál egy helyi klónt és megfigyeli a klónozást:

    #!/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 .

    Kimenet a Git v2.19.0 verzióban:

    # 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 

    Következtetések: az összes blob a hiányzik. Például.0975df9b39e23c15f63db194df7f45c76528bccb, amely d2/b nincs ott, miután megnézte a d1/a.

    Ne feledje, hogy root/root és mybranch/mybranch szintén hiányzik, de a --depth 1 ezt elrejti a hiányzó fájlok listáját. Ha eltávolítja a következőt: --depth 1, akkor azok megjelennek a hiányzó fájlok listáján.

    Van egy álmom

    Ez a szolgáltatás forradalmasíthatja a Git-et.

    Képzelje el, hogy a vállalat összes kódbázisa egyetlen repóban csúnya, harmadik féltől származó eszközök, például repo nélkül.

    Képzelje el, hogy hatalmas foltokat tárol közvetlenül a repóban, bármilyen csúnya harmadik fél kiterjesztése nélkül.

    Képzelje el, ha a GitHub engedélyezné a fájlonként / könyvtár metaadatánként , például csillagok és engedélyek, így minden személyes dolgát egyetlen repóban tárolhatja.

    Képzelje el, ha almodulokat pontosan úgy kezelték, mint a szokásos könyvtárakat : csak kérjen egy fa SHA-t, és egy DNS-szerű mechanizmus megoldja a kérését , először a helyi ~/.git , majd először a kiszolgálókhoz (a vállalat tükrözéséhez / gyorsítótárához), majd végül a GitHub-ra.

    Válasz

    Próbálja ki:

    svn export https://github.com/PhantomX/slackbuilds/trunk/${directory} 

    Megjegyzések

    • Ez a legegyszerűbb módszer. Nem tölti le az összes repót. Ne feledje, hogy hozzá kell adnunk a /trunk -t, és el kell távolítanunk a /tree/master elemet. További itt
    • köszi! Csak a repo mappáját szeretném klónozni, és nem a repóban lévő összes mappát. És ez nekem nagyon működik.

    Válasz

    működő megoldás:

    te ki kell kapcsolnia a tömörítést:

    git config --global core.compression 0 

    akkor sekély klónt kell használnia

    git clone --depth=1 <url> 

    akkor a legfontosabb lépés az, hogy CD-t küldj a klónozott projektedbe.

    cd <shallow cloned project dir> 

    most lépésről lépésre bontsa ki a klón

    git fetch --depth=N, with increasing N 

    pl.

    git fetch --depth=4 

    akkor,

    git fetch --depth=100 

    akkor,

    git fetch --depth=500 

    kiválaszthatja, hogy hány lépést szeretne az N helyettesítésével,

    és végül letöltheti az összes fennmaradó verziót használja,

    git fetch --unshallow 

    szavazzon, ha ez segít Önnek 🙂

    Válasz

    Végül a fentieknek köszönhetően működtem. Közvetlenül szerkesztettem a fájlt, és hibákat találtam azzal, hogy véletlenül feltettem az idézeteket. A .git / info / sparse-checkout fájljának csak a könyvtárat kell tartalmaznia, idézőjelek nélkül. Íme egy példa: Ez a gigantikus projekt: https://github.com/SharePoint/sp-dev-fx-webparts , csak a mintakatalógus. https://github.com/SharePoint/sp-dev-fx-webparts / fa / master / minták / react-script-editor

    Követtem a fenti utasításokat, és akkor működtem, amikor az .git / info / sparse-checkout fájlomban éppen ez volt.

    minták / react-script-editor

    Válasz

    Ez klónoz egy adott mappát és eltávolítja az összes előzményt, amely nem kapcsolódik hozzá.

    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 

    Megjegyzések

    • Ez akkor is klónozza az összes előzményt (--depth=1 az elkerülése érdekében) és az összes többi könyvtárat (??? hogy elkerülje?).

    Válasz

    A GitHub repókhoz bármelyik alklónozható bármely GitHub-adattár könyvtárai (bármilyen referenciánál) a https://github.com/HR/github-clone

    megjegyzések használatával h3>

    • Sajnos ez nem megfelelő a Dockerfile-szcenáriókhoz, mivel a Python egészét függőségként hordaná fel, hogy csak egyszer használhassa a képépítés során.

    Válasz

    Különleges korlátozásokkal válaszolok, amelyekkel szembesültem.

    • A VSO-ban az SSH-t a biztonság letiltotta, ezért nem tudta használni a git archívumot. Csak a PAT / CredentialProvider programot támogatták.
    • A fióktelepünknek hatalmas kódja volt, így a git klón önmagában legalább 15 percet vesz igénybe.

    Íme, amit tettem:

    1. egyszeri manuális folyamat: a VSO felhasználói felületén hozzon létre egy új távoli ág mondjon “emptyBranch”, amelynek nulla fájlja van (az összes törlődik).
    2. git clone --depth=1 --single-branch --branch emptyBranch <remote> (elég gyors)
    3. git checkout <branchToSyncTo> <directoryToSyncTo> (csak egy adott mappát néz ki)

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük