Расширение git lfs

2023-11-13 · 3 мин. для прочтения

Расширение для хранения больших бинарных файлов на git.

Содержание

1 Общая информация

2 Установка

2.1 Linux

  • Gentoo:
    emerge dev-vcs/git-lfs
    

3 Использование

3.1 Инициализация

  • Запускается однократно:
    git lfs install
    
  • Прописывает хуки и переменные в файл конфигурации.

3.2 Подготовка нового репозитория

  • После создания нового репозитория запустите в нём:
    git lfs install
    
  • При этом в репозитории появится специальный хук git pre-push, который будет передавать файлы git lfs на сервер при выполнении команды git push.
  • После инициализации хранилища git lfs для репозитория нужно указать, какие файлы нужно отслеживать, например:
    git lfs track "*.pdf"
    
  • Информация будет занесена в файл .gitattributes.
  • После любого вызова git-lfs-track или git-lfs-untrack необходимо зафиксировать изменения в файле .gitattributes:
    git add .gitattributes
    git commit -m "track *.pdf files using Git LFS"
    
  • Git lfs поддерживает те же шаблоны, что и .gitignore, например:
    # track all .ogg files in any directory
    $ git lfs track "*.ogg"
    
    # track files named music.ogg in any directory
    $ git lfs track "music.ogg"
    
    # track all files in the Assets directory and all subdirectories
    $ git lfs track "Assets/"
    
    # track all files in the Assets directory but *not* subdirectories
    $ git lfs track "Assets/*"
    
    # track all ogg files in Assets/Audio
    $ git lfs track "Assets/Audio/*.ogg"
    
    # track all ogg files in any directory named Music
    $ git lfs track "**/Music/*.ogg"
    
    # track png files containing "xxhdpi" in their name, in any directory
    $ git lfs track "*xxhdpi*.png"
    
  • Шаблоны задаются относительно каталога, из которого выполняется команда git lfs track.
  • В отличие от .gitignore, git lfs не поддерживает отрицательные шаблоны.

3.3 Миграция старых репозиториев

  • Если в истории вашего репозитория уже есть большие файлы, они не будут отслеживаться git lfs.
  • Чтобы перенести существующие большие файлы в вашей истории на использование git lfs, нужно провести миграцию:
    git lfs migrate import --include="*.pdf" --everything
    
  • Это перезапишет историю и изменит все идентификаторы объектов git в репозитории.
  • После этого придётся склонировать репозиторий повторно.

3.4 Обратная миграция

  • Репозиторий с git lfs можно преобразовать обратно в простой репозиторий git.
  • Следите за файлами, которые находятся в lfs:
    git lfs ls-files
    
  • Перенесите ссылки из git lfs в git (например, для pdf-файлов):
    git lfs migrate export --include="*.pdf" --everything
    
  • Это перезапишет историю и изменит все идентификаторы объектов git в вашем репозитории.
  • После этого придётся склонировать репозиторий повторно.
  • Удалите хуки:
    git lfs uninstall --worktree
    
  • Удалить атрибут lfs из .gitattributes:
    sed -i -e "s/filter=lfs diff=lfs merge=lfs -text/binary/g" .gitattributes
    

3.5 Мониторинг

  • Отображение полезной информацию о репозитории:
    git lfs env
    
  • Просмотр файлов под управлением git lfs:
    git lfs ls-files
    

3.6 Клонировании репозитория

  • Команда клонирования репозитория скачивает только файлы размером до 100MB.
  • Для получения больших файлов следует использовать команду:
    git lfs  pull
    

3.7 Перенос на другой хостинг

  • Для переноса репозитория git lfs на другой хостинг можно использовать комбинацию команд git lfs fetch и git lfs push с параметром --all.
  • Например, перенесём репозиторий с сервера github на сервер bitbucket:
    # create a bare clone of the GitHub repository
    $ git clone --bare git@github.com:kannonboy/atlasteroids.git
    $ cd atlasteroids
    
    # set up named remotes for Bitbucket and GitHub
    $ git remote add bitbucket git@bitbucket.org:tpettersen/atlasteroids.git
    $ git remote add github git@github.com:kannonboy/atlasteroids.git
    
    # fetch all Git LFS content from GitHub
    $ git lfs fetch --all github
    
    # push all Git and Git LFS content to Bitbucket
    $ git push --mirror bitbucket
    $ git lfs push --all bitbucket
    
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.