Git

Git LFS

Git LFS
Git sa stal de facto systémom na správu verzií pre vývojárov softvéru z celého sveta. Tento open-source systém distribuovanej verzie je rýchlejší ako jeho konkurenti. Ľahko sa používa na rozvetvenie a zlúčenie kódu. Má však problém s výkonom pri veľkých binárnych súboroch. Na riešenie tohto problému bolo vyvinuté úložisko Git Large File Storage (LFS).

Problém veľkých súborov v Gite

Niektoré spoločnosti a inštitúcie sa tradične držali ďalej od spoločnosti Git kvôli neefektívnosti spracovania veľkých binárnych súborov. Vývojári videohier a mediálne spoločnosti sa musia vyrovnať so zložitými textúrami, videami v plnom pohybe a vysokokvalitnými zvukovými súbormi. Výskumné ústavy musia sledovať veľké súbory údajov, ktoré môžu byť gigabajty alebo terabajty. Git má ťažkosti s udržiavaním týchto veľkých súborov.

Aby sme pochopili problém, musíme sa pozrieť na to, ako Git sleduje súbory. Kedykoľvek dôjde k potvrdeniu, Git vytvorí uzol objektu s ukazovateľom na jeho rodiča alebo viacerých rodičov. Dátový model Git je známy ako smerovaný acyklický graf (DAG). Model DAG zaručuje, že vzťah rodiča s dieťaťom nemôže nikdy vytvárať žiadne cykly.

Môžeme skontrolovať vnútorné fungovanie modelu DAG. Tu je príklad troch potvrdení v úložisku:

$ git log - online
2beb263 Commit C: pridaný obrázok1.jpeg
866178e Záväzok B: pridať b.TXT
d48dd8b Commit A: pridať a.TXT

Vo Commit A a B sme pridali textový súbor a.txt a b.TXT. Potom sme do Commit C pridali obrazový súbor s názvom image1.jpeg. DAG môžeme vizualizovať nasledovne:

Commit C Commit B Commit A
2beb263 -> 866178e -> d48dd8b

Ak posledný príkaz skontrolujeme nasledujúcim príkazom:

$ git cat-file -p 2beb263
strom 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
rodič 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
autor Zak H 1513259427 -0800
doplatiteľ Zak H 1513259427 -0800
Potvrdiť C: pridaný obrázok1.jpeg

Vidíme, že Commit C (2beb263) má ako parent Commit B (866178e). Teraz, keď skontrolujeme objekt stromu Commit C (7cc17ba), môžeme vidieť bloby (binárne veľké objekty):

$ git cat-file -p 7cc17ba
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.TXT
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.TXT
100644 blob a44a66f9e06a8faf324d3ff3e11c9fa6966bfb56 obrázok1.jpeg

Môžeme skontrolovať veľkosť blob obrázku:

$ git súbor mačiek -s a44a66f9e
871680

Git sleduje zmeny v tejto stromovej štruktúre. Urobme úpravu obrázka1.jpeg a skontrolovať históriu:

$ git log - online
2e257db Commit D: upravený obrázok1.jpeg
2beb263 Commit C: pridaný obrázok1.jpeg
866178e Záväzok B: pridať b.TXT
d48dd8b Commit A: pridať a.TXT

Ak skontrolujeme objekt Commit D (2e257db):

$ git cat-file -p 2e257db
strom 2405fad67610acf0f57b87af36f535c1f4f9ed0d
rodič 2beb263523725e1e8f9d96083140a4a5cd30b651
autor Zak H 1513272250 -0800
doplatiteľ Zak H 1513272250 -0800
Commit D: upravený obrázok1.jpeg

A strom (2405fad) v ňom:

$ git cat-file -p 2405fad
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.TXT
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.TXT
100644 blob cb4a0b67280a92412a81c60df36a15150e713095 obrázok1.jpeg

Všimnite si, že hash SHA-1 pre obrázok1.jpeg sa zmenil. To znamená, že vytvoril nový objekt blob pre obrázok1.jpeg. Môžeme skontrolovať veľkosť nového objektu blob:

$ git súbor mačiek -s cb4a0b6
1063696

Tu je spôsob, ako vizualizovať vyššie uvedenú štruktúru DAG:

Commit D Commit C Commit B Commit A
| | | |
2e257db -> 2beb263 -> 866178e -> d48dd8b
| | | |
Tree4 Tree3 Tree2 Tree1
| | | |
Blobs Blobs Blobs Blobs

Každý objekt potvrdenia má svoj vlastný strom. Vo vnútri tohto stromu sa udržujú guľky. Git optimalizuje priestor zabezpečením, že ukladá iba rozdiely a na ukladanie používa kompresiu. Ale pri zmenách binárnych súborov musí Git ukladať celé súbory do blobov, pretože je ťažké určiť rozdiely. Obrazové, obrazové a zvukové súbory sú už komprimované. Výsledkom je, že pre každú inštanciu upraveného binárneho súboru končí strom s veľkým blobom.

Uvažujme o príklade, keď urobíme niekoľko zmien v 100 MB obrazovom súbore.

Commit C -> Commit B -> Commit A
| | |
Strom3 Strom2 Strom1
| | |
Blob3 Blob2 Blob1
300 MB, 200 MB, 100 MB

