Am găsit o colecție de slackbuilds, de care am nevoie sunt pe GitHub. https://github.com/PhantomX/slackbuilds/ Nu vreau să obțin tot git.

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

Dar obțineți doar un slackbuild, pentru acesta .

Cum se face acest lucru? Este posibil?

Comentarii

Răspuns

Veți ajunge să descărcați întregul istoric, așa că nu văd prea multe beneficii în acesta, dar dvs. poate achiziționa anumite părți folosind o comandă „rară”. Citând această postare de depășire a stivei :

Pașii pentru a face un rar clone sunt după cum urmează:

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

Aceasta creează un depozit gol cu telecomanda dvs. și preia toate obiectele, dar nu le verifică. Apoi do:

git config core.sparseCheckout true 

Acum trebuie să definiți ce fișiere / foldere doriți să verificați efectiv. Acest lucru se face listându-le în .git/info/sparse-checkout, de exemplu:

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

Nu în ultimul rând, actualizați repo-ul gol cu starea de la distanță:

git pull origin master 

S-ar putea să doriți să aruncați o privire la tutorial extins și probabil că ar trebui să citiți documentația oficială pentru verificarea rar .

S-ar putea să fiți mai bine să folosiți și o clonă superficială . În loc de git pull dată mai devreme, încercați:

git pull --depth=1 origin master 

Comentarii

  • Primesc error: Sparse checkout leaves no entry on working directory după ce am făcut un git pull după ce am făcut modificarea la core.sparseCheckout și .git/info/sparse-checkout
  • Corecție: git init; git remote ... trebuie doar să configurați lucrurile, nu se descarcă nimic. Întregul punct al sparse este de a obține numai obiecte care vă interesează.
  • @vonbrand care ‘ este ceea ce -f este pentru: ” Cu opțiunea -f, git fetch < nume > se execută imediat după configurarea informațiilor la distanță. ”
  • După git remote add -f origin <url> git descarcă tot repo . În cazul meu, nu ‘ nu vreau să petrec timp așteptând asta, chiar dacă nu ‘ nu achită întreaga repo.
  • În cazul unei verificări rare, definim ce vrem să verificăm, dar există o modalitate de a exclude câteva directoare și de a verifica restul?

Răspunde

git clone --filter din git 2.19 funcționează acum pe GitHub (testat 2020-09 -18, git 2.25.1)

Această opțiune a fost adăugată împreună cu o actualizare a protocolului de la distanță și împiedică cu adevărat descărcarea obiectelor din server.

De exemplu, pentru a clona numai obiectele necesare pentru d1 din acest depozit: https://github.com/cirosantilli/test-git-partial-clone Pot face:

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 

Comanda clonare obține doar:

Apoi, comanda checkout preia numai blob-urile (fișierele) lipsă de pe server:

  • d1/a
  • d1/b

Și mai bine, mai târziu GitHub va începe probabil să sprijine:

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

unde --filter=tree:0 din Git 2.20 va împiedica clone nu este necesar să aducă toate obiectele din arbore și să permită ca acesta să fie amânat la checkout. Dar la testul meu din 2020-09-18, care nu reușește cu:

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

probabil, deoarece filtrul compozit --filter=combine: ( adăugat în Git 2.24, implicit de mai multe --filter) nu este încă implementat.

Am observat ce obiecte au fost preluate cu:

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

așa cum am menționat la: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Nu-mi oferă o indicație foarte clară a ceea ce este exact fiecare obiect, dar spune tipul fiecărui obiect (commit, tree, blob) și, din moment ce există atât de puține obiecte în acea repo minimă, pot deduce fără echivoc ceea ce fiecare obiectul este.

git rev-list --objects --all a produs o ieșire mai clară cu căi pentru copac / blob-uri, dar din păcate preia unele obiecte când îl rulez, ceea ce face dificil de determinat ce a fost preluat când, anunțați-mă dacă cineva are o comandă mai bună.

TODO găsește anunțul GitHub care spune atunci când au început să îl susțină. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ din 17.01.2020 menționează deja --filter blob:none.

git sparse-checkout

I cred că această comandă este menită să gestioneze un fișier de setări care spune ” Îmi pasă doar de acești subarbri „, astfel încât viitoarele comenzi să le afecteze doar pe cele subarburi. Dar este puțin greu să fiu sigur, deoarece documentația actuală este puțin … rar 😉

Nu împiedică, de la sine, preluarea bloburilor.

Dacă această înțelegere este corectă, atunci aceasta ar fi un bun complement la git clone --filter descris mai sus, deoarece ar împiedica preluarea neintenționată a mai multor obiecte dacă intenționați să efectuați operațiuni git în repo parțial clonat .

Când am încercat 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 

nu a funcționat deoarece init a preluat de fapt toate obiectele.

Cu toate acestea, în Git 2.28 nu a preluat obiectele după cum doriți. Dar dacă da:

git sparse-checkout set d1 

d1 nu este preluat și verificat, chiar dacă acest lucru îl spune explicit ar trebui: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # clone sparse-checkout-and-partial-clones Cu responsabilitate:

Aveți grijă ca caracteristica de clonare parțială să devină disponibilă în general [1].

