Jag hittade en samling slackbuilds, några jag behöver finns på GitHub. https://github.com/PhantomX/slackbuilds/ Jag vill inte få all git.

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

Men få bara en slackbuild, för den här .

Hur gör man det? Är det möjligt?

Kommentarer

Svar

Du kommer att ladda ner hela historiken, så jag ser inte mycket nytta med den, men du kan checka ut specifika delar med hjälp av en ”gles” kassa. Citera detta Stack Overflow-inlägg :

Stegen för att göra en gles klon är som följer:

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

Detta skapar ett tomt arkiv med din fjärrkontroll och hämtar alla objekt men checkar inte ut dem. gör:

git config core.sparseCheckout true 

Nu måste du definiera vilka filer / mappar du faktiskt vill kolla in. Detta görs genom att lista dem i .git/info/sparse-checkout, t.ex.:

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

Sist men inte minst, uppdatera din tomma repo med tillståndet från fjärrkontrollen:

git pull origin master 

Du kanske vill titta på utökad handledning och du bör nog läsa den officiella -dokumentationen för sparsam kassa .

Det kan vara bättre att du använder en grund klon också. I stället för git pull kommandot som ges tidigare, försök:

git pull --depth=1 origin master 

Kommentarer

  • Jag får error: Sparse checkout leaves no entry on working directory efter att ha gjort en git-pull efter ändringen till core.sparseCheckout och .git/info/sparse-checkout
  • Korrigering: git init; git remote ... bara ställa in saker, inget laddas ner. Hela poängen med glesa är att bara få objekt du är intresserad av.
  • @vonbrand att ’ är vad -f alternativet är för: ” Med -f-alternativet, git hämta < namn > körs omedelbart efter att fjärrinformationen har ställts in. ”
  • Efter att git remote add -f origin <url> hämtar git fortfarande hela repo . I mitt fall vill jag inte ’ inte spendera tid på att vänta på det, även om det inte ’ t checkar ut hela repo.
  • I den glesa kassan definierar vi vad vi vill kolla in men finns det ett sätt att utesluta några kataloger och kolla in resten?

Svar

git clone --filter från git 2.19 fungerar nu på GitHub (testad 2020-09 -18, git 2.25.1)

Detta alternativ har lagts till tillsammans med en uppdatering av fjärrprotokollet och förhindrar verkligen att objekt laddas ner från server.

Till exempel, för att bara klona objekt som krävs för d1 i detta arkiv: https://github.com/cirosantilli/test-git-partial-clone Jag kan göra:

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 

Klonkommandot får endast:

  • ett enda begå objekt med spetsen på master gren
  • alla 4 trädobjekt i förvaret:
    • toplevel directory of commit
    • de tre katalogerna d1, d2, master

Då hämtar kommandot checkout bara de saknade blobbarna (filerna) från servern:

  • d1/a
  • d1/b

Ännu bättre, senare GitHub kommer sannolikt att börja stödja:

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

där --filter=tree:0 från Git 2.20 förhindrar onödigt clone hämtning av alla trädobjekt och låt det skjutas upp till checkout. Men på mitt 2020-09-18 test som misslyckas med:

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

förmodligen på grund av att --filter=combine: kompositfiltret ( läggs till i Git 2.24, underförstått av flera --filter) är ännu inte implementerat.

Jag observerade vilka objekt som hämtades med:

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

som nämnts på: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Det ger mig inte en mycket tydlig indikation på vad varje objekt är exakt, men det säger typen av varje objekt (commit, tree, blob), och eftersom det finns så få objekt i den minimala repo, kan jag otvetydigt härleda vad var och en objektet är.

git rev-list --objects --all producerade tydligare utdata med sökvägar för träd / blobbar, men det hämtar tyvärr vissa objekt när jag kör det, vilket gör det svårt att bestämma vad hämtades när, låt mig veta om någon har ett bättre kommando.

TODO hitta GitHub meddelande att säga när de började stödja det. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ från 2020-01-17 nämner --filter blob:none.

git sparse-checkout

I tror att det här kommandot är tänkt att hantera en inställningsfil som säger ” Jag bryr mig bara om dessa underträd ” så att kommande kommandon bara påverkar dem underträd. Men det är lite svårt att vara säker eftersom den aktuella dokumentationen är lite … gles 😉

Det förhindrar inte i sig att blob hämtas.

Om denna förståelse är korrekt skulle detta vara ett bra komplement till git clone --filter som beskrivs ovan, eftersom det skulle förhindra oavsiktlig hämtning av fler objekt om du tänker göra git-operationer i den partiella klonade repo .

När jag försökte 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 

fungerade det inte eftersom init hämtade faktiskt alla objekt.

Men i Git 2.28 hämtade det inte objekten som önskat. Men om jag gör det:

git sparse-checkout set d1 

d1 hämtas inte och checkas ut, även om detta uttryckligen säger det ska: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # gles-checkout-and-partial-clones Med ansvarsfriskrivning:

