A Git nagy fájlproblémája
Hagyományosan bizonyos vállalatok és intézmények távol maradtak a Git-től a nagy bináris fájlkezelés hatékonyságának hiánya miatt. A videojáték-fejlesztőknek és a médiacégeknek összetett textúrákkal, teljes mozgású videókkal és kiváló minőségű audiofájlokkal kell megküzdeniük. A kutatóintézeteknek nyomon kell követniük a nagy adatkészleteket, amelyek gigabájt vagy terabájt lehet. Git nehezen tudja fenntartani ezeket a nagy fájlokat.
A probléma megértéséhez meg kell vizsgálnunk, hogy a Git hogyan követi nyomon a fájlokat. Valahányszor elkötelezettség van, Git létrehoz egy objektumcsomópontot egy mutatóval a szülőjéhez vagy több szülőjéhez. A Git adatmodell irányított aciklusos gráfként (DAG) ismert. A DAG-modell biztosítja, hogy a szülő-gyermek kapcsolat soha nem képezhet ciklust.
Ellenőrizhetjük a DAG modell belső működését. Íme egy példa a tároló három elkövetésére:
$ git log - online2beb263 Commit C: hozzáadott kép1.jpeg
866178e B kötelezettség: tegye hozzá b.txt
d48dd8b Commit A: adjon hozzá egy.txt
Az A és B kötelezettségvállalásba felvettük az a szöveges fájlt.txt és b.txt. Ezután a Commit C-ben felvettünk egy image1 nevű képfájlt.jpeg. A DAG-t az alábbiak szerint jeleníthetjük meg:
C kötelezettségvállalás B kötelezettségvállalás A kötelezettségvállalás A2beb263 -> 866178e -> d48dd8b
Ha az utolsó parancsot a következő paranccsal ellenőrizzük:
$ git macskafájl -p 2beb263fa 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
szülő 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
szerző Zak H
vállalkozó Zak H
Commit C: hozzáadott kép1.jpeg
Láthatjuk, hogy a Commit C-nek (2beb263) a Commit B (866178e) a szülője. Most, ha megvizsgáljuk a Commit C faobjektumát (7cc17ba), láthatjuk a foltokat (bináris nagy objektumok):
$ git macskafájl -p 7cc17ba100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 blob a44a66f9e06a8faf324d3ff3e11c9fa6966bfb56 image1.jpeg
Ellenőrizhetjük a kép foltjának méretét:
$ git macskafájl -s a44a66f9e871680
Git nyomon követi a fa szerkezetének változását. Módosítsuk a képet1.jpeg és ellenőrizze az előzményeket:
$ git log - online2e257db Commit D: módosított kép1.jpeg
2beb263 Commit C: hozzáadott kép1.jpeg
866178e B kötelezettség: írja be b.txt
d48dd8b Commit A: adjon hozzá egy.txt
Ha ellenőrizzük a Commit D objektumot (2e257db):
$ git macskafájl -p 2e257dbfa 2405fad67610acf0f57b87af36f535c1f4f9ed0d
szülő 2beb263523725e1e8f9d96083140a4a5cd30b651
szerző Zak H
vállalkozó Zak H
D követés: módosított kép1.jpeg
És a benne lévő fa (2405fad):
$ git macskafájl -p 2405fad100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.txt
100644 blob cb4a0b67280a92412a81c60df36a15150e713095 image1.jpeg
Figyelje meg, hogy az image1 SHA-1 kivonata.jpeg megváltozott. Ez azt jelenti, hogy új blobot hozott létre az image1 számára.jpeg. Ellenőrizhetjük az új folt méretét:
$ git cat-file -s cb4a0b61063696
Itt van egy módszer a fenti DAG szerkezet megjelenítésére:
Kötelezettségvállalás D Kötelezettségvállalás C Kötelezettségvállalás B kötelezettségvállalás A| | | |
2e257db -> 2beb263 -> 866178e -> d48dd8b
| | | |
Fa4 Fa3 Fa2 Fa1
| | | |
Blobs Blobs Blobs Blobs
Minden elkötelezett objektum fenntartja a saját fáját. A fák belsejében foltokat tartanak fenn. A Git úgy optimalizálja a helyet, hogy megbizonyosodik arról, hogy csak a különbségeket tárolja és tömörítést használ tárolásra. De a bináris fájlok megváltoztatásához a Gitnek teljes fájlokat kell tárolnia a foltokban, mert nehéz meghatározni a különbségeket. A kép-, video- és audiofájlok már tömörítve vannak. Ennek eredményeként a módosított bináris fájl minden egyes példányára a fa egy nagy blobra kerül.
Gondoljunk egy példára, ahol többször módosítunk egy 100 MB-os képfájlt.
Vállalás C -> Vállalás B -> Vállalás A| | |
Fa3 Fa2 Fa1
| | |
Blob3 Blob2 Blob1
300 MB 200 MB 100 MB
Minden alkalommal, amikor megváltoztatjuk a fájlt, Gitnek létre kell hoznia egy 100 MB-os blobot. Tehát csak 3 végrehajtás után a Git adattár 300 MB. Láthatja, hogy a Git adattár mérete gyorsan felrobbanhat. Mivel a Git egy elosztott verzióvezérlő, ezért az egész adattárat letölti a helyi példányra, és sokat dolgozik az ágakkal. Tehát a nagy foltok a teljesítmény szűk keresztmetszetévé válnak.
A Git LFS megoldja a problémát azáltal, hogy a foltokat könnyű pointer fájlokkal (PF) helyettesíti, és létrehoz egy mechanizmust a foltok máshol történő tárolására.
Vállalás C -> Vállalás B -> Vállalás A| | |
Fa3 Fa2 Fa1
| | |
PF3 PF2 PF1
A Git helyben tárolja a foltokat a Git LFS gyorsítótárban, és távolról a Git LFS áruházban tárolja őket a GitHub vagy a BitBucket oldalon.
PF1 -> Blob1PF2 -> Blob2
PF3 -> Blob3
Most, amikor a Git adattárral foglalkozik, a könnyű PF fájlokat fogják használni a rutin műveletekhez. A foltokat csak szükség esetén lehet letölteni. Például, ha a Commit C-t választja, akkor a Git LFS megkeresi a PF3 mutatót, és letölti a Blob3 szoftvert. Tehát a működő tárház karcsúbb lesz, és a teljesítmény jobb lesz. Nem kell aggódnia a mutatófájlok miatt. Git LFS fogja kezelni őket a kulisszák mögött.
A Git LFS telepítése és futtatása
Korábban megpróbálták megoldani a Git large file problémát. De a Git LFS sikeres volt, mert könnyen használható. Csak telepítenie kell az LFS-t és meg kell mondania, mely fájlokat kell nyomon követnie.
A Git LFS a következő parancsok segítségével telepíthető:
$ 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
A $ git lfs telepítése
A Git LFS telepítése után nyomon követheti a kívánt fájlokat:
$ git lfs track "*.jpeg "Követés "*.jpeg "
A kimenet megmutatja, hogy a Git LFS nyomon követi a JPEG fájlokat. Amikor elkezdi követni az LFS-t, megtalálja a .gitattributes fájlt, amelynek a nyomon követett fájlokat tartalmazó bejegyzése lesz. A .A gitattributes fájl ugyanazt a jelölést használja, mint a .gitignore fájl. Itt található a tartalom .gitattributes néz ki:
$ cat .gitattributes*.jpeg szűrő = lfs diff = lfs egyesítés = lfs -text
A következő paranccsal megtalálja a nyomon követett fájlokat is:
$ git lfs pályaA követett minták felsorolása
*.jpeg (.gitattributes)
Ha le akarja állítani a fájl nyomon követését, használhatja a következő parancsot:
$ git lfs untrack "*.jpeg "Követés visszavonása "*.jpeg "
Az általános Git műveletekhez nem kell aggódnia az LFS miatt. Automatikusan gondoskodik az összes háttérfeladatról. Miután beállította a Git LFS-t, úgy dolgozhat a táron, mint bármely más projekt.
A további vizsgálat
Haladóbb témákért keresse meg a következő forrásokat:
- Git LFS adattár mozgatása a gazdagépek között
- Helyi Git LFS fájlok törlése
- Távoli Git LFS fájlok eltávolítása a szerverről
- Git LFS webhely
- Git LFS dokumentáció
Referenciák:
- git-lfs.github.com: GitHub repo
- github.com / git-lfs / git-lfs / tree / master / docs: GitHub dokumentáció a Git LFS-hez
- atlassian.com / git / tutorials / git-lfs: Atlassian Tutorials
- Youtube.com: Mi a Git LFS
- Youtube.com: Hatalmas fájlok nyomon követése Git LFS segítségével Tim Pettersen, Atlassian
- Youtube.com: Hatalmas fájlok kezelése a megfelelő tárhelyen a Git LFS, a YouTube segítségével
- Youtube.com: Git Large File Storage - Hogyan kell dolgozni a nagy fájlokkal, YouTube
- askubuntu.com / questions / 799341: git-lfs-on-ubuntu-16-04 telepítése
- github.com / git-lfs / git-lfs / blob / master / TELEPÍTÉS.md: Telepítési útmutató