Работа с Git в Unity

git_unity

Git — это бесплатная система контроля версий с открытым исходным кодом, которая позволяет легко отслеживать изменения в проектах и облегчает взаимодействие между разработчиками, дизайнерами и другими участниками разработки. Её используют более 69% компаний в индустрии, а недавние улучшения в Git заставляет всё больше студий разработчиков игр переходить на неё с Perforce и Subversion. Эта статья научит вас вести проект на Unity с Git и отслеживать большие ассеты, такие как текстуры и аудио эффекты, а так же размещать и компилировать ваш код с помощью аккаунтов на Bitbucket и Unity Cloud Build.

Unity .gitignore

Unity и IDE для написания скриптов, такие как MonoDevelop, Consulo, Rider и Visual Studio — создают временные файлы, ассеты и логи, которые не подходят для проверки в системе контроля версий. Отслеживание этих файлов в Git увеличивает размер вашего репозитория и может привести к множеству конфликтов, когда несколько разработчиков работают над одним и тем же проектом. Вы можете научить Git игнорировать эти файлы, проверяя специальный файл .gitignore в каталоге вашего проекта.

Файл составлен на основе Unity .gitignore с gitignore.io, с некоторыми дополнениями.

Этот файл .gitignore должен находится в директории вашей Unity игры, даже если это не каталог верхнего уровня вашего Git репозитория.

Так же стоит добавить .gitignore для файлов операционной системы, если вы его ещё не добавили.

Настройки Unity для Git.

Unity имеет несколько настроек, Version Control Mode и Asset Serialization Mode, это сцены, префабы и мета файлы, которые будут записаны на диск в более подходящем для Git формате:

Перейдите в меню Edit > Project Settings > Editor и установите:

Version Control > Mode — Visible Meta Files
Это позволит Unity записывать .meta файлы как обычные, а не скрытые.

Asset Serialization > Mode — Force Text
Это позволит Unity сериализовать файлы генерируемые в процессе работы как YAML (текст), а не как бинарный формат. Текстовый формат файлов повышает шанс на успех автоматического слияния изменений, сделанных несколькими разработчиками, так как никогда нельзя слить несколько изменений в двоичный файл не получив конфликт.

После того, как вы включили эти настройки, вы должный сохранить свой проект и зафиксировать изменения в репозитории. Ваши настройки будут сохранены в ProjectSettings/EditorBuildSettings.asset и распространятся как часть вашего репозитория, так что другим разработчикам в вашей команде не нужно будет делать те же изменения.

Обработка больших ассетов Unity в Git.

Git — это распределённая система контроля версий, а это значит, всю историю вашего репозитория (каждая версия каждого ассета) копируется с сервера во время клонирования. Это проблематично, если вы хотите хранить версии больших ассетов, таких как спрайты, текстуры с высоким разрешением, музыку, сложные модели вместе с вашим исходным кодом. Один атлас спрайтов на 10mb можнт показаться не таким большим когда вы первый раз коммитите его, но каждый раз когда вы его изменяете, другой спрайт на 10mb добавляется в репозиторий, что означает, дополнительные 10mb для тех, кто захочет скачать этот репозиторий.

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

После того, как вы установите Git LFS, используйте команду git lfs track, что бы сообщить git какие файлы отслеживать с LFS. Эта команда добавит новый фильтр к вашему .gitattributes файлу. В .gitattributes перечислены файлы которые после коммита будут распространятся с вашим репозиторием. Так же вы можете добавить свои собственные типы файлов, хорошее правило — это отслеживать с помощью LFS  все файлы размером больше 500Kb, или вы можете создать файл .gitattributes в корневом каталоге вашего репазитория и скопировать этот текст внутрь:

Основано на Unity .gitattributes, от nemotoo, с некоторыми дополнениями.

Обратите внимание, вы так же можете создавать шаблоны на основе групп символов или имён каталогов, например git lfs track «Assets/Textures» — но это не очень хорошая идея, потому что это приводит к тому, что .meta файлы так же станут отслеживаться с помощью LFS.

Объединения ассетов игры с Unity SmartMerge.

После того, как вы установили Asset Serialization в режим Force Text, Git сможет объединять некоторые изменения, сделанные разными разработчиками для файлов .scene и .prefab. Но не переживайте, если вы всё ещё видите конфликты слияния: для Git и Unity есть инструмент SmartMerge.

Что бы включить SmartMerge вам нужно добавить следующий код в свои настройки Git. Чтобы включить SmartMerge только для одного репозитория, добавьте код в файл .git/config в каталоге верхнего уровня репозитория. Что бы включить SmartMerge для всех репозиториев в вашей системе, вам нужно вам нужно добавить его в глобальные настройки Git. Они находятся в разных местах, обычно это ~/.gitconfig для OS X и Linux, но вы можете просто запустить настройки git config —global -e, что бы открыть их в редакторе системы.

В ОС Windows замените ‘/Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge’ на: ‘C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe’ или на тот путь, куда вы установили Unity.

Быстро объясним значение свойств:

  • cmd = … путь и аргументы используются для UnityYAMLMerge (двоичный код который реализует SmartMerge).
  • trustExitCode = false означает, что Git не использует код выхода из UnityYAMLMerge, что бы определить было ли слияние успешным.
  • keepTemporaries = true даёт возможность Git сохранять временные файлы, которые полезны для отладки, если UnityYAMLMerge завершается с ошибкой.
  • keepBackup = false означает, что Git игнорирует резервные файлы .scene.orig или .prefab.orig после разрешения конфликта. Так как достаточно часто несколько разработчиков работает на одной и той же сцене, что приводит к большому количеству бесполезных резервных копий в вашем репозитории. Лучше отказаться от них автоматически. Вы всегда сможете восстановить их вручную, если вам будет нужно.

В следующий раз когда вы столкнётесь с конфликтом, который Git не сможет разрешить автоматически, выполните следующую команду:

И SmartMerge будет разрешать его самостоятельно. Например:

Обратите внимание, Git иногда думает, что файл не изменился, хотя на самом деле конфликты были успешно разрешены. Что бы проверить, попробуйте открыть конфликтный файл в Unity. Если файл на самом деле не изменился, и всё ещё есть маркеры конфликта, файл не сможет открыться. Если он успешно открывается, вы можете проверить результат слияния в инспекторе Unity, а затем сделать коммит в обычном режиме.

Миграция Unity проектов с других систем контроля версий.

Вне зависимости от вашего инструментария, вы, конечно не первый человек, который хочет перейти от текущей системы контроли версий на Git: существуют импортеры практически для любой системы контроля версий. Преимуществом использования импортера является возможность сохранения истории коммитов и ветвей при переходе на Git. Atlassian содержит руководства по переходу с SVN на Git и по переходу с Perforce на Git, так же есть много других руководств и инструментов для других систем контроля версий, которые можно легко найти с помощью Google.

Если в вашей истории управления версиями есть большие ассеты, они так же будут преобразованы в Git формат вместе с остальными файлами проекта и храниться в вашем репозитории. Как уже говорилось выше, это может привести к увеличению объема репозитория. Что бы сделать ваш репозиторий меньше, вы должны переписать историю для использования Git LFS для отслеживания этих крупных ассетов. Если вы переходите с Perforce, Git LFS поддерживает актуальную сборку через git p4 command. Если вы переходите с SVN (или других систем контроля версий), вам как правило требуется перенести вашу историю в Git LFS после первоначальной миграции на Git с помощью такого инструмента как git-lfs-migrate.

Хостинг и сборка вашего Unity проекта.

Git распределяется таким образом, что вы всегда будете иметь полную историю вашего проекта на локальном компьютере, но вы всё ещё будете нуждаться в централизованном узле для резервного копирования вашего репозитория и удобства взаимодействия с вашей командой. BitBucket предлагает неограниченные частные репозитории с поддержкой Git LFS и бесплатен для пяти пользователей, что делает его идеальным для многих инди студий. Хотя много студий ААА класса, таких как Ubisoft и SEGA тоже используют Bitbucket для разработки.

Вы можете попробовать BitBucket бесплатно, или посмотреть полное руководство по настройке Unity проекта для BitBucket, вы можете изучить официальное руководство о том как начать работу в Unity c BitBucket и SourceTree.

Ещё одним преимуществом хостинга вашей игры на BitBucket является лёгкая интеграция вашего проекта с Unity Cloud Build. Unity Cloud Build — это бесплатный сервис, который отслеживает ваш репозиторий на BitBucket и создаёт сборку игры для вашей целевой платформы, когда новые изменения добавляются в репозиторий и автоматически присылает вам ссылку на скачивание собранной игры.

Unity Cloud Build поддерживает все популярные настольные и мобильные платформы. 

Это облегчает обмен новыми версиями игры с пользователями, так как им больше не нужно будет скачивать исходники и делать свои сборки. Кроме того, если вы работаете над играми для мобильных устройств, вы можете просто установить их непосредственно из Unity Cloud Build, а не загружать apk файлы или возиться с Xcode.

Для начала работы с Unity Cloud Build и Bitbucket, посмотрите официальный учебник на Unity3d.com: ваш первый Cloud Build проект.

Или если вы чувствуете себя уверенным разработчиком, сразу подключите Unity Cloud Build для вашего проекта — это не сложно. Просто введите URL Bitbucket репозитория (например https://bitbucket.org/tpettersen/spaceshooter) в качестве сервера URL при настройке первой сборки, а затем скопировать и вставить сгенерированный Unity Cloud Build SSH ключ в ваш Bitbucket аккаунт при появлении соответствующего запроса. Если вы планируете использовать Git LFS вам необходимо добавить ключ SSH в качестве ключа общего пользования.

Я надеюсь, что данное руководство окажется полезным для вас.

Оригинал.