Håll utkik efter att den delvisa klonfunktionen blir allmänt tillgänglig [1].

[1]: GitHub utvärderar fortfarande den här funktionen internt medan den är aktiverad på några utvalda arkiv (inklusive exemplet som används i det här inlägget). När funktionen stabiliseras och mognar håller vi dig uppdaterad med dess framsteg.

Så ja, det är bara för svårt att vara säker på ögonblick, delvis tack vare glädjen att GitHub är sluten källa. Men låt oss hålla ett öga på det.

Uppdelning av kommando

Servern ska konfigureras med:

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

Kommandouppdelning:

Formatet för --filter är dokumenterat på man git-rev-list.

Dokument på Git-träd:

Testa det lokalt

Följande skript genererar reproducerbart https://github.com/cirosantilli/test-git-partial-clone förvar lokalt, gör en lokal klon och observerar vad som klonades:

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

Utdata i 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 

Slutsatser: alla blobs från utsidan av d1/ saknas. T.ex.0975df9b39e23c15f63db194df7f45c76528bccb, vilket är d2/b finns inte efter att ha checkat ut d1/a.

Observera att root/root och mybranch/mybranch saknas också, men --depth 1 döljer det från listan över saknade filer. Om du tar bort --depth 1 visas de på listan över saknade filer.

Jag har en dröm

Denna funktion kan revolutionera Git.

Föreställ dig att ha hela företagets kodbas i en enda repo utan fula verktyg från tredje part som repo .

Föreställ dig lagra stora blobbar direkt i repo utan några fula tillägg från tredje part .

Tänk om GitHub tillåter per fil / katalogmetadata som stjärnor och behörigheter, så att du kan lagra alla dina personliga saker under en enda repo.

Tänk dig om undermoduler behandlades precis som vanliga kataloger : begär bara ett träd SHA, och en DNS-liknande mekanism löser din begäran , först titta på ditt lokala ~/.git , sedan först närmare servrar (ditt företags spegel / cache) och hamnar på GitHub.

Svar

Prova det här:

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

Kommentarer

  • Detta är det enklaste sättet. Det laddar inte ner alla repo. Observera att vi måste lägga till /trunk och ta bort /tree/master. Mer här
  • Tack! Jag vill bara klona en mapp med repo och inte alla mappar i en repo. Och den här fungerar verkligen för mig.

Svar

arbetslösning:

du måste stänga av komprimeringen:

git config --global core.compression 0 

då måste du använda grunt klon

git clone --depth=1 <url> 

då är det viktigaste steget att cd till ditt klonade projekt

cd <shallow cloned project dir> 

nu öppnar du klonen, steg för steg

git fetch --depth=N, with increasing N 

t.ex.

git fetch --depth=4 

sedan,

git fetch --depth=100 

sedan,

git fetch --depth=500 

du kan välja hur många steg du vill genom att ersätta detta N,

och slutligen ladda ner alla återstående versioner använder,

git fetch --unshallow 

upvote om det hjälper dig 🙂

Svar

Jag fick det här äntligen tack vare ovanstående. Jag redigerade filen direkt och fick fel genom att av misstag inkludera offerten. Din .git / info / gles-kassa-fil ska bara innehålla katalogen, inga citat. Här är ett exempel: Detta gigantiska projekt: https://github.com/SharePoint/sp-dev-fx-webparts , jag ville bara ha redigeringsskriptredigeraren i exempelkatalog. https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / react-script-editor

Jag följde anvisningarna ovan och fick det att fungera när min .git / info / sparse-checkout-fil hade just detta

samples / react-script-editor

Svar

Detta kommer att klona en specifik mapp och ta bort all historik som inte är relaterad till den.

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 

Kommentarer

  • Detta kommer fortfarande att klona all historik (--depth=1 för att undvika) och alla andra kataloger (??? för att undvika?).

Svar

För GitHub repos kan du klona valfri sub -kataloger för vilket GitHub-arkiv som helst (vid vilken referens som helst) som använder https://github.com/HR/github-clone

Kommentarer

  • Tyvärr är detta olämpligt för Dockerfile-scenarier eftersom det skulle ta hela Python som ett beroende bara för att använda det en gång under bildbyggnaden.

Svar

Jag svarar med specifika begränsningar jag mötte.

  • I VSO inaktiverades SSH av säkerhet, så det gick inte att använda git-arkiv. Endast PAT / CredentialProvider stöddes.
  • Vår filial hade enorm kod, så git-klon skulle själv ta minst 15 minuter.

Här är vad jag gjorde:

  1. Engångs manuell process: i VSO UI, skapa en ny fjärrgren säger ”tomBranch” som har noll filer (alla raderas).
  2. git clone --depth=1 --single-branch --branch emptyBranch <remote> (ganska snabbt)
  3. git checkout <branchToSyncTo> <directoryToSyncTo> (checkar ut endast specifik mapp)

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *