Git

Git LFS

Git LFS
Git се превърна в де факто системата за контрол на версиите за разработчици на софтуер по целия свят. Тази разпределена система за контрол на версиите с отворен код е по-бърза от своите конкуренти. Той е лесен за използване за разклоняване и обединяване на код. Той обаче има проблем с производителността на големи двоични файлове. Git Large File Storage (LFS) е разработен за справяне с този проблем.

Проблемът с големия файл в Git

Традиционно някои компании и институции стоят далеч от Git поради неефективността при обработката на големи двоични файлове. Разработчиците на видеоигри и медийните компании трябва да се справят със сложни текстури, видеоклипове с пълно движение и висококачествени аудио файлове. Изследователските институти трябва да следят големи масиви от данни, които могат да бъдат гигабайта или терабайта. Git има затруднения с поддържането на тези големи файлове.

За да разберем проблема, трябва да разгледаме как Git следи файловете. Винаги, когато има фиксиране, Git създава обект възел с указател към неговия родител или няколко родители. Моделът на данни Git е известен като насочена ациклична графика (DAG). Моделът DAG гарантира, че връзката родител-дете никога не може да формира никакви цикли.

Можем да инспектираме вътрешната работа на модела DAG. Ето пример за три фиксации в хранилище:

$ git log --oneline
2beb263 Ангажиране C: добавено изображение1.jpeg
866178e Фиксиране B: добавяне на b.текст
d48dd8b Ангажиране A: добавяне на a.текст

В ангажимент A и B добавихме текстов файл a.txt и b.текст. След това в Comm C добавихме файл с изображение, наречен image1.jpeg. Можем да визуализираме DAG, както следва:

Фиксиране C Фиксиране B Фиксиране A
2beb263 -> 866178e -> d48dd8b

Ако проверим последния коммит със следната команда:

$ git cat-file -p 2beb263
дърво 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
родител 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
автор Zak H 1513259427 -0800
комисар Zak H 1513259427 -0800
Ангажиране C: добавено изображение1.jpeg

Виждаме, че фиксирането C (2beb263) има ангажимент B (866178e) като родител. Сега, ако проверим дървесния обект на Comm C (7cc17ba), можем да видим петна (двоични големи обекти):

$ git cat-file -p 7cc17ba
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.текст
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.текст
100644 blob a44a66f9e06a8faf324d3ff3e11c9fa6966bfb56 image1.jpeg

Можем да проверим размера на петно ​​на изображението:

$ git cat-file -s a44a66f9e
871680

Git следи промените в тази дървовидна структура. Нека направим модификация на изображението1.jpeg и проверете историята:

$ git log --oneline
2e257db Фиксиране D: модифицирано изображение1.jpeg
2beb263 Ангажиране C: добавено изображение1.jpeg
866178e Фиксиране B: добавете b.текст
d48dd8b Ангажиране A: добавяне на a.текст

Ако проверим фиксирането на обекта D (2e257db):

$ git cat-file -p 2e257db
дърво 2405fad67610acf0f57b87af36f535c1f4f9ed0d
родител 2beb263523725e1e8f9d96083140a4a5cd30b651
автор Zak H 1513272250 -0800
комисар Zak H 1513272250 -0800
Задайте D: модифицирано изображение1.jpeg

И дървото (2405fad) вътре в него:

$ git cat-file -p 2405fad
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.текст
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b.текст
100644 blob cb4a0b67280a92412a81c60df36a15150e713095 image1.jpeg

Забележете, че хеш SHA-1 за image1.jpeg се промени. Това означава, че е създал нов blob за image1.jpeg. Можем да проверим размера на новото петно:

$ git cat-file -s cb4a0b6
1063696

Ето начин за визуализиране на горната структура на DAG:

Фиксиране D Фиксиране C Фиксиране B Фиксиране A
| | | |
2e257db -> 2beb263 -> 866178e -> d48dd8b
| | | |
Tree4 Tree3 Tree2 Tree1
| | | |
Blobs Blobs Blobs Blobs

Всеки обект на фиксиране поддържа собствено дърво. Blobs се поддържат вътре в това дърво. Git оптимизира пространството, като се увери, че съхранява само разликите и използва компресия за съхранение. Но за промени в двоични файлове, Git трябва да съхранява цели файлове в петна, защото е трудно да се определят разликите. Също така файловете с изображения, видео и аудио вече са компресирани. В резултат на това за всеки екземпляр на модифициран двоичен файл дървото завършва с голямо петно.

Нека помислим за пример, при който правим множество промени в файл с изображение от 100 MB.

Фиксиране C -> Фиксиране B -> Фиксиране A
| | |
Tree3 Tree2 Tree1
| | |
Blob3 Blob2 Blob1
300 MB 200MB 100MB

