Pochopenie plytkého klonu Git a hĺbky klonu
Git je systém riadenia distribuovanej verzie. To je jedna z výhod používania Gitu. Ak chcete pracovať lokálne, nemusíte byť závislí od centrálneho servera alebo úložiska. Všetko, čo potrebujete, pokiaľ ide o históriu vašich modulov, máte na dosah ruky. Môže sa však stať problémom, keď pracujete s úložiskami s veľkými binárnymi súbormi alebo úložiskami, ktoré majú dlhú históriu. Najmä ak sa nachádzate v situácii, keď si ho potrebujete stiahnuť vždy čerstvé, napríklad server so zostavením, potom sa veľkosť a časy sťahovania môžu stať problémom.
Riešením problému spoločnosti Git je plytký klon, kde môžete pomocou hĺbky klonu definovať, do akej hĺbky má váš klon ísť. Napríklad ak použijete -depth 1, potom počas klonovania dostane Git iba najnovšiu kópiu príslušných súborov. Môže vám to ušetriť veľa miesta a času.
Git plytký klon a veľkosť
Pozrime sa na populárne úložisko Git pre Django. Ak repo úplne naklonujete, získate nasledovné:
$ git klon https: // github.com / django / django.gitKlonovanie do 'django' ..
remote: Počítanie objektov: 409053, hotovo.
remote: Kompresia objektov: 100% (26/26), hotovo.
remote: Total 409053 (delta 6), reused 8 (delta 1), pack-reused 409026
Príjem predmetov: 100% (409053/409053), 167.77 MiB | 5.95 MiB / s, hotovo.
Riešenie delt: 100% (297045/297045), hotovo.
Prebieha kontrola pripojenia ... hotovo.
Odhlásenie súborov: 100% (5860/5860), hotovo.
Ak teraz skontrolujete veľkosť miestnej kópie, je to:
$ du -sh django /225 M django /
Poďme získať to isté úložisko Django s plytkým klonom:
$ git clone - hĺbka 1 https: // github.com / django / django.gitKlonovanie do 'django' ..
remote: Počítanie objektov: 8091, hotovo.
remote: Kompresia objektov: 100% (4995/4995), hotovo.
remote: Total 8091 (delta 2036), reused 5507 (delta 1833), pack-reused 0
Príjem predmetov: 100% (8091/8091), 8.82 MiB | 3.29 MiB / s, hotovo.
Riešenie delt: 100% (2036/2036), hotovo.
Prebieha kontrola pripojenia ... hotovo.
Odhlásenie súborov: 100% (5860/5860), hotovo.
Ak teraz skontrolujete veľkosť miestnej kópie, malo by to byť podstatne menej:
$ du -sh django /55M django /
Ak váš server pracuje so stovkami produktových radov, môže byť užitočný tento druh úspory miesta na pevnom disku. V prípade herných projektov, kde sú veľké binárne súbory, to môže mať dramatický efekt. Pomáha tiež pri dlhodobých projektoch. Napríklad celé klonovanie Linuxového úložiska z GitHubu je viac ako 7 GB, môžete ho však povrchne klonovať za menej ako 1 GB.
Git Plytký klon a história
Plytké klonovanie môžete lokálne skontrolovať vo svojom vlastnom úložisku. Vytvorme súbor v našom miestnom úložisku, urobme zmeny a 10-krát ho odovzdajme. A potom môžeme klonovať úložisko:
$ mkdir _príklad$ cd _príklad
$ ls
$ git init
Inicializované prázdne úložisko Git v / Users / zakh / git_repo / _example /.git /
$ echo x> veľký_súbor
$ git pridať -A
$ git commit -m "Počiatočné potvrdenie"
[master (root-commit) dd11686] Počiatočné potvrdenie
1 súbor zmenený, 1 vloženie (+)
vytvoriť režim 100644 large_file
$ echo xx> veľký_súbor
$ git pridať -A
$ git commit -m "Úprava veľkého súboru 1"
[master 9efa367] Úprava veľkého súboru 1
1 súbor zmenený, 1 vloženie (+), 1 odstránenie (-)
…
…
$ mkdir test
$ cd test
$ git klonovaný súbor: //// Users / zakh / git_repo / _example
Klonovanie do „_example“ ..
remote: Počítanie objektov: 33, hotovo.
remote: Kompresia objektov: 100% (22/22), hotovo.
remote: Total 33 (delta 10), reused 0 (delta 0)
Príjem predmetov: 100% (33/33), 50.03 MiB | 42.10 MiB / s, hotovo.
Riešenie delt: 100% (10/10), hotovo.
Prebieha kontrola pripojenia ... hotovo.
V tomto príklade sme vytvorili priečinok _example git v priečinku / Users / zakh / git_repo / s jedným veľkým súborom. Zobrazia sa iba prvé dva potvrdenia. Potom vytvárame úplný klon tohto úložiska na inom mieste.
Potom skontrolujme históriu našich záväzkov:
$ git log - online7fa451f Úprava veľkého súboru 10
648d8c9 Úprava veľkého súboru 9
772547a Úprava veľkého súboru 8
13dd9ab Úprava veľkého súboru 7
5e73b67 Úprava súboru large_file 6
030a6e7 Úprava súboru large_file 5
1d14922 Úprava súboru large_file 4
bc0f2c2 Úprava súboru large_file 3
2794f11 Úprava veľkého súboru 2
d4374fb Úprava veľkého súboru 1
924829d Počiatočné potvrdenie
Vidíme všetky záväzky v úplnom klone.
Teraz poďme odstrániť aktuálnu kópiu a potom plytký klon s hĺbkou 1:
Klonovanie do „_example“ ..
remote: Počítanie objektov: 3, hotovo.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Príjem predmetov: 100% (3/3), 50.02 MiB | 65.12 MiB / s, hotovo.
Prebieha kontrola pripojenia ... hotovo.
Ak sa teraz pozrieme na históriu, vidíme iba poslednú históriu potvrdenia:
$ git log - online7fa451f Úprava veľkého súboru 10
Poďme plytký klon s hĺbkou 3:
$ git clone - súbor hĺbky 3: //// Users / zakh / git_repo / _exampleKlonovanie do „_example“ ..
remote: Počítanie objektov: 9, hotovo.
remote: Kompresia objektov: 100% (6/6), hotovo.
remote: Total 9 (delta 2), reused 0 (delta 0)
Príjem predmetov: 100% (9/9), 50.02 MiB | 65.15 MiB / s, hotovo.
Riešenie delt: 100% (2/2), hotovo.
Prebieha kontrola pripojenia ... hotovo.
Teraz vidíme viac záväzkov:
$ git log - online7fa451f Úprava veľkého súboru 10
648d8c9 Úprava veľkého súboru 9
772547a Úprava veľkého súboru 8
Problémy s plytkým klonom Git
Používatelia by mali pochopiť, že veľkosť a čas potrebný na stiahnutie závisí od organizácie záväzkov. Môžu sa výrazne líšiť od jedného úložiska k druhému. Je dobré otestovať úložisko s plytkým klonom, aby ste zistili, koľko miesta na pevnom disku a čas sťahovania vám ušetrí.
Ďalším aspektom je, že aj keď môžete tlačiť kód z plytkého klonu, môže to trvať dlhšie kvôli výpočtom medzi vzdialeným a lokálnym serverom. Pokiaľ teda pravidelne zadávate kód z miestnej kópie, malo by pravdepodobne zmysel použiť celý klon.
Možnosť viacerých pobočiek
Keď použijete príznak -depth s príkazom clone, Git predvolene použije príznak -single-branch. Môžete však použiť príznak -no-jednu vetvu, aby ste povedali Gitu, aby získal históriu zo zadanej hĺbky každej vetvy.
Tu sú vetvy Django bez možnosti -no-single-branch (hĺbka 1):
$ git pobočka -a* pán
diaľkové ovládače / pôvod / HLAVA -> pôvod / majster
diaľkové ovládače / pôvod / majster
Prítomná je iba hlavná pobočka.
Tu sú pobočky Django po použití možnosti -no-single-branch:
$ git clone --depth 1 --no-single-branch https: // github.com / django / django.gitKlonovanie do 'django' ..
remote: Počítanie objektov: 95072, hotovo.
remote: Compressing objects: 100% (42524/42524), done.
remote: Total 95072 (delta 52343), reused 82284 (delta 42389), pack-reused 0
Príjem predmetov: 100% (95072/95072), 74.69 MiB | 3.95 MiB / s, hotovo.
Riešenie delt: 100% (52343/52343), hotovo.
Prebieha kontrola pripojenia ... hotovo.
Odhlásenie súborov: 100% (5860/5860), hotovo.
$ du -sh django
124M django
Všimnite si, že aj keď je hĺbka stále 1, veľkosť klonu je 124M namiesto 55M pre predchádzajúci prípad.
Ak skontrolujeme vetvy, na tomto klone by sme mali vidieť oveľa viac vetiev:
$ git pobočka -a
* pán
diaľkové ovládače / pôvod / HLAVA -> pôvod / majster
diaľkové ovládače / origin / podkrovie / boulder-oracle-šprint
diaľkové ovládače / pôvod / podkrovie / úplná história
diaľkové ovládače / pôvod / podkrovie / generické overenie
diaľkové ovládače / pôvod / podkrovie / gis
diaľkové ovládače / pôvod / podkrovie / i18n
diaľkové ovládače / pôvod / podkrovie / odstránenie mágie
diaľkové ovládače / pôvod / podkrovie / viacnásobné overenie
remotes / origin / attic / multiple-db-support
diaľkové ovládače / pôvod / podkrovie / nový-správca
diaľkové ovládače / origin / podkrovie / newforms-admin
diaľkové ovládače / pôvod / podkrovie / povolenia pre jednotlivé objekty
diaľkové ovládače / pôvod / podkrovie / súprava dotazov-refaktor
diaľkové ovládače / pôvod / podkrovie / vývoj schémy
diaľkové ovládače / origin / podkrovie / schema-evolution-ng
diaľkové ovládače / pôvod / podkrovie / search-api
diaľkové ovládače / pôvod / podkrovie / sqlalchemy
diaľkové ovládače / pôvod / podkrovie / unicode
diaľkové ovládače / pôvod / majster
diaľkové ovládače / origin / soc2009 / admin-ui
diaľkové ovládače / origin / soc2009 / http-wsgi-vylepšenia
diaľkové ovládače / origin / soc2009 / i18n-vylepšenia
diaľkové ovládače / origin / soc2009 / validácia modelu
diaľkové ovládače / origin / soc2009 / multidb
diaľkové ovládače / origin / soc2009 / test-vylepšenia
diaľkové ovládače / origin / soc2010 / načítanie aplikácií
remotes / origin / soc2010 / query-refactor
diaľkové ovládače / origin / soc2010 / test-refaktor
diaľkové ovládače / pôvod / stabilné / 0.90.X
diaľkové ovládače / pôvod / stabilné / 0.91.X
diaľkové ovládače / pôvod / stabilné / 0.95.X
diaľkové ovládače / pôvod / stabilné / 0.96.X
diaľkové ovládače / pôvod / stabilné / 1.0.X
diaľkové ovládače / pôvod / stabilné / 1.1.X
diaľkové ovládače / pôvod / stabilné / 1.10.X
diaľkové ovládače / pôvod / stabilné / 1.11.X
diaľkové ovládače / pôvod / stabilné / 1.2.X
diaľkové ovládače / pôvod / stabilné / 1.3.X
diaľkové ovládače / pôvod / stabilné / 1.4.X
diaľkové ovládače / pôvod / stabilné / 1.5.X
diaľkové ovládače / pôvod / stabilné / 1.6.X
diaľkové ovládače / pôvod / stabilné / 1.7.X
diaľkové ovládače / pôvod / stabilné / 1.8.X
diaľkové ovládače / pôvod / stabilné / 1.9.X
diaľkové ovládače / pôvod / stabilné / 2.0.X
Zhrnutie
Plytký klon Git vám môže pomôcť ušetriť čas a miesto na pevnom disku. Má to však svoju cenu. Ak pravidelne posúvate kód do vzdialených úložísk, predĺži sa to doba potvrdenia. Pre bežné pracovné postupy je teda dobré vyhnúť sa plytkým klonom.
Referencie:
- git-klony-vs-plytke-git-klony /
- komunita.atlassian.com => clone-depth-does-what-Why-do-I-care-about-this-setting /
- git-scm.com / docs / git-clone
- Jenkins.io => large-git-repos.pdf
- stredná.com / @ wdyluis => git-gc-a-git-plytký klon
- stackoverflow.com => git-clone-by-default-shallow-or-not
- unix.výmena zásobníka.com => linux-kernel-source-code-size-difference
- atlassian.com => handle-big-repositories-git
- perforovať.com => git-beyond-basics-using-shallow-clones