Liela faila problēma Git
Tradicionāli daži uzņēmumi un iestādes ir palikuši prom no Git lielo bināro failu apstrādes neefektivitātes dēļ. Videospēļu izstrādātājiem un mediju uzņēmumiem ir jānodarbojas ar sarežģītām tekstūrām, pilnas kustības video un augstas kvalitātes audio failiem. Pētniecības institūtiem ir jāseko lielām datu kopām, kas var būt gigabaiti vai terabaiti. Gitam ir grūtības uzturēt šos lielos failus.
Lai saprastu problēmu, mums jāaplūko, kā Git seko failiem. Ikreiz, kad ir saistības, Gits izveido objekta mezglu ar rādītāju vecākiem vai vairākiem vecākiem. Git datu modelis ir pazīstams kā virzītais acikliskais grafiks (DAG). DAG modelis nodrošina, ka vecāku un bērnu attiecības nekad nevar veidot ciklus.
Mēs varam pārbaudīt DAG modeļa iekšējo darbību. Šeit ir trīs glabātavā veikto darbību piemērs:
$ git log - tiešsaistē2beb263 Apņemties C: pievienots attēls1.JPEG
866178e Saņemt B: pievienot b.txt
d48dd8b Apņemties A: pievienojiet a.txt
Saistībās A un B mēs pievienojām teksta failu a.txt un b.txt. Pēc tam programmā Commit C mēs pievienojām attēla failu ar nosaukumu image1.JPEG. Mēs varam vizualizēt DAG šādi:
Saņemt C Izpildīt B Saistīt A2beb263 -> 866178e -> d48dd8b
Ja mēs pārbaudīsim pēdējo saistību ar šādu komandu:
$ git kaķu fails -p 2beb263koks 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
vecāks 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
autors Zaks H
izpildītājs Zaks H
Apņemties C: pievienots attēls1.JPEG
Mēs varam redzēt, ka saistībai C (2beb263) ir saistības B (866178e) kā vecākam. Tagad, ja mēs pārbaudām Commit C (7cc17ba) koka objektu, mēs varam redzēt lāses (lielus binārus objektus):
$ git kaķu fails -p 7cc17ba100644 lāse e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 lāse e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 lāse a44a66f9e06a8faf324d3ff3e11c9fa6966bfb56 image1.JPEG
Mēs varam pārbaudīt attēla lāse izmēru:
$ git kaķu fails -s a44a66f9e871680
Gits seko līdzi izmaiņām šajā koka struktūrā. Veiksim attēla modifikāciju1.JPEG un pārbaudiet vēsturi:
$ git log - tiešsaistē2e257db Apņemties D: modificēts attēls1.JPEG
2beb263 Apņemties C: pievienots attēls1.JPEG
866178e Saņemt B: pievienot b.txt
d48dd8b Apņemties A: pievienojiet a.txt
Ja mēs pārbaudām objektu Commit D (2e257db):
$ git kaķu fails -p 2e257dbkoks 2405fad67610acf0f57b87af36f535c1f4f9ed0d
vecāks 2beb263523725e1e8f9d96083140a4a5cd30b651
autors Zaks H
izpildītājs Zaks H
Apņemties D: modificēts attēls.JPEG
Un koks (2405fad) tā iekšpusē:
$ git kaķu fails -p 2405fad100644 lāse e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 lāse e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 lāse cb4a0b67280a92412a81c60df36a15150e713095 image1.JPEG
Ievērojiet, ka SH1-hash attēlam1.jpeg ir mainījies. Tas nozīmē, ka tas ir izveidojis jaunu lāpi image1.JPEG. Mēs varam pārbaudīt jaunā lāse izmēru:
$ git kaķu fails -s cb4a0b61063696
Šeit ir veids, kā vizualizēt iepriekš minēto DAG struktūru:
Saņemt D Izpildīt C Saistīt B Saistīt A| | | |
2e257db -> 2beb263 -> 866178e -> d48dd8b
| | | |
Koks4 Koks3 Koks2 Koks1
| | | |
Blobs Blobs Blobs Blobs
Katrs apņemšanās objekts uztur savu koku. Lāpas tiek turētas šī koka iekšpusē. Git optimizē vietu, pārliecinoties, ka tajā tiek uzglabātas tikai atšķirības un uzglabāšanai tiek izmantota saspiešana. Bet, lai veiktu bināro failu izmaiņas, Git ir jāglabā veseli faili burbuļos, jo ir grūti noteikt atšķirības. Arī attēlu, video un audio faili jau ir saspiesti. Rezultātā katram modificēta binārā faila gadījumam koks beidzas ar lielu lāse.
Iedomāsimies piemēru, kur mēs veicam vairākas izmaiņas 100 MB attēla failā.
Apņemties C -> Apņemties B -> Saņemt A| | |
Koks3 Koks2 Koks1
| | |
Blob3 Blob2 Blob1
300 MB 200 MB 100 MB
Katru reizi, kad mainām failu, Git ir jāizveido 100 MB lāse. Tātad tikai pēc 3 saistībām Git krātuve ir 300 MB. Var redzēt, ka Git krātuves izmērs var ātri uzsprāgt. Tā kā Git ir izplatīta versiju vadība, jūs lejupielādēsit visu krātuvi vietējā instancē un daudz strādāsit ar filiālēm. Tātad lielie lāse kļūst par veiktspējas sašaurinājumu.
Git LFS atrisina problēmu, nomainot plankumus ar viegliem rādītāju failiem (PF) un izveidojot mehānismu, lai blobus uzglabātu citur.
Apņemties C -> Apņemties B -> Apņemties A| | |
Koks3 Koks2 Koks1
| | |
PF3 PF2 PF1
Lokāli Git glabā blobus Git LFS kešatmiņā un attālināti tos glabās Git LFS veikalā GitHub vai BitBucket.
PF1 -> Blob1PF2 -> Blob2
PF3 -> Blob3
Tagad, kad jūs strādājat ar Git repozitoriju, ikdienas darbībām tiks izmantoti vieglie PF faili. Lāpi tiks izgūti tikai nepieciešamības gadījumā. Piemēram, ja izrakstāties Commit C, tad Git LFS uzmeklēs PF3 rādītāju un lejupielādēs Blob3. Tātad darba krātuve būs mazāka, un sniegums būs labāks. Jums nav jāuztraucas par rādītāja failiem. Git LFS tos pārvaldīs aizkulisēs.
Git LFS instalēšana un palaišana
Iepriekš tika mēģināts atrisināt lielo failu Git lielo problēmu. Bet Git LFS ir izdevies, jo tas ir viegli lietojams. Jums vienkārši jāinstalē LFS un jāpasaka, kurus failus izsekot.
Git LFS var instalēt, izmantojot šādas komandas:
$ 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 install git-lfs
$ git lfs instalēt
Kad esat instalējis Git LFS, varat izsekot vēlamos failus:
$ git lfs celiņš "*.JPEG "Izsekošana "*.JPEG "
Rezultāts parāda, ka Git LFS izseko JPEG failus. Sākot izsekošanu ar LFS, jūs atradīsit .gitattributes fails, kurā būs ieraksts, kurā parādīti izsekotie faili. The .failā gitattributes tiek izmantots tāds pats apzīmējums kā .gitignore fails. Lūk, kā .gitattributes izskatās:
$ kaķis .gitattributes*.jpeg filtrs = lfs diff = lfs sapludināt = lfs -teksts
Izmantojot šo komandu, varat arī atrast, kuri faili tiek izsekoti:
$ git lfs traseUzskaitīto modeļu uzskaitīšana
*.JPEG (.gitattributes)
Ja vēlaties pārtraukt faila izsekošanu, varat izmantot šādu komandu:
$ git lfs untrack "*.JPEG "Notiek izsekošana "*.JPEG "
Vispārējām Git operācijām jums nav jāuztraucas par LFS. Tas automātiski nokārtos visus aizmugures uzdevumus. Kad esat iestatījis Git LFS, jūs varat strādāt ar krātuvi tāpat kā jebkurš cits projekts.
Turpmāka izpēte
Papildu tēmas skatiet šādos resursos:
- Git LFS repozitorija pārvietošana starp saimniekiem
- Vietējo Git LFS failu dzēšana
- Attālu Git LFS failu noņemšana no servera
- Git LFS vietne
- Git LFS dokumentācija
Atsauces:
- git-lfs.github.com: GitHub repo
- github.com / git-lfs / git-lfs / tree / master / docs: GitHub dokumentācija Git LFS
- atlassian.com / git / tutorials / git-lfs: Atlassian Tutorials
- youtube.com: Kas ir Git LFS
- youtube.com: Milzīgu failu izsekošana ar Git LFS, Tim Pettersen, Atlassian
- youtube.lv: milzīgu failu pārvaldīšana pareizajā krātuvē, izmantojot Git LFS, YouTube
- youtube.com: Git lielu failu glabāšana - kā strādāt ar lieliem failiem, YouTube
- askubuntu.com / questions / 799341: how-to-install-git-lfs-on-ubuntu-16-04
- github.com / git-lfs / git-lfs / blob / master / INSTALLING.md: Uzstādīšanas rokasgrāmata