Всеки път, когато сменяме файла, Git трябва да създаде 100 MB blob. Така че само след 3 фиксации, хранилището на Git е 300 MB. Можете да видите, че размерът на хранилището на Git може бързо да се взриви. Тъй като Git е разпределен контрол на версиите, ще изтеглите цялото хранилище на вашия локален екземпляр и ще работите много с клонове. Така големите петна се превръщат в пречка за изпълнение.

Git LFS решава проблема, като замества петна с леки файлове с указатели (PF) и създава механизъм за съхраняване на петна на друго място.

Фиксиране C -> Фиксиране B -> Фиксиране A
| | |
Tree3 Tree2 Tree1
| | |
PF3 PF2 PF1

Локално Git съхранява петна в кеша на Git LFS и дистанционно ще ги съхранява в магазина Git LFS на GitHub или BitBucket.

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

Сега, когато имате работа с хранилището на Git, леките PF файлове ще се използват за рутинните операции. Blobs ще бъдат извлечени само когато е необходимо. Например, ако платите за ангажиране C, тогава Git LFS ще търси показалеца PF3 и ще изтегли Blob3. Така че работещото хранилище ще бъде по-малко и производителността ще бъде по-добра. Не е нужно да се притеснявате за файловете с указатели. Git LFS ще ги управлява зад кулисите.

Инсталиране и стартиране на Git LFS

Имаше предишни опити за решаване на проблема с големи файлове на Git. Но Git LFS успя, защото е лесен за използване. Просто трябва да инсталирате LFS и да му кажете кои файлове да проследявате.

Можете да инсталирате Git LFS, като използвате следните команди:

$ sudo apt-get инсталиране на софтуер-свойства-общи
$ curl -s https: // packagecloud.io / install / repositories / github / git-lfs / script.деб.ш | судо баш
$ sudo apt-get install git-lfs
$ git lfs инсталиране

След като инсталирате Git LFS, можете да проследявате файловете, които искате:

$ git lfs track "*.jpeg "
Проследяване "*.jpeg "

Резултатът ви показва, че Git LFS проследява JPEG файловете. Когато започнете да проследявате с LFS, ще намерите a .gitattributes файл, който ще има запис, показващ проследяваните файлове. The .Файлът gitattributes използва същата нотация като .gitignore файл. Ето как съдържанието на .gitattributes изглежда:

$ котка .gitattributes
*.jpeg филтър = lfs diff = lfs merge = lfs -text

Можете също така да намерите кои файлове се проследяват, като използвате следната команда:

$ git lfs track
Изброяване на проследени модели
*.jpeg (.gitattributes)

Ако искате да спрете проследяването на файл, можете да използвате следната команда:

$ git lfs unrack "*.jpeg "
Разследване "*.jpeg "

За общи Git операции не е нужно да се притеснявате за LFS. Той ще се погрижи автоматично за всички бекенд задачи. След като настроите Git LFS, можете да работите върху хранилището като всеки друг проект.


Допълнително проучване

За по-напреднали теми разгледайте следните ресурси:

  • Преместване на Git LFS хранилище между хостове
  • Изтриване на локални Git LFS файлове
  • Премахване на отдалечени Git LFS файлове от сървъра
  • Уебсайт на Git LFS
  • Документация на Git LFS

Препратки:

  • git-lfs.github.com: GitHub репо
  • github.com / git-lfs / git-lfs / tree / master / docs: GitHub документация за Git LFS
  • атласки.com / git / tutorials / git-lfs: Инструкции за Atlassian
  • YouTube.com: Какво е Git LFS
  • YouTube.com: Проследяване на огромни файлове с Git LFS от Тим ​​Петтерсен, Atlassian
  • YouTube.com: Управление на огромни файлове в правилното хранилище с Git LFS, YouTube
  • YouTube.com: Съхранение на големи файлове Git - Как да работим с големи файлове, YouTube
  • askubuntu.com / questions / 799341: как да инсталирате-git-lfs-on-ubuntu-16-04
  • github.com / git-lfs / git-lfs / blob / master / ИНСТАЛИРАНЕ.md: Ръководство за инсталиране
Как да изтеглите и пуснете Civilization VI на Сид Майер на Linux
Въведение в играта Civilization 6 е модерен поглед върху класическата концепция, въведена в поредицата от игрите Age of Empires. Идеята беше доста про...
Как да инсталирате и играете Doom на Linux
Въведение в Doom Серията Doom възниква през 90-те години след пускането на оригиналния Doom. Това беше незабавен хит и от този момент нататък серията ...
Vulkan за потребители на Linux
С всяко ново поколение графични карти виждаме, че разработчиците на игри преместват границите на графичната вярност и се приближават една крачка до фо...