Поиск по сайту:

Как хранить большие файлы в Git


Git, а также такие сервисы, как Github, созданы и оптимизированы для легких текстовых файлов кода, и редко можно увидеть репозитории размером более нескольких ГБ. Но часто бывает полезно отслеживать большие файлы, и чтобы упростить эту задачу, Git предоставляет расширение Large File Storage (LFS).

Как работает хранилище больших файлов Git (LFS)

Git технически не имеет максимального размера файла, но он начинает ломаться, как только вы начинаете достигать определенного размера файлов. Github определяет этот максимум в 100 МБ на репозиторий.

Это мягкое ограничение сводится к тому, как Git хранит данные внутри. Несмотря на отображение пользовательских списков изменений, называемых различиями, Git на самом деле использует подход, основанный на моментальных снимках, для внутреннего хранения данных и использует его для восстановления различий, а не наоборот.

Это нормально для небольших объемов данных, но это означает, что при каждом изменении файла необходимо делать снимок, и поэтому, если файл очень большой, он может быстро занять много места. Git немного справляется с этим внутри с помощью «packfiles», которые могут выполнять некоторую сборку мусора, но проблема работы с большими файлами все еще остается.

Итак, было создано решение под названием Git Large File Storage (LFS). По сути, вместо того, чтобы хранить фактический файл в репозитории, Git LFS просто хранит указатель на то, где на самом деле находится этот файл. Когда ваш клиент Git хочет клонировать репозиторий или извлечь файл, он вместо этого загружает его из Git LFS.

Это означает, что вам больше не нужно загружать каждый версионный объект только для того, чтобы клонировать репозиторий. LFS значительно ускоряет запуск репозитория, потому что Git заботится только об указателе, который мал, и извлекает только те данные, которые ему нужны.

Основным недостатком является то, что теперь вы не можете использовать пакетные файлы, а это означает, что вам потребуется дополнительное хранилище для каждой копии файла. Но поскольку LFS позволяет вам иметь массивный репозиторий с оптимальным временем клонирования, это не влияет на опыт разработчиков.

Где можно использовать Git LFS?

Чтобы использовать его, вам понадобится сервер, настроенный на использование Git LFS. Это просто расширение Git, поэтому вам не нужно устанавливать дополнительное программное обеспечение или настраивать серверы для хранения данных.

Github поддерживает Git LFS, но разрешает только 10 ГБ на репозиторий. Это относится как к обычным репозиториям, так и к репозиториям LFS. Тем не менее, довольно легко приобрести больше данных в разделе «Настройки»> «Оплата», а 50 ГБ — это всего лишь дополнительные 4,20 доллара в месяц:

Вам также нужно будет заплатить за пропускную способность, поскольку при обновлении больших файлов создается копия файла, и вы должны отправить его целиком.

Если вы хотите разместить особенно большие репозитории и сделать это на своем собственном оборудовании, мы рекомендуем использовать самостоятельный Gitlab. Вы можете прочитать наше руководство по настройке личного экземпляра Gitlab, чтобы узнать больше.

Установка и использование Git LFS

Вам нужно будет загрузить и установить Git LFS с их веб-сайта.

Затем откройте Git или Git Bash в Windows и запустите команду установки, чтобы убедиться, что она работает:

git lfs install

Git LFS работает немного отдельно от самого Git. Он не отслеживает автоматически файлы больше определенного размера; вам нужно будет вручную добавить файлы в Git LFS, чтобы начать его использовать. Для этого вы можете использовать синтаксис подстановочных знаков:

git lfs track "*.dat"

Вы можете использовать ls-files и status для просмотра состояния самой подсистемы Git LFS:

git lfs ls-files
git lfs status

Миграция на Git LFS

Если вы переходите из существующего репозитория Git или случайно что-то зафиксировали без предварительного отслеживания в Git LFS, вам потребуется использовать инструмент migrate для переноса данных в LFS.

Например, импорт всех существующих файлов, соответствующих подстановочному знаку:

git lfs migrate import --include="*.mp4"

Или просто отправить все в LFS:

git lfs migrate import --everything

Возможно, вам придется выполнить git push --force, чтобы перезаписать историю веток.