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 - online2beb263 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 A2beb263 -> 866178e -> d48dd8b
Ak posledný príkaz skontrolujeme nasledujúcim príkazom:
$ git cat-file -p 2beb263strom 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
rodič 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
autor Zak H
doplatiteľ Zak H
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 7cc17ba100644 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 a44a66f9e871680
Git sleduje zmeny v tejto stromovej štruktúre. Urobme úpravu obrázka1.jpeg a skontrolovať históriu:
$ git log - online2e257db 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 2e257dbstrom 2405fad67610acf0f57b87af36f535c1f4f9ed0d
rodič 2beb263523725e1e8f9d96083140a4a5cd30b651
autor Zak H
doplatiteľ Zak H
Commit D: upravený obrázok1.jpeg
A strom (2405fad) v ňom:
$ git cat-file -p 2405fad100644 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 cb4a0b61063696
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 -> Blob1PF2 -> 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 skladbaZoznam 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