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
- stackoverflow.com/a/13738951/2072269
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ástcore.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:
- egyetlen objektum végrehajtása a
master
ág csúcsával - az adattár mind a 4 faobjektuma :
- az elkötelezettség felső szintű címjegyzéke
- a három könyvtár
d1
,d2
,master
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:
- 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
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
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:
- 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).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(elég gyors) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(csak egy adott mappát néz ki)