262 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. Проверь в терминале:
```powershell
git --version
```
## Как инициализировать репозиторий
В корне проекта выполни:
```powershell
git init
```
После этого сразу настрой базовые данные пользователя, если они еще не заданы глобально:
```powershell
git config user.name "Your Name"
git config user.email "you@example.com"
```
## Какой `.gitignore` нужен Unity-проекту
За основу для Unity-проекта стоит брать актуальный шаблон `Unity.gitignore` из репозитория `github/gitignore`.
Минимальный обязательный набор исключений:
```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, а затем один раз активируется:
```powershell
git lfs install
```
Эту команду обычно достаточно выполнить один раз на учетную запись пользователя.
## Какие файлы Unity-проекта стоит хранить в Git LFS
Главное правило:
- в `Git LFS` уходят большие бинарные исходники и недиффуемые ассеты
- в обычный Git остаются текстовые Unity-ассеты и проектная конфигурация
### Хорошие кандидаты для LFS
Обычно имеет смысл начать с таких форматов:
```powershell
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` в репозиторий:
```powershell
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`
## Официальные источники
- https://github.com/github/gitignore/blob/main/Unity.gitignore
- https://git-lfs.com/
- https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-git-large-file-storage
- https://docs.github.com/articles/configuring-git-large-file-storage?platform=windows
- https://docs.github.com/en/repositories/working-with-files/managing-large-files/moving-a-file-in-your-repository-to-git-large-file-storage
- https://learn.unity.com/tutorial/working-with-unity-and-github
- https://learn.unity.com/course/collaborate-with-github-desktop/tutorial/set-up-git-lfs-to-manage-large-files-in-unity?version=6.2