Pochopení mělkého klonu Git a hloubky klonu
Git je systém řízení distribuované verze. To je jedna z výhod používání Gitu. Abyste mohli pracovat lokálně, nemusíte být závislí na centrálním serveru nebo úložišti. Vše, co potřebujete, pokud jde o historii vašich modulů, máte na dosah ruky. Může se však stát problémem při práci s úložišti s velkými binárními soubory nebo úložišti, která mají dlouhou historii. Zvláště pokud máte situaci, kdy jej potřebujete stáhnout vždy čerstvé, například server sestavení, pak se velikost a časy stahování mohou stát problémem.
Gitovým řešením problému je mělký klon, kde můžete pomocí hloubky klonu definovat, jak hluboko by měl váš klon jít. Například pokud použijete -depth 1, pak během klonování Git získá pouze nejnovější kopii příslušných souborů. To vám může ušetřit spoustu místa a času.
Git mělký klon a velikost
Pojďme se podívat na populární úložiště Git pro Django. Pokud repo plně naklonujete, získáte následující:
$ git clone https: // github.com / django / django.sakraKlonování do 'django' ..
remote: Počítání objektů: 409053, hotovo.
remote: Komprese objektů: 100% (26/26), hotovo.
remote: Total 409053 (delta 6), reused 8 (delta 1), pack-reused 409026
Příjem objektů: 100% (409053/409053), 167.77 MiB | 5.95 MiB / s, hotovo.
Řešení delt: 100% (297045/297045), hotovo.
Kontrola připojení… hotovo.
Odhlášení souborů: 100% (5860/5860), hotovo.
Pokud nyní zkontrolujete velikost vaší místní kopie, je to:
$ du -sh django /225M django /
Pojďme získat stejné úložiště Django s mělkým klonem:
$ git clone - hloubka 1 https: // github.com / django / django.sakraKlonování do 'django' ..
remote: Počítání objektů: 8091, hotovo.
remote: Komprese objektů: 100% (4995/4995), hotovo.
remote: Total 8091 (delta 2036), reused 5507 (delta 1833), pack-reused 0
Příjem objektů: 100% (8091/8091), 8.82 MiB | 3.29 MiB / s, hotovo.
Řešení delt: 100% (2036/2036), hotovo.
Kontrola připojení… hotovo.
Odhlášení souborů: 100% (5860/5860), hotovo.
Pokud nyní zkontrolujete velikost místní kopie, měla by být podstatně menší:
$ du -sh django /55M django /
Pokud váš server pracuje se stovkami produktových řad, může být tento druh úspory místa na pevném disku užitečný. V případě herních projektů, kde existují těžké binární soubory, to může mít dramatický účinek. Pomáhá také při dlouhodobých projektech. Například úplné klonování repozitáře Linuxu z GitHubu je více než 7 GB, ale můžete jej povrchně klonovat za méně než 1 GB.
Git mělký klon a historie
Mělké klonování můžete místně vyzkoušet ve svém vlastním úložišti. Pojďme vytvořit soubor v našem místním úložišti, provést změny a potvrdit ho 10krát. A pak můžeme klonovat úložiště:
$ mkdir _příklad$ cd _příklad
$ ls
$ git init
Inicializované prázdné úložiště Git v / Users / zakh / git_repo / _example /.git /
$ echo x> velký_soubor
$ git přidat -A
$ git commit -m "Počáteční potvrzení"
[master (root-commit) dd11686] Počáteční potvrzení
1 soubor změněn, 1 vložení (+)
vytvořit režim 100644 large_file
$ echo xx> velký_soubor
$ git přidat -A
$ git commit -m "Úprava velkého_souboru 1"
[master 9efa367] Úprava na velký_soubor 1
1 soubor změněn, 1 vložení (+), 1 smazání (-)
…
…
$ mkdir test
$ cd test
$ git klonový soubor: //// Users / zakh / git_repo / _example
Klonování do „_example“…
remote: Počítání objektů: 33, hotovo.
remote: Komprese objektů: 100% (22/22), hotovo.
dálkově: Celkem 33 (delta 10), znovu použito 0 (delta 0)
Příjem předmětů: 100% (33/33), 50.03 MiB | 42.10 MiB / s, hotovo.
Řešení delt: 100% (10/10), hotovo.
Kontrola připojení… hotovo.
V tomto příkladu jsme vytvořili _example úložiště git ve složce / Users / zakh / git_repo / s jedním velkým_souborem. Zobrazeny jsou pouze první dva závazky. Pak vytváříme úplný klon tohoto úložiště na jiném místě.
Pak se podívejme na historii našich závazků:
$ git log - online7fa451f Úprava na velký_soubor 10
648d8c9 Úprava na velký_soubor 9
772547a Úprava souboru large_file 8
13dd9ab Úprava souboru large_file 7
5e73b67 Úprava souboru large_file 6
030a6e7 Úpravy na velký_soubor 5
1d14922 Úprava souboru large_file 4
bc0f2c2 Úprava souboru large_file 3
2794f11 Úprava na velký_soubor 2
d4374fb Úprava na velký_soubor 1
924829d Počáteční potvrzení
Vidíme všechny závazky v plném klonu.
Nyní odstraníme aktuální kopii a poté mělký klon s hloubkou 1:
Klonování do „_example“…
remote: Počítání objektů: 3, hotovo.
remote: Komprese objektů: 100% (2/2), hotovo.
remote: Celkem 3 (delta 0), znovu použito 0 (delta 0)
Příjem předmětů: 100% (3/3), 50.02 MiB | 65.12 MiB / s, hotovo.
Kontrola připojení… hotovo.
Podíváme-li se nyní na historii, vidíme pouze poslední historii potvrzení:
$ git log - online7fa451f Úprava na velký_soubor 10
Pojďme mělký klon s hloubkou 3:
$ git clone - soubor hloubky 3: //// Users / zakh / git_repo / _exampleKlonování do „_example“…
remote: Počítání objektů: 9, hotovo.
remote: Komprese objektů: 100% (6/6), hotovo.
dálkově: Celkem 9 (delta 2), znovu použito 0 (delta 0)
Příjem objektů: 100% (9/9), 50.02 MiB | 65.15 MiB / s, hotovo.
Řešení delt: 100% (2/2), hotovo.
Kontrola připojení… hotovo.
Nyní vidíme více závazků:
$ git log - online7fa451f Úprava na velký_soubor 10
648d8c9 Úprava na velký_soubor 9
772547a Úprava souboru large_file 8
Problémy s mělkým klonem Git
Uživatelé by měli pochopit, že velikost a úspora času při stahování závisí na organizaci závazků. Mohou se výrazně lišit od jednoho úložiště k druhému. Je dobré otestovat úložiště s mělkým klonem a zkontrolovat, kolik místa na pevném disku a čas stahování vám ušetří.
Další úvaha spočívá v tom, že i když můžete posunout kód z mělkého klonu, může to trvat déle kvůli výpočtům mezi vzdáleným a místním serverem. Pokud tedy pravidelně zadáváte kód z místní kopie, pravděpodobně má smysl použít celý klon.
Možnost více poboček
Když použijete příznak -depth s příkazem clone, předpokládá Git ve výchozím nastavení příznak -single-branch. Ale můžete použít příznak -no-single-branch, abyste řekli Gitu, aby získal historii ze zadané hloubky každé větve.
Zde jsou větve Django bez možnosti -no-single-branch (hloubka 1):
$ git větev -a* mistr
dálkové ovladače / počátek / HLAVA -> počátek / hlavní
dálkové ovladače / původ / master
Je přítomna pouze hlavní větev.
Tady jsou větve Django po použití volby -no-single-branch:
$ git clone --depth 1 --no-single-branch https: // github.com / django / django.sakraKlonování do 'django' ..
remote: Počítání objektů: 95072, hotovo.
remote: Komprese objektů: 100% (42524/42524), hotovo.
dálkově: Celkem 95072 (delta 52343), znovu použito 82284 (delta 42389), znovu použito v balíčku 0
Příjem objektů: 100% (95072/95072), 74.69 MiB | 3.95 MiB / s, hotovo.
Řešení delt: 100% (52343/52343), hotovo.
Kontrola připojení… hotovo.
Odhlášení souborů: 100% (5860/5860), hotovo.
$ du -sh django
124M django
Všimněte si, že i když je hloubka stále 1, velikost klonu je 124M místo 55M pro předchozí případ.
Pokud zkontrolujeme větve, měli bychom na tomto klonu vidět mnohem více větví:
$ git větev -a
* mistr
dálkové ovladače / počátek / HLAVA -> počátek / hlavní
dálkové ovladače / původ / podkroví / balvan-věštec-sprint
dálkové ovladače / původ / podkroví / plná historie
dálkové ovladače / původ / podkroví / generické ověření
dálkové ovladače / původ / podkroví / gis
dálkové ovladače / původ / podkroví / i18n
dálkové ovladače / původ / podkroví / odstranění magie
dálkové ovladače / původ / podkroví / více autor
remotes / origin / attic / multiple-db-support
dálkové ovladače / původ / podkroví / nový-administrátor
remotes / origin / attic / newforms-admin
dálkové ovládání / původ / podkroví / oprávnění pro každý objekt
dálkové ovladače / původ / podkroví / sada dotazů-refaktor
dálkové ovladače / původ / podkroví / vývoj schématu
dálkové ovladače / origin / podkroví / schema-evolution-ng
dálkové ovladače / původ / podkroví / search-api
dálkové ovladače / původ / podkroví / sqlalchemy
dálkové ovladače / původ / podkroví / unicode
dálkové ovladače / původ / master
dálkové ovladače / origin / soc2009 / admin-ui
dálková ovládání / origin / soc2009 / http-wsgi-vylepšení
dálková ovládání / origin / soc2009 / i18n - vylepšení
dálkové ovladače / origin / soc2009 / ověření modelu
dálkové ovladače / origin / soc2009 / multidb
dálkové ovladače / origin / soc2009 / test-vylepšení
dálkové ovladače / origin / soc2010 / načítání aplikací
dálkové ovladače / origin / soc2010 / refaktor dotazu
dálkové ovladače / origin / soc2010 / test-refaktor
dálkové ovladače / původ / stabilní / 0.90.X
dálkové ovladače / původ / stabilní / 0.91.X
dálkové ovladače / původ / stabilní / 0.95.X
dálkové ovladače / původ / stabilní / 0.96.X
dálkové ovladače / původ / stabilní / 1.0.X
dálkové ovladače / původ / stabilní / 1.1.X
dálkové ovladače / původ / stabilní / 1.10.X
dálkové ovladače / původ / stabilní / 1.11.X
dálkové ovladače / původ / stabilní / 1.2.X
dálkové ovladače / původ / stabilní / 1.3.X
dálkové ovladače / původ / stabilní / 1.4.X
dálkové ovladače / původ / stabilní / 1.5.X
dálkové ovladače / původ / stabilní / 1.6.X
dálkové ovladače / původ / stabilní / 1.7.X
dálkové ovladače / původ / stabilní / 1.8.X
dálkové ovladače / původ / stabilní / 1.9.X
dálkové ovladače / původ / stabilní / 2.0.X
souhrn
Git mělký klon vám pomůže ušetřit čas a místo na pevném disku. Ale přichází za cenu. Pokud pravidelně posíláte kód do vzdálených úložišť, zvýší se časy potvrzení. U běžných pracovních postupů je tedy dobré vyhnout se mělkým klonům.
Reference:
- git-klony-vs-mělké-git-klony /
- společenství.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
- střední.com / @ wdyluis => git-gc-and-git-shallow-clone
- přetečení zásobníku.com => git-clone-by-default-shallow-or-not
- unix.výměna zásobníku.com => linux-kernel-source-code-size-difference
- atlassian.com => handle-big-repositories-git
- nezbytně.com => git-beyond-basics-using-shallow-clones