Zakaždým, keď zmeníme súbor, musí Git vytvoriť 100 MB blob. Takže až po 3 spáchaniach má úložisko Git 300 MB. Vidíte, že veľkosť úložiska Git môže rýchlo vybuchnúť. Pretože Git je riadenie distribuovanej verzie, budete sťahovať celé úložisko do miestnej inštancie a veľa pracovať s pobočkami. Takže veľké kvapky sa stávajú úzkym miestom výkonu.

Git LFS problém rieši nahradením blobov ľahkými súbormi ukazovateľov (PF) a vytvorením mechanizmu na ukladanie blobov inde.

Commit C -> Commit B -> Commit A
| | |
Strom3 Strom2 Strom1
| | |
PF3 PF2 PF1

Lokálne Git ukladá guľky do medzipamäte Git LFS a na diaľku ich bude ukladať do obchodu Git LFS na GitHub alebo BitBucket.

PF1 -> Blob1
PF2 -> Blob2
PF3 -> Blob3

Teraz, keď pracujete s úložiskom Git, na rutinné operácie sa použijú ľahké súbory PF. Bloby sa získajú iba v prípade potreby. Napríklad ak pokladníte Commit C, potom Git LFS vyhľadá ukazovateľ PF3 a stiahne Blob3. Takže pracovné úložisko bude štíhlejšie a výkon bude lepší. O súbory ukazovateľov sa nemusíte starať. Git LFS ich bude spravovať v zákulisí.

Inštalácia a spustenie Git LFS

Boli tu predchádzajúce pokusy o vyriešenie problému s veľkým súborom Git. Ale Git LFS uspel, pretože je ľahko použiteľný. Musíte si len nainštalovať LFS a povedať mu, ktoré súbory majú sledovať.

Git LFS môžete nainštalovať pomocou nasledujúcich príkazov:

$ sudo apt-get nainštalovať softvér-vlastnosti-bežné
$ curl -s https: // packagecloud.io / install / repositories / github / git-lfs / skript.deb.sh | sudo bash
$ sudo apt-get nainštalovať git-lfs
$ git lfs nainštalovať

Po nainštalovaní Git LFS môžete sledovať požadované súbory:

$ git lfs track "*.jpeg "
Sledovanie "*.jpeg "

Výstup ukazuje, že Git LFS sleduje súbory JPEG. Keď začnete sledovať pomocou LFS, nájdete a .súbor gitattributes, ktorý bude mať záznam zobrazujúci sledované súbory. The .súbor gitattributes používa rovnaký zápis ako .gitignore súbor. Tu je ukážka obsahu .gitattributes vyzerá:

$ kat .gitattributy
*.jpeg filter = lfs diff = lfs merge = lfs -text

Môžete tiež zistiť, ktoré súbory sa sledujú, pomocou nasledujúceho príkazu:

$ git lfs skladba
Zoznam sledovaných vzorov
*.jpeg (.gitattributes)

Ak chcete zastaviť sledovanie súboru, môžete použiť nasledujúci príkaz:

$ git lfs untrack "*.jpeg "
Ukončenie sledovania „*.jpeg "

Pri bežných operáciách Git sa nemusíte obávať LFS. Automaticky sa postará o všetky backendové úlohy. Keď nastavíte Git LFS, môžete na úložisku pracovať ako na každom inom projekte.


Ďalšie štúdium

Podrobnejšie témy nájdete v nasledujúcich zdrojoch:

  • Presun úložiska Git LFS medzi hostiteľmi
  • Odstraňovanie miestnych súborov Git LFS
  • Odstránenie vzdialených súborov Git LFS zo servera
  • Web Git LFS
  • Dokumentácia Git LFS

Referencie:

  • git-lfs.github.com: GitHub repo
  • github.com / git-lfs / git-lfs / tree / master / docs: Dokumentácia GitHub pre Git LFS
  • atlassian.com / git / tutorials / git-lfs: Atlassian Tutorials
  • YouTube.com: Čo je to Git LFS
  • YouTube.com: Sledovanie obrovských súborov pomocou Git LFS, Tim Pettersen, Atlassian
  • YouTube.com: Správa obrovských súborov na správnom úložisku pomocou Git LFS, YouTube
  • YouTube.com: Veľké úložisko súborov Git - Ako pracovať s veľkými súbormi, YouTube
  • askubuntu.com / questions / 799341: how-to-install-git-lfs-on-ubuntu-16-04
  • github.com / git-lfs / git-lfs / blob / master / INŠTALÁCIA.md: Sprievodca inštaláciou
Hry Top 10 hier, ktoré sa dajú hrať na Ubuntu
Top 10 hier, ktoré sa dajú hrať na Ubuntu
Platforma Windows je jednou z dominujúcich platforiem pre hry kvôli obrovskému percentu hier, ktoré sa dnes vyvíjajú na natívnu podporu systému Window...
Hry 5 najlepších arkádových hier pre Linux
5 najlepších arkádových hier pre Linux
V dnešnej dobe sú počítače vážne stroje používané na hranie hier. Ak nemôžete dosiahnuť nové najvyššie skóre, budete vedieť, čo tým myslím. V tomto pr...
Hry Battle For Wesnoth 1.13.6 Vývoj uvoľnený
Battle For Wesnoth 1.13.6 Vývoj uvoľnený
Battle For Wesnoth 1.13.6 vydané minulý mesiac, je šiestym vývojovým vydaním v 1.13.séria x a prináša množstvo vylepšení, najmä používateľského rozhra...