11 KiB
Raw Permalink Blame History

Git и Git LFS

Зачем это нужно

Git нужен для контроля версий проекта, а Git LFS — для хранения больших бинарных файлов, которые плохо живут в обычном Git.

Для Unity-проекта это особенно важно по двум причинам:

  • Unity генерирует много локальных служебных файлов, которые нельзя коммитить в репозиторий
  • игровые проекты быстро накапливают тяжелые бинарные ассеты: исходники графики, звук, видео, 3D-модели и DCC-файлы

Что считать актуальной практикой для Unity-проекта

На момент проверки разумная базовая стратегия такая:

  • брать основу .gitignore из актуального github/gitignore/Unity.gitignore
  • хранить в Git только то, что действительно нужно для восстановления проекта
  • хранить в обычном Git текстовые Unity-ассеты, которые нормально диффятся
  • отдавать в Git LFS большие бинарные файлы и исходники из внешних инструментов

Для Unity это означает:

  • коммитить Assets/, Packages/ и ProjectSettings/
  • не коммитить Library/, Temp/, Logs/, Obj/, Build/, Builds/, UserSettings/ и похожие локальные артефакты
  • не отправлять в Git LFS подряд все файлы Unity
  • не отправлять в Git LFS .meta, .unity, .prefab, .mat, .anim, .controller, .asset, если они сериализуются в текст и нужны для diff/merge

Текущее состояние в проекте

На момент проверки в репозитории не найдено:

  • корневого .gitignore
  • корневого .gitattributes

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

Как установить Git

Если Git уже стоит, переходи к следующему разделу. Если нет:

  1. Установи Git for Windows.
  2. Проверь в терминале:
git --version

Как инициализировать репозиторий

В корне проекта выполни:

git init

После этого сразу настрой базовые данные пользователя, если они еще не заданы глобально:

git config user.name "Your Name"
git config user.email "you@example.com"

Какой .gitignore нужен Unity-проекту

За основу для Unity-проекта стоит брать актуальный шаблон Unity.gitignore из репозитория github/gitignore.

Минимальный обязательный набор исключений:

/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/[Ll]ogs/
/[Uu]ser[Ss]ettings/
/[Mm]emoryCaptures/
/[Rr]ecordings/
*.log
.vs/
.gradle/
ExportedObj/
*.csproj
*.sln
*.tmp
*.user
*.userprefs
*.pidb
*.pdb
*.mdb
*.opendb
*.VC.db
sysinfo.txt
mono_crash.*
*.apk
*.aab
*.unitypackage
/ServerData
/[Aa]ssets/StreamingAssets/aa*
/[Aa]ssets/AddressableAssetsData/link.xml*
/[Aa]ssets/Addressables_Temp*
/[Aa]ssets/AddressableAssetsData/*/*.bin*

Практический смысл такой:

  • служебные каталоги Unity и IDE не попадают в репозиторий
  • артефакты локальных билдов не засоряют историю
  • временные файлы Addressables и generated-файлы тоже не мешают

Как установить Git LFS

По официальной документации Git LFS устанавливается отдельно от Git, а затем один раз активируется:

git lfs install

Эту команду обычно достаточно выполнить один раз на учетную запись пользователя.

Какие файлы Unity-проекта стоит хранить в Git LFS

Главное правило:

  • в Git LFS уходят большие бинарные исходники и недиффуемые ассеты
  • в обычный Git остаются текстовые Unity-ассеты и проектная конфигурация

Хорошие кандидаты для LFS

Обычно имеет смысл начать с таких форматов:

git lfs track "*.psd"
git lfs track "*.psb"
git lfs track "*.ase"
git lfs track "*.aseprite"
git lfs track "*.blend"
git lfs track "*.fbx"
git lfs track "*.obj"
git lfs track "*.wav"
git lfs track "*.mp3"
git lfs track "*.ogg"
git lfs track "*.flac"
git lfs track "*.mp4"
git lfs track "*.mov"
git lfs track "*.avi"
git lfs track "*.tga"
git lfs track "*.exr"
git lfs track "*.tif"
git lfs track "*.tiff"

Что не стоит класть в LFS по умолчанию

Обычно не нужно отправлять в Git LFS:

  • *.meta
  • *.unity
  • *.prefab
  • *.mat
  • *.anim
  • *.controller
  • *.asset
  • *.cs
  • *.asmdef
  • *.json
  • Packages/manifest.json
  • Packages/packages-lock.json
  • ProjectSettings/*

Причина простая:

  • эти файлы должны нормально отслеживаться, сравниваться и ревьюиться как текст

Как настроить Git LFS для этого проекта

После git lfs install выбери форматы, которые реально используются в проекте, и включи для них tracking.

После этого обязательно добавь .gitattributes в репозиторий:

git add .gitattributes

Это важный момент по рекомендации GitHub:

  • .gitattributes нужно коммитить в сам репозиторий
  • не стоит полагаться на глобальный .gitattributes пользователя

Что особенно важно для Unity-команды

1. Не коммитить Library

Library/ занимает много места, зависит от локальной машины и пересобирается автоматически. Для Git это мусор.

2. Не отправлять в LFS весь Assets/

Это ухудшит diff, ревью и работу с merge. В LFS должны идти только крупные бинарные форматы.

3. Не трекать текстовые Unity-ассеты через LFS

Если проект использует нормальную текстовую сериализацию Unity, текстовые ассеты полезно хранить именно в обычном Git.

4. Настроить LFS до первого большого коммита

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

5. Держать Unity в режиме Visible Meta Files и Force Text

Для нормальной работы Git в Unity обычно нужна и базовая настройка редактора:

  • Version Control Mode: Visible Meta Files
  • Asset Serialization Mode: Force Text

Это дает два эффекта:

  • .meta файлы становятся предсказуемой частью проекта и не теряются между машинами
  • сцены, префабы, материалы и другие текстовые Unity-ассеты лучше подходят для diff и merge в обычном Git

Если большие файлы уже попали в обычный Git

Официальная рекомендация GitHub такая:

  1. Сначала настроить git lfs track.
  2. Затем убрать файл из обычного Git-индекса.
  3. После этого добавить его заново уже как LFS-объект.

Если большие бинарники уже лежат глубоко в истории, может понадобиться отдельная миграция истории через git lfs migrate.

Это уже не базовая настройка, а отдельная операция по очистке репозитория.

Минимальная практическая настройка для проекта

Для первого этапа достаточно:

  • инициализировать Git
  • создать корневой .gitignore на основе актуального Unity.gitignore
  • выполнить git lfs install
  • создать корневой .gitattributes
  • включить LFS только для действительно тяжелых бинарных форматов
  • сделать первый коммит базового состояния проекта

Как проверить, что всё настроено

  • git status работает в корне проекта
  • в корне проекта есть .gitignore
  • в корне проекта есть .gitattributes
  • git lfs install выполнен без ошибок
  • git lfs track создал или обновил .gitattributes
  • файлы вроде *.psd, *.fbx, *.wav попадают в LFS, если для них включён tracking
  • Library/, Temp/, Logs/, Builds/ и UserSettings/ не показываются в git status

Официальные источники