Našel jsem kolekci slackbuildů, některé na GitHubu potřebuji. https://github.com/PhantomX/slackbuilds/ Nechci dostat všechny git.
git clone https://github.com/PhantomX/slackbuilds.git
Ale získejte pouze slackbuild, pro tento .
Jak na to? Je to možné?
Komentáře
- stackoverflow.com/a/13738951/2072269
Odpověď
Nakonec si stáhnete celou historii, takže v tom nevidím velkou výhodu, ale vy může zaplatit konkrétní součásti pomocí „řídké“ pokladny. Cituji tento příspěvek o přetečení zásobníku :
Kroky k provedení řídkého klon jsou následující:
mkdir <repo> cd <repo> git init git remote add -f origin <url>
Tím se na dálkovém ovladači vytvoří prázdné úložiště a načte se všechny objekty, ale nezkontroluje je. Pak do:
git config core.sparseCheckout true
Nyní musíte definovat, které soubory / složky chcete skutečně zkontrolovat. To se provádí jejich uvedením v seznamu
.git/info/sparse-checkout
, např .:echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
V neposlední řadě aktualizujte své prázdné úložiště stavem na dálkovém ovladači:
git pull origin master
Možná se budete chtít podívat na rozšířený výukový program a pravděpodobně byste si měli přečíst oficiální dokumentaci pro řídké pokladny .
Možná by vám bylo lépe použít mělký klon . Místo git pull
dříve zadaný příkaz, zkuste:
git pull --depth=1 origin master
Komentáře
- Dostávám
error: Sparse checkout leaves no entry on working directory
po provedení git pull po provedení úprav nacore.sparseCheckout
a.git/info/sparse-checkout
- Oprava:
git init; git remote ...
stačí nastavit věci, nic se nestáhne. Smysl spočívá v tom, abyste získali pouze objekty, které vás zajímají. - @vonbrand, které ‚ jsou tím, čím Možnost div> je pro: “ S volbou -f git fetch < name > se spustí ihned po nastavení vzdálených informací. “
- Po
git remote add -f origin <url>
git stále stahuje celé repo . V mém případě nechci ‚ trávit čas čekáním na to, i když to ‚ nezkontroluje celé repo. - V řídké pokladně definujeme, co chceme zkontrolovat, ale existuje způsob, jak vyloučit několik adresářů a zkontrolovat zbytek?
Odpovědět
git clone --filter
z git 2.19 nyní funguje na GitHubu (testováno 2020-09 -18, git 2.25.1)
Tato možnost byla přidána spolu s aktualizací vzdáleného protokolu a skutečně brání stahování objektů z server.
Například klonovat pouze objekty požadované pro d1
tohoto úložiště: https://github.com/cirosantilli/test-git-partial-clone Umím:
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
Příkaz klon získá pouze:
- jeden objekt potvrzení se špičkou
master
větve - všechny 4 stromové objekty úložiště:
- toplevel adresář odevzdat
- tři adresáře
d1
,d2
,master
Potom příkaz checkout
načte pouze chybějící objekty blob (soubory) ze serveru:
-
d1/a
-
d1/b
Ještě lépe, později GitHub pravděpodobně začne podporovat:
--filter=blob:none \ --filter=tree:0 \
kde --filter=tree:0
z Git 2.20 zabrání zbytečné clone
načtení všech stromových objektů a umožnění jeho odložení na checkout
. Ale na mém testu 2020-09-18, který selhal s:
fatal: invalid filter-spec "combine:blob:none+tree:0"
pravděpodobně proto, že --filter=combine:
složený filtr ( přidáno v Git 2.24, implikované více --filter
) ještě není implementováno.
Pozoroval jsem, které objekty byly načteny:
git verify-pack -v .git/objects/pack/*.pack
jak je uvedeno na: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Nedává mi úplně jasnou představu o tom, co který objekt přesně je, ale říká typ každého objektu (commit
, tree
, blob
), a protože v tomto minimálním repo je tolik objektů, mohu jednoznačně odvodit, co každý z nich objekt je.
git rev-list --objects --all
produkoval jasnější výstup s cestami pro strom / objekty blob, ale bohužel načte některé objekty, když je spustím, což ztěžuje určení co bylo načteno, kdy, dejte mi vědět, jestli má někdo lepší příkaz.
TODO najdete oznámení GitHubu, které říká, když to začalo podporovat. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ od 2020-01-17 již zmiňuje --filter blob:none
.
git sparse-checkout
I myslím, že tento příkaz je určen ke správě souboru nastavení, který říká “ Záleží mi jen na těchto podstromech „, aby budoucí příkazy ovlivnily pouze ty podstromy. Ale je trochu jisté, protože aktuální dokumentace je trochu … řídká 😉
Sama o sobě nezabrání načítání objektů BLOB.
Pokud je toto porozumění správné, pak by to byl dobrý doplněk k git clone --filter
popsaným výše, protože by to zabránilo neúmyslnému načítání více objektů, pokud máte v úmyslu provádět operace git v částečném klonovaném repo .
Když jsem zkoušel 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
nefungoval, protože init
ve skutečnosti načetl všechny objekty.
V Git 2.28 však nenačetl objekty podle potřeby. Ale pokud to udělám:
git sparse-checkout set d1
d1
se nenačte a neodhlásí, i když to výslovně říká should: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-partial-clones S vyloučením odpovědnosti:
Dávejte pozor na to, aby byla funkce částečného klonu obecně dostupná [1].
[1]: GitHub tuto funkci stále interně vyhodnocuje, i když je povolena na několika vybraných úložištích (včetně příkladu použitého v tomto příspěvku). Jak se funkce stabilizuje a dospívá, budeme vás průběžně informovat o jejím průběhu.
Takže jo, je to prostě příliš těžké na to, abyste si byli jisti moment, částečně díky tomu, že radosti GitHubu jsou uzavřeným zdrojem. Ale dávejme na to pozor.
Rozdělení příkazů
Server by měl být konfigurován pomocí:
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
Rozdělení příkazů:
-
--filter=blob:none
přeskočí všechny objekty blob, ale přesto načte všechny objekty stromu -
--filter=tree:0
přeskakuje nepotřebné stromy: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
již implikuje--single-branch
, viz také: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
je nutné překonatgit clone
shenanigans protokolu: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
--filter=combine:FILTER1+FILTER2
je syntaxe pro použití více filtrů na jednou pokus o předání--filter
z nějakého důvodu selže s: “ nelze kombinovat více specifikací filtru „. Toto bylo přidáno v Gitu 2.24 na e987df5fe62b8b29be4cdcdeb3704681ada2b29e “ list-objects-filter: implementujte složené filtry “Upravit: na Git 2.28 experimentálně vidím, že
--filter=FILTER1 --filter FILTER2
má také stejný účinek, protože GitHub neimplementujecombine:
ještě od 2020-09- 18 a stěžuje sifatal: invalid filter-spec "combine:blob:none+tree:0"
. TODO představeno ve které verzi?
Formát --filter
je dokumentován na man git-rev-list
.
Dokumenty ve stromu Git:
- 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
Vyzkoušejte to místně
Následující skript reprodukovatelně generuje https://github.com/cirosantilli/test-git-partial-clone úložiště lokálně, provádí místní klon a sleduje, co bylo klonováno:
#!/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
Výstup v 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
Závěry: všechny objekty BLOB mimo d1/
chybí. Např.0975df9b39e23c15f63db194df7f45c76528bccb
, což je d2/b
tam není po kontrole d1/a
.
Upozorňujeme, že také chybí root/root
a mybranch/mybranch
, ale --depth 1
to skrývá před seznam chybějících souborů. Pokud odeberete --depth 1
, zobrazí se v seznamu chybějících souborů.
Mám sen
Tato funkce by mohla způsobit revoluci v Gitu.
Představte si, že máte veškerý kódový základ svého podniku v jednom repo bez ošklivých nástrojů třetích stran, jako je repo
.
Představte si ukládání obrovských blobů přímo v repo bez jakýchkoli ošklivých rozšíření třetích stran .
Představte si, jestli by GitHub umožňoval na metadata souboru / adresáře , jako jsou hvězdičky a oprávnění, takže můžete ukládat všechny své osobní věci do jednoho repo.
Představte si, že S podmoduly bylo zacházeno přesně jako s běžnými adresáři : stačí požádat o strom SHA a mechanismus podobný DNS vyřeší váš požadavek , nejprve se podívejte na své místní ~/.git
, poté nejprve přiblížte servery (zrcadlo / mezipaměť vašeho podniku) a skončíte na GitHubu.
Odpovědět
Zkuste toto:
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
Komentáře
- Toto je nejjednodušší způsob. Nestáhne všechna repo. Upozorňujeme, že musíme přidat
/trunk
a odebrat/tree/master
. Více zde - děkujeme! Chci jen naklonovat složku repo a ne všechny složky v repo. A tohle pro mě opravdu funguje.
Odpověď
pracovní řešení:
vy musíte vypnout kompresi:
git config --global core.compression 0
pak musíte použít mělký klon
git clone --depth=1 <url>
nejdůležitějším krokem je tedy cd do vašeho klonovaného projektu
cd <shallow cloned project dir>
nyní klon postupně otevřete
git fetch --depth=N, with increasing N
např.
git fetch --depth=4
poté
git fetch --depth=100
poté
git fetch --depth=500
můžete zvolit počet kroků, které nahradíte tímto N,
a nakonec stáhnout všechny zbývající revize pomocí
git fetch --unshallow
hlasujte, pokud vám to pomůže 🙂
Odpovědět
Díky výše uvedenému jsem konečně začal pracovat. Upravoval jsem soubor přímo a omylem jsem dostal chyby včetně uvozovek. Váš soubor .git / info / sparse-checkout by měl obsahovat pouze adresář, žádné uvozovky. Zde je příklad: Tento gigantický projekt: https://github.com/SharePoint/sp-dev-fx-webparts , chtěl jsem jen editor reaktivních skriptů v adresář vzorků. https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / react-script-editor
Postupoval jsem podle výše uvedených pokynů a fungoval, když můj soubor .git / info / sparse-checkout obsahoval právě toto
sample / react-script-editor
Odpovědět
Tímto způsobem naklonujete konkrétní složku a odstraníte veškerou historii, která s ní nesouvisí.
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
Komentáře
- Tím se stále klonuje veškerá historie (
--depth=1
) a všechny ostatní adresáře ( vyhnout se?).
Odpovědět
U repozitářů GitHub můžete klonovat jakýkoli sub -adresáře jakéhokoli úložiště GitHub (při jakékoli referenci) pomocí https://github.com/HR/github-clone
komentářů
- Je smutné, že je to pro scénáře Dockerfile nevhodné, protože by to vytáhlo celý Python jako závislost, jen aby ho bylo možné použít jednou během vytváření obrazu.
Odpověď
Odpovím se specifickými omezeními, kterým jsem čelil.
- Ve VSO bylo zabezpečení SSH zakázáno, takže nemohl použít archiv git. Byl podporován pouze PAT / CredentialProvider.
- Naše pobočka měla enormní kód, takže git clone by samo o sobě trvalo minimálně 15 minut.
Zde je to, co jsem udělal:
- Jednorázový ruční proces: ve uživatelském rozhraní VSO vytvořte nový vzdálená větev řekne „emptyBranch“, která má nulové soubory (všechny jsou smazány).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(docela rychle) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(odhlásí pouze konkrétní složku)