Jeg fandt en samling af slackbuilds, nogle jeg har brug for er på GitHub. https://github.com/PhantomX/slackbuilds/ Jeg vil ikke få al git.
git clone https://github.com/PhantomX/slackbuilds.git
Men kun få en slackbuild, for denne .
Hvordan gør man det? Er det muligt?
Kommentarer
- stackoverflow.com/a/13738951/2072269
Svar
Du ender med at downloade hele historikken, så jeg kan ikke se meget fordel i den, men du kan kasse specifikke dele ved hjælp af en “sparsom” kasse. Citering af dette Stack Overflow-indlæg :
Trin til at gøre en sparsom klon er som følger:
mkdir <repo> cd <repo> git init git remote add -f origin <url>
Dette opretter et tomt lager med din fjernbetjening og henter alle objekter, men tjekker dem ikke ud. Derefter gør:
git config core.sparseCheckout true
Nu skal du definere, hvilke filer / mapper du faktisk vil tjekke ud. Dette gøres ved at angive dem i
.git/info/sparse-checkout
, fx:echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
Sidst men ikke mindst, opdater din tomme repo med tilstanden fra fjernbetjeningen:
git pull origin master
Du vil muligvis se på udvidet tutorial , og du bør sandsynligvis læse den officielle dokumentation til sparsom betaling .
Det kan være bedre at bruge en lav klon også. I stedet for git pull
kommando givet tidligere, prøv:
git pull --depth=1 origin master
Kommentarer
- Jeg får
error: Sparse checkout leaves no entry on working directory
efter at have lavet en git pull efter ændringen tilcore.sparseCheckout
og.git/info/sparse-checkout
- Rettelse:
git init; git remote ...
bare opsæt ting, intet downloades. Hele pointen med sparsom er at få kun objekter, du er interesseret i. - @vonbrand at ‘ er hvad
-f
option er til: ” Med -f option, git hent < navn > køres straks efter fjernoplysninger er konfigureret. ” - Efter
git remote add -f origin <url>
git downloader stadig hele repo . I mit tilfælde vil jeg ikke ‘ ikke bruge tid på at vente på det, selvom det ikke ‘ ikke kaster hele repoen. - I sparsom checkout definerer vi, hvad vi vil tjekke ud, men er der en måde at udelukke et par mapper og tjekke resten ud?
Svar
git clone --filter
fra git 2.19 fungerer nu på GitHub (testet 2020-09 -18, git 2.25.1)
Denne mulighed blev tilføjet sammen med en opdatering til fjernprotokollen, og det forhindrer virkelig genstande i at blive downloadet fra server.
F.eks. for kun at klone objekter, der kræves til d1
i dette lager: https://github.com/cirosantilli/test-git-partial-clone Jeg kan gøre:
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
Klonkommandoen opnås kun:
- et enkelt begå objekt med spidsen af
master
gren - alle 4 træobjekter i arkivet:
- toplevel-mappe over commit
- de tre mapper
d1
,d2
,master
Derefter henter kommandoen checkout
kun de manglende klodser (filer) fra serveren:
-
d1/a
-
d1/b
Endnu bedre, senere vil GitHub sandsynligvis begynde at støtte:
--filter=blob:none \ --filter=tree:0 \
hvor --filter=tree:0
fra Git 2.20 forhindrer unødvendig clone
hentning af alle træobjekter, og lad det udsættes til checkout
. Men på min 2020-09-18 test, der mislykkes med:
fatal: invalid filter-spec "combine:blob:none+tree:0"
formodentlig fordi --filter=combine:
kompositfilter ( tilføjet i Git 2.24, underforstået af flere --filter
) er endnu ikke implementeret.
Jeg observerede, hvilke objekter der blev hentet med:
git verify-pack -v .git/objects/pack/*.pack
som nævnt på: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Det giver mig ikke en super klar indikation af, hvad hvert objekt er nøjagtigt, men det siger typen af hvert objekt (commit
, tree
, blob
), og da der er så få objekter i den minimale repo, kan jeg utvetydigt udlede, hvad hver objekt er.
git rev-list --objects --all
producerede tydeligere output med stier til træ / klodser, men det henter desværre nogle objekter, når jeg kører det, hvilket gør det svært at bestemme hvad blev hentet hvornår, så lad mig det vide, hvis nogen har en bedre kommando.
TODO find GitHub annoncerede det ordsprog, da de begyndte at støtte det. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ fra 2020-01-17 nævner allerede --filter blob:none
.
git sparse-checkout
I tror, at denne kommando er beregnet til at styre en indstillingsfil, der siger ” Jeg er kun interesseret i disse undertræer “, så fremtidige kommandoer kun påvirker dem undertræer. Men det er lidt svært at være sikker på, fordi den aktuelle dokumentation er lidt … sparsom 😉
Det forhindrer ikke i sig selv, at der hentes klatter.
Hvis denne forståelse er korrekt, ville dette være et godt supplement til git clone --filter
beskrevet ovenfor, da det ville forhindre utilsigtet hentning af flere objekter, hvis du agter at udføre git-operationer i den delvis klonede repo .
Da jeg prøvede 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
fungerede det ikke, fordi init
hentede faktisk alle objekter.
I Git 2.28 hentede det imidlertid ikke objekterne som ønsket. Men hvis jeg gør det:
git sparse-checkout set d1
d1
bliver ikke hentet og tjekket ud, selvom dette udtrykkeligt siger det skal: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-partial-clones Med ansvarsfraskrivelse:
Hold øje med, at den delvise klonfunktion bliver almindelig tilgængelig [1].
[1]: GitHub evaluerer stadig denne funktion internt, mens den er aktiveret på nogle få udvalgte arkiver (inklusive eksemplet brugt i dette indlæg). Når funktionen stabiliseres og modnes, holder vi dig opdateret med dens fremskridt.
Så ja, det er bare for svært at være sikker på øjeblikket, delvis takket være glæden ved at GitHub er lukket kilde. Men lad os holde øje med det.
Opdeling af kommando
Serveren skal konfigureres med:
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
Opdeling af kommando:
-
--filter=blob:none
springer alle klatter over, men henter stadig alle træobjekter -
--filter=tree:0
springer de unødvendige træer over: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
indebærer allerede--single-branch
, se også: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
kræves for at overvindegit clone
protokol shenanigans: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
--filter=combine:FILTER1+FILTER2
er syntaksen for at bruge flere filtre ved en gang forsøger at sende--filter
af en eller anden grund mislykkes med: ” flere filterspecifikationer kan ikke kombineres “. Dette blev tilføjet i Git 2.24 på e987df5fe62b8b29be4cdcdeb3704681ada2b29e ” list-objects-filter: implementer sammensatte filtre ”Rediger: på Git 2.28 ser jeg eksperimentelt, at
--filter=FILTER1 --filter FILTER2
også har den samme effekt, da GitHub ikke implementerercombine:
endnu fra 2020-09- 18 og klagerfatal: invalid filter-spec "combine:blob:none+tree:0"
. TODO introduceret i hvilken version?
Formatet for --filter
er dokumenteret på man git-rev-list
.
Dokumenter på Git-træet:
- 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
Test det lokalt
Følgende script genererer reproducerbart https://github.com/cirosantilli/test-git-partial-clone lager lokalt, laver en lokal klon og observerer, hvad der blev klonet:
#!/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
Output 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
Konklusioner: alle klatter udefra d1/
mangler. For eksempel.0975df9b39e23c15f63db194df7f45c76528bccb
, hvilket er d2/b
er ikke der efter at have tjekket d1/a
.
Bemærk at root/root
og mybranch/mybranch
også mangler, men --depth 1
skjuler det fra listen over manglende filer. Hvis du fjerner --depth 1
, vises de på listen over manglende filer.
Jeg har en drøm
Denne funktion kan revolutionere Git.
Forestil dig at have hele virksomhedens kodebase i en enkelt repo uden grimme tredjepartsværktøjer som repo
.
Forestil dig lagring af store klatter direkte i repoen uden nogen grimme tredjepartsudvidelser .
Forestil dig, om GitHub tillader pr. fil / katalog-metadata som stjerner og tilladelser, så du kan gemme alle dine personlige ting under en enkelt repo.
Forestil dig, hvis undermoduler blev behandlet nøjagtigt som almindelige mapper : bed bare om et træ SHA, og en DNS-lignende mekanisme løser din anmodning , kig først på dit lokale ~/.git
, derefter først til tættere servere (din virksomheds spejl / cache) og ender på GitHub.
Svar
Prøv dette:
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
Kommentarer
- Dette er den enkleste måde. Det downloader ikke al repo. Bemærk, at vi skal tilføje
/trunk
og fjerne/tree/master
. Mere her - Tak! Jeg vil bare klone en mappe med repoen og ikke alle mapperne i en repo. Og denne fungerer virkelig for mig.
Svar
arbejdsløsning:
dig har brug for at deaktivere komprimering:
git config --global core.compression 0
så skal du bruge lav klon
git clone --depth=1 <url>
så er det vigtigste trin at cd ind i dit klonede projekt
cd <shallow cloned project dir>
åbner nu klonen trin for trin
git fetch --depth=N, with increasing N
f.eks.
git fetch --depth=4
derefter,
git fetch --depth=100
derefter
git fetch --depth=500
kan du vælge, hvor mange trin du vil have ved at erstatte dette N,
og endelig downloade alle de resterende revisioner ved hjælp af
git fetch --unshallow
upvote, hvis det hjælper dig 🙂
Svar
Jeg fik dette til sidst til at fungere takket være ovenstående. Jeg redigerede filen direkte og fik fejl ved ved et uheld at inkludere citaterne. Din .git / info / sparse-checkout-fil skal kun indeholde biblioteket, ingen citater. Her er et eksempel: Dette gigantiske projekt: https://github.com/SharePoint/sp-dev-fx-webparts , jeg ville bare have react-script-editoren i eksempler på katalog. https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / react-script-editor
Jeg fulgte instruktionerne ovenfor og fik det til at fungere, da min .git / info / sparse-checkout-fil netop havde dette i sig
samples / react-script-editor
Svar
Dette vil klone en bestemt mappe og fjerne al historik, der ikke er relateret til 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
- Dette vil stadig klone al historik (
--depth=1
for at undgå) og alle andre mapper (???
for at undgå?).
Svar
For GitHub repos kan du klone enhver sub -mapper til ethvert GitHub-arkiv (ved enhver reference) ved hjælp af https://github.com/HR/github-clone
Kommentarer
- Desværre er dette uegnet til Dockerfile-scenarier, da det ville trække hele Python ind som en afhængighed bare for at bruge det en gang under billedopbygningen.
Svar
Jeg svarer med specifikke begrænsninger, jeg står over for.
- I VSO blev SSH deaktiveret af sikkerhed, så vi kunne ikke bruge git-arkiv. Kun PAT / CredentialProvider blev understøttet.
- Vores filial havde enorm kode, så git klon i sig selv ville tage mindst 15 minutter.
Her er hvad jeg gjorde:
- Engangs manuel proces: i VSO UI skal du oprette en ny fjerntliggende gren siger “emptyBranch”, som har nul filer (alle slettes).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(temmelig hurtig) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(tjekker kun specifik mappe ud)