Git

Git LFS

Git LFS
Git er blevet det de facto versionskontrolsystem for softwareudviklere over hele verden. Dette open source, distribuerede versionskontrolsystem er hurtigere end sine konkurrenter. Det er let at bruge til forgrening og fletning af kode. Det har dog et ydeevneproblem med store binære filer. Git Large File Storage (LFS) blev udviklet til at løse dette problem.

Problemet med stor fil i Git

Traditionelt har visse virksomheder og institutioner holdt sig væk fra Git på grund af ineffektiviteten i stor binær filhåndtering. Videospiludviklere og medievirksomheder skal håndtere komplekse strukturer, videoer i fuld bevægelse og lydfiler i høj kvalitet. Forskningsinstitutter skal holde styr på store datasæt, der kan være gigabyte eller terabyte. Git har svært ved at vedligeholde disse store filer.

For at forstå problemet skal vi se på, hvordan Git holder styr på filer. Når der er en forpligtelse, opretter Git en objektknude med en markør til sin forælder eller flere forældre. Git-datamodellen er kendt som den dirigerede acykliske graf (DAG). DAG-modellen sikrer, at forholdet mellem forældre og barn aldrig kan danne cykler.

Vi kan inspicere DAG-modelens indre funktion. Her er et eksempel på tre forpligtelser i et arkiv:

$ git log - online
2beb263 Forpligt C: tilføjet billede1.jpeg
866178e Forpligt B: tilføj b.txt
d48dd8b Forpligt A: tilføj en.txt

I Commit A og B tilføjede vi tekstfil a.txt og b.txt. Derefter i Commit C tilføjede vi en billedfil kaldet image1.jpeg. Vi kan visualisere DAG som følger:

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

Hvis vi inspicerer den sidste forpligtelse med følgende kommando:

$ git cat-file -p 2beb263
træ 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
forælder 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
forfatter Zak H 1513259427 -0800
kommitter Zak H 1513259427 -0800
Forpligt C: tilføjet billede 1.jpeg

Vi kan se, at Commit C (2beb263) har Commit B (866178e) som forælder. Hvis vi nu inspicerer træobjektet i Commit C (7cc17ba), kan vi se klatterne (binære store objekter):

$ git cat-file -p 7cc17ba
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 blob a44a66f9e06a8faf324d3ff3e11c9fa6966bfb56 image1.jpeg

Vi kan kontrollere størrelsen på billedblobben:

$ git cat-file -s a44a66f9e
871680

Git holder styr på ændringerne i denne træstruktur. Lad os foretage en ændring af billedet1.jpeg og tjek historikken:

$ git log - online
2e257db Forpligt D: ændret billede1.jpeg
2beb263 Forpligt C: tilføjet billede1.jpeg
866178e Forpligt B: tilføj b.txt
d48dd8b Forpligt A: tilføj en.txt

Hvis vi kontrollerer Commit D-objektet (2e257db):

$ git cat-file -p 2e257db
træ 2405fad67610acf0f57b87af36f535c1f4f9ed0d
forælder 2beb263523725e1e8f9d96083140a4a5cd30b651
forfatter Zak H 1513272250 -0800
kommitter Zak H 1513272250 -0800
Forpligt D: ændret billede 1.jpeg

Og træet (2405fad) inde i det:

$ git cat-file -p 2405fad
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 blob cb4a0b67280a92412a81c60df36a15150e713095 image1.jpeg

Bemærk, at SHA-1-hash til image1.jpeg er ændret. Det betyder, at det har skabt en ny klap til image1.jpeg. Vi kan kontrollere størrelsen på den nye klat:

$ git cat-file -s cb4a0b6
1063696

Her er en måde at visualisere ovenstående DAG-struktur på:

Forpligt D Forpligt C Forpligt B Forpligt A
| | | |
2e257db -> 2beb263 -> 866178e -> d48dd8b
| | | |
Tree4 Tree3 Tree2 Tree1
| | | |
Blobs Blobs Blobs Blobs

Hvert bindingsobjekt opretholder sit eget træ. Der opretholdes klatter inde i træet. Git optimerer plads ved at sikre, at den kun gemmer forskellene og bruger komprimering til opbevaring. Men for binære filændringer skal Git gemme hele filer i klatterne, fordi det er svært at bestemme forskellene. Også billed-, video- og lydfiler er allerede komprimeret. Som et resultat, for hver forekomst af en modificeret binær fil, ender træet med en stor klat.

Lad os tænke på et eksempel, hvor vi foretager flere ændringer i en 100 MB billedfil.

Forpligt C -> Forpligt B -> Forpligt A
| | |
Tree3 Tree2 Tree1
| | |
Blob3 Blob2 Blob1
300 MB 200 MB 100 MB

Hver gang vi ændrer filen, skal Git oprette en 100 MB blob. Så først efter 3 forpligtelser er Git-arkivet 300 MB. Du kan se, at størrelsen på Git-arkivet hurtigt kan sprænge. Fordi Git er en distribueret versionskontrol, skal du downloade hele arkivet til din lokale forekomst og arbejde meget med filialer. Så de store klatter bliver en præstationsflaskehals.

Git LFS løser problemet ved at erstatte klodserne med letvægtsmarkørfiler (PF) og skabe en mekanisme til at gemme klodser andetsteds.

Forpligt C -> Forpligt B -> Forpligt A
| | |
Tree3 Tree2 Tree1
| | |
PF3 PF2 PF1

Lokalt gemmer Git klatterne i Git LFS-cachen, og eksternt gemmer det dem i Git LFS-butikken på GitHub eller BitBucket.

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

Når du nu har at gøre med Git-arkivet, bruges de lette PF-filer til de rutinemæssige operationer. Klatterne hentes kun, når det er nødvendigt. For eksempel, hvis du afkaster Commit C, vil Git LFS slå op på PF3-markøren og downloade Blob3. Så arbejdsområdet vil være slankere, og ydeevnen bliver bedre. Du behøver ikke bekymre dig om markørfilerne. Git LFS administrerer dem bag kulisserne.

Installation og kørsel af Git LFS

Der har tidligere været forsøg på at løse problemet med Git-store filer. Men Git LFS er lykkedes, fordi det er let at bruge. Du skal bare installere LFS og fortælle det, hvilke filer der skal spores.

Du kan installere Git LFS ved hjælp af følgende kommandoer:

$ sudo apt-get install software-egenskaber-fælles
$ curl -s https: // packagecloud.io / install / repositories / github / git-lfs / script.deb.sh | sudo bash
$ sudo apt-get install git-lfs
$ git lfs installation

Når du har installeret Git LFS, kan du spore de ønskede filer:

$ git lfs-spor "*.jpeg "
Sporing "*.jpeg "

Outputtet viser dig, at Git LFS sporer JPEG-filerne. Når du begynder at spore med LFS, finder du en .gitattribut-fil, der har en post, der viser de sporede filer. Det .gitattributes-filen bruger den samme notation som .gitignore-fil. Her er hvordan indholdet af .gitattributter ser ud:

$ kat .gitattributter
*.jpeg filter = lfs diff = lfs fletning = lfs -tekst

Du kan også finde, hvilke filer der spores ved hjælp af følgende kommando:

$ git lfs spor
Notering af sporede mønstre
*.jpeg (.gitattributter)

Hvis du vil stoppe med at spore en fil, kan du bruge følgende kommando:

$ git lfs untrack "*.jpeg "
Sporing af "*.jpeg "

For generelle Git-operationer behøver du ikke bekymre dig om LFS. Det tager sig automatisk af alle backend-opgaver. Når du har konfigureret Git LFS, kan du arbejde på arkivet som ethvert andet projekt.


Yderligere studier

For mere avancerede emner, se på følgende ressourcer:

  • Flytning af Git LFS-lager mellem værter
  • Sletning af lokale Git LFS-filer
  • Fjernelse af eksterne Git LFS-filer fra serveren
  • Git LFS-websted
  • Git LFS-dokumentation

Referencer:

  • git-lfs.github.com: GitHub repo
  • github.com / git-lfs / git-lfs / tree / master / docs: GitHub-dokumentation til Git LFS
  • atlassisk.com / git / tutorials / git-lfs: Atlassian Tutorials
  • Youtube.com: Hvad er Git LFS
  • Youtube.com: Tracking Huge Files with Git LFS af Tim Pettersen, Atlassian
  • Youtube.com: Håndtering af store filer på den rigtige lagerplads med Git LFS, YouTube
  • Youtube.com: Git Large File Storage - Sådan arbejder du med store filer, YouTube
  • askubuntu.com / spørgsmål / 799341: Sådan installeres git-lfs-på-ubuntu-16-04
  • github.com / git-lfs / git-lfs / blob / master / INSTALLING.md: Installationsvejledning
Mus Remap dine museknapper forskelligt til anden software med X-Mouse Button Control
Remap dine museknapper forskelligt til anden software med X-Mouse Button Control
Måske har du brug for et værktøj, der kan ændre din muses kontrol med hver applikation, du bruger. Hvis dette er tilfældet, kan du prøve en applikatio...
Mus Microsoft Sculpt Touch Wireless Mouse Review
Microsoft Sculpt Touch Wireless Mouse Review
Jeg har for nylig læst om Microsoft Sculpt Touch trådløs mus og besluttede at købe den. Efter at have brugt det et stykke tid besluttede jeg at dele m...
Mus AppyMouse pegefelt på skærmen og musemarkør til Windows-tablets
AppyMouse pegefelt på skærmen og musemarkør til Windows-tablets
Tabletbrugere savner ofte musemarkøren, især når de er vante til at bruge bærbare computere. Touchscreen-smartphones og tablets har mange fordele, og ...