Git

Git LFS

Git LFS
Git je dejansko postal sistem za nadzor različic za razvijalce programske opreme po vsem svetu. Ta odprtokodni, porazdeljeni sistem za nadzor različic je hitrejši od svojih konkurentov. Je enostaven za uporabo za razvejanje in združevanje kode. Vendar ima težave z zmogljivostjo velikih binarnih datotek. Za reševanje te težave je bil razvit sistem Git Large File Storage (LFS).

Težava z veliko datoteko v Gitu

Tradicionalno se nekatera podjetja in ustanove zaradi neučinkovitosti obdelave velikih binarnih datotek izogibajo Gitu. Razvijalci video iger in medijska podjetja se morajo spoprijeti s kompleksnimi teksturami, video posnetki v celoti in visokokakovostnimi zvočnimi datotekami. Raziskovalni inštituti morajo spremljati velike nabore podatkov, ki so lahko gigabajti ali terabajti. Git ima težave pri vzdrževanju teh velikih datotek.

Da bi razumeli težavo, si moramo ogledati, kako Git beleži datoteke. Vsakič, ko pride do predaje, Git ustvari vozlišče predmeta s kazalcem na nadrejenega ali več staršev. Podatkovni model Git je znan kot usmerjeni aciklični graf (DAG). Model DAG zagotavlja, da odnos med starši in otrokom ne more nikoli oblikovati nobenih ciklov.

Lahko si ogledamo notranje delovanje modela DAG. Tu je primer treh predaj v repozitoriju:

$ git log --oneline
2beb263 Zavezi C: dodana slika1.jpeg
866178e Zavezi B: dodaj b.txt
d48dd8b Obvezi A: dodajte a.txt

V Obvezi A in B smo dodali besedilno datoteko a.txt in b.txt. Nato smo v Comm C dodali slikovno datoteko, imenovano image1.jpeg. DAG si lahko vizualiziramo na naslednji način:

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

Če pregledamo zadnjo odobritev z naslednjim ukazom:

$ git mačka-datoteka -p 2beb263
drevo 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
nadrejena 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
avtor Zak H 1513259427 -0800
zavezanec Zak H 1513259427 -0800
Obveži C: dodana slika1.jpeg

Vidimo lahko, da ima zaveza C (2beb263) za nadrejeno obveznost B (866178e). Zdaj, če pregledamo drevesni objekt Comm C (7cc17ba), lahko vidimo blobs (binarno velike predmete):

$ git mačka-datoteka -p 7cc17ba
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 blob a44a66f9e06a8faf324d3ff3e11c9fa6966bfb56 image1.jpeg

Velikost bloba slike lahko preverimo:

$ git cat-file -s a44a66f9e
871680

Git spremlja spremembe v tej drevesni strukturi. Naredimo spremembo slike1.jpeg in preverite zgodovino:

$ git log --oneline
2e257db Zavezi D: spremenjena slika1.jpeg
2beb263 Zavezi C: dodana slika1.jpeg
866178e Zavezi B: dodaj b.txt
d48dd8b Obvezi A: dodajte a.txt

Če preverimo objekt D (2e257db):

$ git mačka-datoteka -p 2e257db
drevo 2405fad67610acf0f57b87af36f535c1f4f9ed0d
nadrejeni 2beb263523725e1e8f9d96083140a4a5cd30b651
avtor Zak H 1513272250 -0800
zavezanec Zak H 1513272250 -0800
Zavezi D: spremenjena slika1.jpeg

In drevo (2405fad) v njem:

$ git mačka-datoteka -p 2405fad
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 blob cb4a0b67280a92412a81c60df36a15150e713095 image1.jpeg

Opazite, da je razpršilnik SHA-1 za image1.jpeg se je spremenil. To pomeni, da je ustvaril nov blob za image1.jpeg. Velikost novega bloba lahko preverimo:

$ git cat-file -s cb4a0b6
1063696

Tukaj je način za ponazoritev zgornje strukture DAG:

Zavezi D Zaveži C Zavezi B Zavezi A
| | | |
2e257db -> 2beb263 -> 866178e -> d48dd8b
| | | |
Tree4 Tree3 Tree2 Tree1
| | | |
Blobs Blobs Blobs Blobs

Vsak predmet predaje vzdržuje svoje drevo. Blobs se hranijo znotraj tega drevesa. Git optimizira prostor tako, da poskrbi, da shranjuje samo razlike in uporablja stiskanje za shranjevanje. Toda za spremembe binarnih datotek mora Git v blobs shraniti cele datoteke, ker je težko določiti razlike. Slikovne, video in zvočne datoteke so že stisnjene. Kot rezultat, se za vsak primerek spremenjene binarne datoteke drevo konča z velikim blobom.

Pomislimo na primer, ko naredimo več sprememb v slikovni datoteki s 100 MB.

