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

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ä muokkauksen core.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:

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

--filter -muoto on dokumentoitu osoitteessa man git-rev-list.

Git-puun dokumentit:

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 

GitHub ylävirtaan .

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:

  1. Kertaluonteinen manuaalinen prosessi: luo uusi VSO-käyttöliittymässä etähaara sanoa ”emptyBranch”, jolla on nolla tiedostoa (kaikki poistetaan).
  2. git clone --depth=1 --single-branch --branch emptyBranch <remote> (melko nopea)
  3. git checkout <branchToSyncTo> <directoryToSyncTo> (tarkistaa vain tietyn kansion)

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *