Veliki problem s datotekama u Gitu
Tradicionalno su se određene tvrtke i institucije klonile Gita zbog neučinkovitosti u rukovanju velikim binarnim datotekama. Programeri video igara i medijske tvrtke moraju se nositi sa složenim teksturama, videozapisima u cjelini i visokokvalitetnim audio datotekama. Istraživački instituti moraju pratiti velike skupove podataka koji mogu biti gigabajti ili terabajti. Git ima poteškoća s održavanjem ovih velikih datoteka.
Da bismo razumjeli problem, moramo pogledati kako Git prati datoteke. Kad god postoji urezivanje, Git stvara čvor objekta s pokazivačem na svog roditelja ili više roditelja. Gitov model podataka poznat je kao usmjereni aciklički graf (DAG). DAG model osigurava da odnos roditelja i djeteta nikada ne može stvarati cikluse.
Možemo pregledati unutarnji rad DAG modela. Evo primjera tri urezivanja u spremištu:
$ git log --oneline2beb263 Porezivanje C: dodana slika1.jpeg
866178e Obvezi B: dodaj b.txt
d48dd8b Obvezi A: dodaj a.txt
U Porezivanje A i B dodali smo tekstualnu datoteku a.txt i b.txt. Zatim smo u Comm C dodali slikovnu datoteku nazvanu image1.jpeg. DAG možemo vizualizirati na sljedeći način:
Obveži C Objavi B Objavi A2beb263 -> 866178e -> d48dd8b
Ako provjerimo posljednje urezivanje sljedećom naredbom:
$ git mačka-datoteka -p 2beb263stablo 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
roditelj 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
autor Zak H
počinitelj Zak H
Obrezivanje C: dodana slika1.jpeg
Možemo vidjeti da Objava C (2beb263) ima Obvezu B (866178e) kao roditelja. Sada ako pregledamo objekt stabla urezivanja C (7cc17ba), možemo vidjeti blobs (binarne velike objekte):
$ git mačka-datoteka -p 7cc17ba100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 blob a44a66f9e06a8faf324d3ff3e11c9fa6966bfb56 image1.jpeg
Možemo provjeriti veličinu bloba slike:
$ git mačka-datoteka a44a66f9e871680
Git prati promjene u ovoj strukturi stabla. Napravimo modifikaciju slike1.jpeg i provjeri povijest:
$ git log --oneline2e257db Porezivanje D: izmijenjena slika1.jpeg
2beb263 Porezivanje C: dodana slika1.jpeg
866178e Obvezi B: dodaj b.txt
d48dd8b Obvezi A: dodaj a.txt
Ako provjerimo objekt D urezivanja (2e257db):
$ git mačka-datoteka -p 2e257dbstablo 2405fad67610acf0f57b87af36f535c1f4f9ed0d
roditelj 2beb263523725e1e8f9d96083140a4a5cd30b651
autor Zak H
počinitelj Zak H
Obrezivanje D: izmijenjena slika1.jpeg
I stablo (2405fad) u njemu:
$ git mačka-datoteka -p 2405fad100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 blob cb4a0b67280a92412a81c60df36a15150e713095 image1.jpeg
Primijetite da hash SHA-1 za image1.jpeg se promijenio. To znači da je stvorio novi blob za image1.jpeg. Možemo provjeriti veličinu nove mrlje:
$ git mačka-datoteka -s cb4a0b61063696
Evo načina za vizualizaciju gornje DAG strukture:
Obveži D Objavi C Objavi B Objavi A| | | |
2e257db -> 2beb263 -> 866178e -> d48dd8b
| | | |
Tree4 Tree3 Tree2 Tree1
| | | |
Blobs Blobs Blobs Blobs
Svaki objekt predaje održava svoje stablo. Blobs se održavaju unutar tog stabla. Git optimizira prostor osiguravajući da samo pohranjuje razlike i koristi kompresiju za pohranu. Ali za promjene binarnih datoteka, Git mora pohraniti cijele datoteke u blobs jer je teško utvrditi razlike. Također, slike, video i audio datoteke su već komprimirane. Kao rezultat toga, za svaku instancu modificirane binarne datoteke stablo završava velikim blobom.
Sjetimo se primjera u kojem vršimo više izmjena u slikovnoj datoteci od 100 MB.
Obveži C -> Objavi B -> Objavi A| | |
Tree3 Tree2 Tree1
| | |
Blob3 Blob2 Blob1
300 MB 200 MB 100 MB
Svaki put kad promijenimo datoteku, Git mora stvoriti blob od 100 MB. Dakle, samo nakon 3 urezivanja, Git spremište je 300 MB. Možete vidjeti da se veličina Git spremišta može brzo raznijeti. Budući da je Git distribuirana kontrola verzija, preuzet ćete cijelo spremište na svoju lokalnu instancu i puno raditi s granama. Tako velike mrlje postaju usko grlo u izvedbi.
Git LFS rješava problem zamjenom blobova laganim datotekama pokazivača (PF) i stvaranjem mehanizma za pohranu blobova negdje drugdje.
Obveži C -> Objavi B -> Objavi A| | |
Tree3 Tree2 Tree1
| | |
PF3 PF2 PF1
Lokalno Git pohranjuje blobove u Git LFS predmemoriju, a daljinski će ih pohraniti u Git LFS trgovinu na GitHub ili BitBucket.
PF1 -> Blob1PF2 -> Blob2
PF3 -> Blob3
Sada kada imate posla s Git spremištem, lagane PF datoteke će se koristiti za rutinske operacije. Blobs će se dohvatiti samo kada je to potrebno. Na primjer, ako naručite Objavi C, tada će Git LFS potražiti pokazivač PF3 i preuzeti Blob3. Tako će radno spremište biti vitko, a performanse će biti bolje. Ne morate brinuti o datotekama pokazivača. Git LFS će upravljati njima iza kulisa.
Instaliranje i pokretanje Git LFS-a
Prethodno su pokušani riješiti problem velike datoteke Git. Ali Git LFS je uspio jer je jednostavan za upotrebu. Jednostavno morate instalirati LFS i reći mu koje datoteke treba pratiti.
Možete instalirati Git LFS pomoću sljedećih naredbi:
$ sudo apt-get install software-properties-common$ curl -s https: // packagecloud.io / install / repositories / github / git-lfs / script.deb.sh | sudo bash
$ sudo apt-get instalirati git-lfs
$ git lfs instalirati
Nakon što instalirate Git LFS, možete pratiti datoteke koje želite:
$ git lfs track "*.jpeg "Praćenje "*.jpeg "
Izlaz vam pokazuje da Git LFS prati JPEG datoteke. Kad započnete praćenje s LFS-om, pronaći ćete .gitattributes datoteka koja će imati unos koji prikazuje praćene datoteke. The .datoteka gitattributes koristi istu oznaku kao .gitignore datoteka. Evo kako sadržaj .gitattributes izgleda:
$ mačka .gitatributi*.jpeg filter = lfs diff = lfs merge = lfs -text
Također možete pronaći koje se datoteke prate pomoću sljedeće naredbe:
$ git lfs trackPopis praćenih uzoraka
*.jpeg (.gitatributi)
Ako želite zaustaviti praćenje datoteke, možete upotrijebiti sljedeću naredbu:
$ git lfs otkači "*.jpeg "Otkazivanje "*.jpeg "
Za opće Git operacije, ne morate brinuti o LFS-u. Automatski će se pobrinuti za sve pozadinske zadatke. Nakon što postavite Git LFS, možete raditi na spremištu kao i svaki drugi projekt.
Daljni studiji
Naprednije teme potražite u sljedećim resursima:
- Premještanje Git LFS spremišta između hostova
- Brisanje lokalnih Git LFS datoteka
- Uklanjanje udaljenih Git LFS datoteka s poslužitelja
- Web stranica Git LFS
- Git LFS dokumentacija
Reference:
- git-lfs.github.com: GitHub repo
- github.com / git-lfs / git-lfs / tree / master / docs: GitHub dokumentacija za Git LFS
- atlasa.com / git / tutorials / git-lfs: Atlassian Tutorials
- youtube.com: Što je Git LFS
- youtube.com: Praćenje ogromnih datoteka s Git LFS, Tim Pettersen, Atlassian
- youtube.com: Upravljanje ogromnim datotekama na pravom prostoru za pohranu pomoću Git LFS, YouTube
- youtube.com: Git Storage za velike datoteke - kako raditi s velikim datotekama, YouTube
- askubuntu.com / questions / 799341: kako instalirati-git-lfs-on-ubuntu-16-04
- github.com / git-lfs / git-lfs / blob / master / INSTALIRANJE.md: Vodič za instalaciju