[1]: GitHub evaluează încă această caracteristică internă în timp ce este activată pe câteva depozite selectate (inclusiv exemplul folosit în această postare). Pe măsură ce caracteristica se stabilizează și se maturizează, vă vom ține la curent cu progresul acesteia.

Deci, da, este prea greu să fii sigur la moment, mulțumesc în parte bucuriilor că GitHub este o sursă închisă. Dar să o supraveghem.

Defalcare comandă

Serverul ar trebui configurat cu:

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

Defalcare comandă:

Formatul --filter este documentat pe man git-rev-list.

Docs on Git tree:

Testați-l local

Următorul script generează în mod reproductibil https://github.com/cirosantilli/test-git-partial-clone depozit local, face o clonă locală și observă ceea ce a fost clonat:

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

Ieșire în 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 

Concluzii: toate bloburile din afara d1/ lipsesc. De exemplu.0975df9b39e23c15f63db194df7f45c76528bccb, care este d2/b nu se află după verificarea d1/a.

Rețineți că root/root și mybranch/mybranch lipsesc, de asemenea, dar --depth 1 ascunde acest lucru din lista fișierelor lipsă. Dacă eliminați --depth 1, atunci acestea apar pe lista fișierelor lipsă.

Am un vis

Această caracteristică ar putea revoluționa Git.

Imaginați-vă că aveți toată baza de cod a întreprinderii dvs. într-o singură repo fără instrumente terțe urâte precum repo .

Imaginați-vă stocând blob-uri uriașe direct în repo fără extensii terțe urâte .

Imaginați-vă dacă GitHub ar permite pe fișier / director metadate , cum ar fi stele și permisiuni, astfel încât să puteți stoca toate lucrurile dvs. personale într-o singură repo.

Imaginați-vă dacă submodulele au fost tratate exact ca directoare obișnuite : trebuie doar să solicitați un arbore SHA, iar un mecanism de tip DNS vă rezolvă solicitarea , caută mai întâi pe local ~/.git , apoi mai întâi către servere mai apropiate (oglinda / cache-ul întreprinderii dvs.) și se termină pe GitHub.

Răspuns

Încercați acest lucru:

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

Comentarii

  • Aceasta este cel mai simplu mod. Nu descarcă toată repo. Rețineți că trebuie să adăugăm /trunk și să eliminăm /tree/master. Mai multe aici
  • Mulțumesc! Vreau doar să clonez un folder al repo-ului și nu toate folderele dintr-un repo. Și acesta chiar funcționează pentru mine.

Răspuns

soluție de lucru:

tu trebuie să opriți compresia:

git config --global core.compression 0 

atunci trebuie să utilizați o clonă superficială

git clone --depth=1 <url> 

atunci cel mai important pas este să cd în proiectul dvs. clonat

cd <shallow cloned project dir> 

acum deschideți clona, pas cu pas

git fetch --depth=N, with increasing N 

de ex.

git fetch --depth=4 

apoi,

git fetch --depth=100 

apoi,

git fetch --depth=500 

puteți alege câți pași doriți înlocuind acest N,

și în cele din urmă descărcați toate versiunile rămase folosind,

git fetch --unshallow 

susțineți dacă vă ajută 🙂

Răspundeți

Am reușit să funcționez în cele din urmă datorită celor de mai sus. Editam direct fișierul, obținând erori incluzând accidental ghilimele. Fișierul dvs. .git / info / sparse-checkout ar trebui să includă doar directorul, fără ghilimele. Iată un exemplu: acest proiect gigantic: https://github.com/SharePoint/sp-dev-fx-webparts , doream doar react-script-editor în director de mostre. https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / react-script-editor

Am urmat instrucțiunile de mai sus și am început să funcționeze când fișierul meu .git / info / sparse-checkout avea doar acest lucru în el

samples / react-script-editor

Răspunde

Aceasta va clona un anumit folder și va elimina tot istoricul care nu are legătură cu acesta.

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 

Comentarii

  • Aceasta va clona tot istoricul (--depth=1 pentru a evita) și toate celelalte directoare (??? pentru a evita?).

Răspuns

Pentru GitHub repos, puteți clona orice sub -directoarele oricărui depozit GitHub (la orice referință) folosind https://github.com/HR/github-clone

Comentarii

  • Din păcate, acest lucru nu este potrivit pentru scenariile Dockerfile, deoarece ar transporta întregul Python ca o dependență doar pentru a-l utiliza o dată în timpul construirii imaginii.

Răspuns

Voi răspunde cu restricții specifice cu care m-am confruntat.

  • În VSO, SSH a fost dezactivat de securitate, deci nu a putut folosi arhiva git. Doar PAT / CredentialProvider a fost acceptat.
  • Sucursala noastră avea un cod enorm, deci git clonează ar dura în sine 15 minute, cel puțin.

Iată ce am făcut:

  1. Proces manual manual unic: în VSO UI, creați un nou ramură la distanță spune „emptyBranch” care are zero fișiere (toate sunt șterse).
  2. git clone --depth=1 --single-branch --branch emptyBranch <remote> (destul de rapid)
  3. git checkout <branchToSyncTo> <directoryToSyncTo> (verifică numai dosarul specific)

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *