Git

Git LFS

Git LFS
Git je postao de facto sustav kontrole verzija za programere širom svijeta. Ovaj distribuirani sustav kontrole verzija s otvorenim kodom brži je od svojih konkurenata. Jednostavan je za upotrebu za razgranavanje i spajanje koda. Međutim, ima problema s performansama velikih binarnih datoteka. Git Large File Storage (LFS) razvijen je za rješavanje ovog problema.

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 --oneline
2beb263 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 A
2beb263 -> 866178e -> d48dd8b

Ako provjerimo posljednje urezivanje sljedećom naredbom:

$ git mačka-datoteka -p 2beb263
stablo 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
roditelj 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
autor Zak H 1513259427 -0800
počinitelj Zak H 1513259427 -0800
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 7cc17ba
100644 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 a44a66f9e
871680

Git prati promjene u ovoj strukturi stabla. Napravimo modifikaciju slike1.jpeg i provjeri povijest:

$ git log --oneline
2e257db 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 2e257db
stablo 2405fad67610acf0f57b87af36f535c1f4f9ed0d
roditelj 2beb263523725e1e8f9d96083140a4a5cd30b651
autor Zak H 1513272250 -0800
počinitelj Zak H 1513272250 -0800
Obrezivanje D: izmijenjena slika1.jpeg

I stablo (2405fad) u njemu:

$ git mačka-datoteka -p 2405fad
100644 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 cb4a0b6
1063696

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 -> Blob1
PF2 -> 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 track
Popis 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
Kako promijeniti pokazivač miša i veličinu, boju i shemu pokazivača na sustavu Windows 10
Pokazivač i pokazivač miša u sustavu Windows 10 vrlo su važni aspekti operativnog sustava. To se može reći i za druge operativne sustave, tako da u is...
Besplatni i otvoreni kodni pokretački programi za razvoj Linux igara
Ovaj će članak pokriti popis besplatnih i open source pokretačkih igara koje se mogu koristiti za razvoj 2D i 3D igara na Linuxu. Brojni su takvi moto...
Vodič za Shadow of the Tomb Raider za Linux
Shadow of the Tomb Raider dvanaesti je dodatak seriji Tomb Raider - franšizi u akcijsko-avanturističkoj igri koju je stvorio Eidos Montreal. I kritiča...