Zaveži C -> Zavezi B -> Zavezi A
| | |
Tree3 Tree2 Tree1
| | |
Blob3 Blob2 Blob1
300 MB 200 MB 100 MB

Vsakič, ko spremenimo datoteko, mora Git ustvariti blok velikosti 100 MB. Torej šele po treh prevzemih je skladišče Git 300 MB. Vidite lahko, da se lahko velikost skladišča Git hitro raznese. Ker je Git porazdeljeni nadzor različic, boste celotno repozitorij prenesli v svoj lokalni primerek in veliko delali z vejami. Tako velike kapljice postanejo ozko grlo pri izvedbi.

Git LFS reši težavo z zamenjavo blobs-ov z lahkimi kazalnimi datotekami (PF) in ustvarjanjem mehanizma za shranjevanje blobs-ov drugje.

Zaveži C -> Zavezi B -> Zavezi A
| | |
Tree3 Tree2 Tree1
| | |
PF3 PF2 PF1

Lokalno Git shranjuje blobs v predpomnilnik Git LFS, na daljavo pa jih shranjuje v trgovino Git LFS na GitHub ali BitBucket.

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

Zdaj, ko se ukvarjate s skladiščem Git, bodo lahke datoteke PF uporabljene za rutinske operacije. Blobs bodo naloženi le po potrebi. Če na primer naročite C, bo Git LFS poiskal kazalec PF3 in prenesel Blob3. Tako bo delovni repozitorij vitkejši in zmogljivost bo boljša. Ni vam treba skrbeti za datoteke kazalcev. Git LFS jih bo vodil v zakulisju.

Namestitev in zagon Git LFS

Že prej so poskušali rešiti težavo z velikimi datotekami Git. Toda Git LFS je uspel, ker je enostaven za uporabo. Preprosto morate namestiti LFS in mu povedati, katere datoteke naj sledijo.

Git LFS lahko namestite z naslednjimi ukazi:

$ 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 namestite git-lfs
$ git lfs namesti

Ko ste namestili Git LFS, lahko sledite želenim datotekam:

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

Rezultat vam pokaže, da Git LFS sledi datotekam JPEG. Ko začnete slediti z LFS, boste našli .gitattributes datoteko, ki bo imela vnos, ki prikazuje sledi datotek. The .Datoteka gitattributes uporablja enak zapis kot .gitignore datoteka. Tukaj je opisano, kako vsebina .gitattributes izgleda:

$ mačka .gitatributi
*.jpeg filter = lfs diff = lfs merge = lfs -text

Katerim datotekam se sledi, lahko najdete tudi z naslednjim ukazom:

$ git lfs track
Naštevanje vzorcev, ki jim sledi
*.jpeg (.gitatributi)

Če želite ustaviti sledenje datoteke, lahko uporabite naslednji ukaz:

$ git lfs odstrani "*.jpeg "
Sprostitev "*.jpeg "

Pri splošnih operacijah Git vam ni treba skrbeti za LFS. Za vsa zaledna opravila bo poskrbel samodejno. Ko nastavite Git LFS, lahko delate na odlagališču kot kateri koli drug projekt.


Nadaljni študij

Za naprednejše teme poglejte naslednje vire:

  • Premikanje repozitorija Git LFS med gostitelji
  • Brisanje lokalnih datotek Git LFS
  • Odstranjevanje oddaljenih datotek Git LFS s strežnika
  • Spletno mesto Git LFS
  • Dokumentacija Git LFS

Reference:

  • git-lfs.github.com: GitHub repo
  • github.com / git-lfs / git-lfs / tree / master / docs: GitHub dokumentacija za Git LFS
  • atlassian.com / git / tutorials / git-lfs: Atlassian Tutorials
  • youtube.com: Kaj je Git LFS
  • youtube.com: Sledenje ogromnim datotekam z Git LFS, Tim Pettersen, Atlassian
  • youtube.com: Upravljanje ogromnih datotek v pravem pomnilniku z Git LFS, YouTube
  • youtube.com: Git Storage Big File Storage - Kako delati z velikimi datotekami, YouTube
  • askubuntu.com / questions / 799341: kako-namestiti-git-lfs-on-ubuntu-16-04
  • github.com / git-lfs / git-lfs / blob / master / INSTALLING.md: Vodič za namestitev
Vulkan za uporabnike Linuxa
Z vsako novo generacijo grafičnih kart vidimo, da razvijalci iger premikajo meje grafične zvestobe in se približujejo fotorealizmu. A kljub vsem kredi...
OpenTTD vs Simutrans
Ustvarjanje lastne simulacije prevoza je lahko zabavno, sproščujoče in izjemno vabljivo. Zato morate preizkusiti čim več iger, da boste našli tisto, k...
Vadnica za OpenTTD
OpenTTD je ena izmed najbolj priljubljenih poslovnih simulacijskih iger. V tej igri morate ustvariti čudovit prevozniški posel. Vendar boste začeli na...