Löysin kokoelman slackbuildeja, joita tarvitsen GitHubista. https://github.com/PhantomX/slackbuilds/ En halua saada kaikkea.
git clone https://github.com/PhantomX/slackbuilds.git
Mutta hanki vain löysä rakenne tälle .
Kuinka tämä tehdään? Onko se mahdollista?
kommentit
- stackoverflow.com/a/13738951/2072269
Vastaa
Loppujen lopuksi lataat koko historian, joten en näe siinä paljon hyötyä, mutta sinä voi kasata tiettyjä osia ”harvalla” kassalle. Lainaten tätä pinon ylivuototekstiä :
Harvauksen tekemisen vaiheet klooni ovat seuraavat:
mkdir <repo> cd <repo> git init git remote add -f origin <url>
Tämä luo kaukosäätimelläsi tyhjän arkiston ja noutaa kaikki objektit, mutta ei tarkista niitä. Sitten tee:
git config core.sparseCheckout true
Nyt sinun on määritettävä, mitkä tiedostot / kansiot haluat tarkistaa. Tämä tehdään lisäämällä ne kansioon
.git/info/sparse-checkout
, esim .:echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
Viimeisenä mutta ei vähäisimpänä, päivitä tyhjä repo kaukosäätimen tilalla:
git pull origin master
Haluat ehkä katsoa laajennettu opetusohjelma ja sinun pitäisi luultavasti lukea virallinen -asiakirja harvaan kassalle .
Saatat olla parempi käyttää myös matalaa kloonia . git pull
aiemmin annettu komento, yritä:
git pull --depth=1 origin master
kommentit
- Saan
error: Sparse checkout leaves no entry on working directory
sen jälkeen kun olen suorittanut git-vedon tekemällä muokkauksencore.sparseCheckout
– ja.git/info/sparse-checkout
- Korjaus:
git init; git remote ...
asetti juuri asiat, mitään ei ladata. Harvinainen on saada vain kiinnostavat kohteet. - @vonbrand että ’ s mitä
-f
-vaihtoehto on: ” -f-vaihtoehdon avulla git noutaa < nimi > suoritetaan heti etätietojen määrittämisen jälkeen. ” - Kun
git remote add -f origin <url>
git on edelleen lataamassa koko repoa . Minun tapauksessani en halua ’ halua viettää aikaa odottaessani sitä, vaikka se ei maksaisi ’ ei koko repoa. / li> - Harvassa kassalla määritämme, mitä haluamme tarkistaa, mutta onko olemassa tapa sulkea pois muutama hakemisto ja tarkistaa loput?
Vastaa
git clone --filter
gitistä 2.19 toimii nyt GitHubissa (testattu 2020-09 -18, git 2.25.1)
Tämä vaihtoehto lisättiin yhdessä etäprotokollan päivityksen kanssa, ja se estää todella esineiden lataamisen palvelin.
Esim. kloonata vain tämän tietovaraston d1
vaaditut objektit: https://github.com/cirosantilli/test-git-partial-clone Voin:
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
Kloonikomento saa vain:
- yksi sitoutumisobjekti
master
-haaran kärjellä - kaikki 4 arkiston puuobjektia :
- sitouttamisen ylätason hakemisto
- kolme hakemistoa id = ”8f69fd5253”>
,d2
,master
Sitten checkout
-komento hakee vain puuttuvat lohkot (tiedostot) palvelimelta:
-
d1/a
-
d1/b
Vielä parempi, myöhemmin GitHub alkaa todennäköisesti tukea:
--filter=blob:none \ --filter=tree:0 \
missä --filter=tree:0
Git 2.20: sta estää tarpeeton clone
hae kaikki puuobjektit ja anna sen lykätä checkout
. Mutta 2020-09-18 -testissäni, joka epäonnistui:
fatal: invalid filter-spec "combine:blob:none+tree:0"
oletettavasti siksi, että komposiittisuodatin --filter=combine:
( lisätty Git 2.24: een, johon viittaa useat --filter
), ei ole vielä toteutettu.
Havaitsin, mitkä objektit haettiin:
git verify-pack -v .git/objects/pack/*.pack
kuten mainittiin osoitteessa: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Se ei anna minulle erittäin selkeää tietoa siitä, mikä kukin objekti on tarkalleen, mutta siinä sanotaan kunkin objektin tyyppi (commit
, tree
, blob
), ja koska tässä vähäisessä repossa on niin vähän esineitä, voin yksiselitteisesti päätellä, mitä kukin objekti on.
git rev-list --objects --all
tuotti selkeämmän tuloksen polkuilla puulle / möykkyille, mutta valitettavasti se noutaa joitain objekteja, kun suoritan sen, minkä vuoksi on vaikea määrittää mitä haettiin, kerro minulle, onko jollakin parempi komento.
TODO löytää GitHub-ilmoituksen sanan, kun he alkoivat tukea sitä. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ mainitaan jo vuodesta 2020-01-17 --filter blob:none
.
git sparse-checkout
I luulen, että tämän komennon on tarkoitus hallita asetustiedostoa, joka sanoo ” välitän vain näistä alipuista ”, jotta tulevat komennot vaikuttavat vain niihin alipuut. Mutta on vähän vaikeaa olla varma, koska nykyinen dokumentaatio on vähän … harva 😉
Se ei sinänsä estä blobien noutoa.
Jos tämä ymmärrys on oikea, se olisi hyvä lisä edellä kuvattuun git clone --filter
-tietoon, koska se estäisi tahattomasti uusien objektien hakemisen, jos aiot tehdä git-operaatioita osittaisessa kloonatussa repossa .
Kun yritin Git 2.25.1 -ohjelmaa:
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
se ei toiminut, koska init
noudatti kaikki objektit.
Git 2.28: ssa se ei kuitenkaan noutanut objekteja halutulla tavalla. Mutta jos teen näin:
git sparse-checkout set d1
d1
ei haeta ja tarkisteta, vaikka tässä nimenomaisesti sanotaan se pitäisi: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-part-clones Vastuuvapauslausekkeella:
Pidä silmällä, että osittainen klooniominaisuus tulee yleisesti saataville [1].
[1]: GitHub arvioi edelleen tätä ominaisuutta sisäisesti, kun se on käytössä muutamissa tietyissä arkistoissa (mukaan lukien tässä viestissä käytetty esimerkki). Kun ominaisuus vakiintuu ja kypsyy, pidämme sinut ajan tasalla sen edistymisestä.
Joten joo, se on aivan liian vaikeaa olla varma hetki, kiitos osittain siitä, että GitHub on suljetun lähdekoodin iloja. Mutta pitäkäämme sitä silmällä.
Komentojen erittely
Palvelin on määritettävä seuraavasti:
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
Komentojen erittely:
-
iv
ohittaa kaikki blobit, mutta noutaa silti kaikki puuobjektit -
--filter=tree:0
ohittaa tarpeettomat puut: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
merkitsee jo--single-branch
, katso myös: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
tarvitaangit clone
-protokollan ylittämiseen: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
iv
--filter=combine:FILTER1+FILTER2
on syntaksi, jossa käytetään useita suodattimia kerran, yrittää välittää--filter
jostain syystä epäonnistuu seuraavilla tavoilla: ” useita suodatinominaisuuksia ei voida yhdistää ”. Tämä lisättiin Git 2.24: ssä osoitteessa e987df5fe62b8b29be4cdcdeb3704681ada2b29e ” list-object-filter: toteuttaa komposiittisuodattimet ”Muokkaa: Git 2.28: ssä näen kokeellisesti, että
--filter=FILTER1 --filter FILTER2
: lla on myös sama vaikutus, koska GitHub ei vielä toteutacombine:
vielä vuodesta 2020-09- 18 ja valittaafatal: invalid filter-spec "combine:blob:none+tree:0"
. Missä versiossa TODO otettiin käyttöön?
--filter
-muoto on dokumentoitu osoitteessa man git-rev-list
.
Git-puun dokumentit:
- 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
Testaa se paikallisesti
Seuraava komentosarja luo toistettavasti https://github.com/cirosantilli/test-git-partial-clone arkisto paikallisesti, tekee paikallisen kloonin ja tarkkailee kloonattua:
#!/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
Tulos Git v2.19.0: ssa:
# 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
Johtopäätökset: kaikki lohkot alueen puuttuu. Esimerkiksi.0975df9b39e23c15f63db194df7f45c76528bccb
, joka on d2/b
, ei ole paikalla tarkistettuasi d1/a
.
Huomaa, että root/root
ja mybranch/mybranch
puuttuvat myös, mutta --depth 1
piilottaa sen luettelo puuttuvista tiedostoista. Jos poistat --depth 1
, ne näkyvät puuttuvien tiedostojen luettelossa.
Minulla on unelma
Tämä ominaisuus voi mullistaa Gitin.
Kuvittele, että yritykselläsi on kaikki koodipohjat yhdessä repossa ilman ruma kolmansien osapuolten työkaluja, kuten repo
.
Kuvittele valtavien möykkyjen tallentamista suoraan repoon ilman mitään rumaa kolmannen osapuolen laajennusta .
Kuvittele, sallisiko GitHub tiedostoa / hakemiston metatietoa kohti , kuten tähdet ja käyttöoikeudet, joten voit tallentaa kaikki henkilökohtaiset asiat yhteen repoon.
Kuvittele, jos alimoduuleja kohdeltiin aivan kuten tavallisia hakemistoja : pyydä vain puuta SHA ja DNS-tyyppinen mekanismi ratkaisee pyyntösi tarkastellaan ensin paikallista ~/.git
, sitten ensin lähemmille palvelimille (yrityksesi peili / välimuisti) ja päädy GitHubiin.
Vastaa
Kokeile tätä:
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
Kommentit
- Tämä on yksinkertaisin tapa. Se ei lataa kaikkia repoja. Huomaa, että meidän on lisättävä
/trunk
ja poistettava/tree/master
. Lisää täällä - kiitos! Haluan vain kloonata repon kansion eikä kaikkia repossa olevia kansioita. Ja tämä toimii todella minulle.
Vastaa
toimiva ratkaisu:
sinä pakkaus on kytkettävä pois päältä:
git config --global core.compression 0
sinun on käytettävä matalaa kloonia
git clone --depth=1 <url>
sitten tärkein vaihe on CD-levy kloonattuun projektiisi
cd <shallow cloned project dir>
avaa nyt klooni vaihe vaiheelta
git fetch --depth=N, with increasing N
esim.
git fetch --depth=4
sitten,
git fetch --depth=100
sitten,
git fetch --depth=500
voit valita kuinka monta vaihetta haluat korvata tämän N: n
ja lopuksi ladata kaikki jäljellä olevat versiot käyttämällä,
git fetch --unshallow
äänestä, jos se auttaa sinua 🙂
Vastaa
Sain tämän toimimaan viimeinkin yllä olevien ansiosta. Muokkasin tiedostoa suoraan ja sain virheitä sisällyttämällä vahingossa lainausmerkit. .Git / info / sparse-checkout -tiedostosi tulee sisältää vain hakemisto, ei lainausmerkkejä. Tässä esimerkki: Tämä jättimäinen projekti: https://github.com/SharePoint/sp-dev-fx-webparts , halusin vain esimerkkihakemisto. https://github.com/SharePoint/sp-dev-fx-webparts / puu / master / näytteet / react-script-editor
Seuraain yllä olevia ohjeita ja sain sen toimimaan, kun .git / info / sparse-checkout -tiedostossani oli juuri tämä
sample / react-script-editor
Vastaa
Tämä kloonaa tietyn kansion ja poistaa kaiken siihen liittyvän historian.
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
Kommentit
- Tämä kloonaa edelleen koko historian (
--depth=1
välttääksesi) ja kaikki muut hakemistot (???
välttääksesi?).
Vastaa
GitHub-repoissa voit kloonata minkä tahansa alilevyn minkä tahansa GitHub-arkiston hakemistot (millä tahansa viitteellä) käyttämällä https://github.com/HR/github-clone
kommentteja
- Valitettavasti tämä ei sovellu Dockerfile-skenaarioihin, koska se veisi koko Pythonin riippuvuudeksi vain käyttääksesi sitä kerran kuvan muodostamisen aikana.
Vastaa
Vastaan erityisillä rajoituksilla, joita kohtasin.
- VSO: ssa SSH poistettiin käytöstä turvallisuuden vuoksi, joten git-arkistoa ei voitu käyttää. Vain PAT / CredentialProvideria tuettiin.
- Haarakonttorillamme oli valtava koodi, joten git-klooni kestää itse vähintään 15 minuuttia.
Tässä tein:
- Kertaluonteinen manuaalinen prosessi: luo uusi VSO-käyttöliittymässä etähaara sanoa ”emptyBranch”, jolla on nolla tiedostoa (kaikki poistetaan).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(melko nopea) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(tarkistaa vain tietyn kansion)