Suur failiprobleem Gitis
Traditsiooniliselt on teatud ettevõtted ja asutused Gitist eemale hoidnud suurte binaarsete failide töötlemise ebaefektiivsuse tõttu. Videomängude arendajad ja meediaettevõtted peavad tegelema keerukate tekstuuride, täisliigutusega videote ja kvaliteetsete helifailidega. Uurimisinstituudid peavad jälgima suuri andmekogumeid, mis võivad olla gigabaiti või terabaiti. Gitil on raskusi nende suurte failide hooldamisega.
Probleemi mõistmiseks peame heitma pilgu sellele, kuidas Git faile jälgib. Alati, kui tegemist on kohustusega, loob Git oma vanemale või mitmele vanemale osutava kursoriga objekti sõlme. Giti andmemudelit nimetatakse suunatud atsükliliseks graafiks (DAG). DAG-mudel tagab, et vanema ja lapse suhe ei saa kunagi moodustada tsükleid.
Saame kontrollida mudeli DAG sisemist tööd. Siin on näide kolmest toimingust hoidlas:
$ git log - oneline2beb263 Commit C: lisatud pilt1.jpeg
866178e Kohustage B: lisage b.txt
d48dd8b Kohustage A: lisage a.txt
Kohustustes A ja B lisasime tekstifaili a.txt ja b.txt. Seejärel lisasime Commit C-s pildifaili nimega image1.jpeg. DAG-i saame visualiseerida järgmiselt:
Kohustus C Kohustus B Kohustus A2beb263 -> 866178e -> d48dd8b
Kui kontrollime viimast kohustust järgmise käsuga:
$ git kassitoimik -p 2beb263puu 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
vanem 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
autor Zak H
koostaja Zak H
Tehke C: lisage pilt1.jpeg
Näeme, et kohustusel C (2beb263) on lapsevanemana kohustus B (866178e). Nüüd, kui kontrollime kohustuse C puuobjekti (7cc17ba), näeme plekke (binaarsed suured objektid):
$ git kassitoimik -p 7cc17ba100644 kämp e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 kämp e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 plekk a44a66f9e06a8faf324d3ff3e11c9fa6966bfb56 image1.jpeg
Saame kontrollida pildi pleki suurust:
$ git kassitoimik -s a44a66f9e871680
Git jälgib selle puu struktuuri muutusi. Teeme pildil1 modifikatsiooni.JPEG ja kontrollige ajalugu:
$ git log - oneline2e257db Commit D: muudetud pilt1.jpeg
2beb263 Commit C: lisatud pilt1.jpeg
866178e Kohustage B: lisage b.txt
d48dd8b Kohustage A: lisage a.txt
Kui kontrollime objekti Commit D (2e257db):
$ git kassifail -p 2e257dbpuu 2405fad67610acf0f57b87af36f535c1f4f9ed0d
vanem 2beb263523725e1e8f9d96083140a4a5cd30b651
autor Zak H
koostaja Zak H
Tehke D: muudetud pilt1.jpeg
Ja selle sees olev puu (2405fad):
$ git kassifail -p 2405fad100644 kämp e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 kämp e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 plekk cb4a0b67280a92412a81c60df36a15150e713095 image1.jpeg
Pange tähele, et pildi1 räsi SHA-1.JPEG on muutunud. See tähendab, et see on loonud pildile1 uue pleki.jpeg. Saame kontrollida uue pleki suurust:
$ git kassifail -s cb4a0b61063696
Siin on viis ülaltoodud DAG-i struktuuri visualiseerimiseks:
Pühendu D Pühendu C Pühendu B Pühendu A| | | |
2e257db -> 2beb263 -> 866178e -> d48dd8b
| | | |
Puu4 Puu3 Puu2 Puu1
| | | |
Plekid plekid plekid plekid
Iga sidumisobjekt säilitab oma puu. Selle puu sees hoitakse plekke. Git optimeerib ruumi, veendudes, et see salvestaks ainult erinevused ja kasutab salvestamiseks tihendamist. Kuid binaarfailide muutmiseks peab Git terveid faile plekidesse salvestama, sest erinevusi on raske kindlaks teha. Samuti on pildi-, video- ja helifailid juba tihendatud. Selle tulemusena jõuab puu modifitseeritud binaarfaili iga eksemplari suurde plekini.
Mõelgem ühe näite peale, kus teeme 100 MB pildifailis mitu muudatust.
Pühendu C -> Pane B -> Pane A| | |
Puu3 Puu2 Puu1
| | |
Plekk3 plekk2 plekk1
300 MB 200 MB 100 MB
Iga kord, kui muudame faili, peab Git looma 100 MB suuruse pleki. Nii et alles pärast 3 toimingut on Giti hoidla 300 MB. Näete, et Giti hoidla suurus võib kiiresti õhku paisata. Kuna Git on hajutatud versioonihaldus, laadite kogu hoidla alla oma kohalikule eksemplarile ja töötate palju harudega. Nii et suurtest plekidest saab jõudluse kitsaskoht.
Git LFS lahendab probleemi, asendades plekid kergete osutifailidega (PF) ja luues mehhanismi plekide mujal hoidmiseks.
Pühendu C -> Pane B -> Pane A| | |
Puu3 Puu2 Puu1
| | |
PF3 PF2 PF1
Kohalikult hoiab Git plekid Git LFS-i vahemälus ja eemalt salvestab need Git LFS-i poes GitHubis või BitBucketis.
PF1 -> Blob1PF2 -> Blob2
PF3 -> Blob3
Kui tegelete Giti hoidlaga, kasutatakse tavapärastes toimingutes kergeid PF-faile. Plekid leitakse ainult vajaduse korral. Näiteks kui maksate välja Commit C, otsib Git LFS PF3 kursorit ja laadib alla Blob3. Nii et töötav hoidla on lahjem ja jõudlus parem. Te ei pea muretsema kursorifailide pärast. Git LFS haldab neid kulisside taga.
Git LFS-i installimine ja käitamine
Git suurte failide probleemi on juba varem püütud lahendada. Kuid Git LFS on õnnestunud, kuna seda on lihtne kasutada. Peate lihtsalt installima LFS-i ja ütlema, milliseid faile jälgida.
Git LFS-i saate installida järgmiste käskude abil:
$ sudo apt-get install tarkvara-omadused-ühine$ curl -s https: // packagecloud.io / install / repositories / github / git-lfs / script.deb.sh | sudo bash
$ sudo apt-get install git-lfs
$ git lfs installimine
Kui olete Git LFS-i installinud, saate jälgida soovitud faile:
$ git lfs rada "*.JPEG "Jälgimine "*.JPEG "
Väljund näitab teile, et Git LFS jälgib JPEG-faile. Kui hakkate LFS-iga jälgima, leiate a .gitattributes fail, millel on jälgitud faile näitav kirje. The .gitattributes fail kasutab sama tähistust nagu .gitignore fail. Siin on, kuidas sisu .gitattributes näeb välja:
$ kass .gitattributes*.jpeg filter = lfs diff = lfs liitma = lfs -tekst
Järgmise käsu abil leiate ka jälgitavaid faile:
$ git lfs radaJälgitud mustrite loetelu
*.JPEG (.gitattributes)
Kui soovite faili jälgimise peatada, võite kasutada järgmist käsku:
$ git lfs untrack "*.JPEG "Jälgimise eemaldamine "*.JPEG "
Git-operatsioonide jaoks ei pea te LFS-i pärast muretsema. See hoolitseb kõigi taustaprogrammi ülesannete eest automaatselt. Kui olete Git LFS-i seadistanud, saate hoidlas töötada nagu iga teine projekt.
Edasine uuring
Täpsemate teemade leidmiseks uurige järgmisi ressursse:
- Giti LFS-i hoidla teisaldamine hostide vahel
- Local Git LFS-failide kustutamine
- Git LFS-i kaugfailide eemaldamine serverist
- Git LFS veebisait
- Git LFS dokumentatsioon
Viited:
- git-lfs.github.com: GitHubi repo
- github.com / git-lfs / git-lfs / tree / master / docs: GitHubi dokumentatsioon Git LFS-i jaoks
- atlasslane.com / git / tutorials / git-lfs: Atlassian Tutorials
- Youtube.com: Mis on Git LFS
- Youtube.com: tohutute failide jälgimine Git LFS-iga, autor Tim Pettersen, Atlassian
- Youtube.com: tohutute failide haldamine õiges salvestusruumis Git LFS, YouTube abil
- Youtube.com: Git Large File Storage - kuidas töötada suurte failidega, YouTube
- askubuntu.com / questions / 799341: kuidas-git-lfs-on-ubuntu-16-04 installida
- github.com / git-lfs / git-lfs / blob / master / PAIGALDAMINE.md: Paigaldusjuhend