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
- stackoverflow.com/a/13738951/2072269
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 tillcore.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:
-
--filter=blob:none
hoppar över alla blobbar, men hämtar ändå alla trädobjekt -
--filter=tree:0
hoppar över de onödiga träden: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
innebär redan--single-branch
, se även: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
krävs för att övervinnagit clone
protokollshenanigans: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
--filter=combine:FILTER1+FILTER2
är syntaxen för att använda flera filter vid en gång, försöker skicka--filter
av någon anledning misslyckas med: ” flera filterspecifikationer kan inte kombineras ”. Detta lades till i Git 2.24 på e987df5fe62b8b29be4cdcdeb3704681ada2b29e ” list-objects-filter: implementera kompositfilter ”Redigera: på Git 2.28 ser jag experimentellt att
--filter=FILTER1 --filter FILTER2
också har samma effekt, eftersom GitHub inte implementerarcombine:
än från och med 2020-09- 18 och klagarfatal: invalid filter-spec "combine:blob:none+tree:0"
. TODO infördes i vilken version?
Formatet för --filter
är dokumenterat på man git-rev-list
.
Dokument på Git-träd:
- 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
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
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:
- Engångs manuell process: i VSO UI, skapa en ny fjärrgren säger ”tomBranch” som har noll filer (alla raderas).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(ganska snabbt) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(checkar ut endast specifik mapp)