When

원할한 협업을 위해 유니티를 Git으로 관리 하고자 할 때

Why

기본적으로 Unity는 Git과 사용할 때 몇가지 문제에 직면하게 된다.

What


- Temp파일 : 유니티 에디터는 열고 닫는것 만으로 수백개의 임시파일이 생성,수정,삭제 되며 
  여러 플랫폼에서 빌드 할 수 있기 때문에 프로젝트에 관련없는 파일이 생성될 수 있다.

- 깨진 참조 : 유니티는 Meta파일을 통해 무작위로 생성된 GUID를 사용하여 개체를 
  추적하기 때문에 Git으로 제대로 커밋되지 않은 경우 프로젝트에 잠재적인 버그를 유발한다.

- 병합 충돌 : 유니티 에디터는 바이너리 형식으로 파일을 저장하기 때문에 사용자가 
  병합관리 하기 힘들다.
- 대용량 파일 : 3D모델, 사운드, 이미지, 글꼴에 따른 대용량 에셋이 필요하기때문에 
  Git워크 플로우가 느려질 수 있다.
  

How

Unity 전용 .gitignore 설정 추가

  • GitIgnore.IO에서 Unity를 입력하고 생성하면 아래와 같은 내용이 생성되므로 .gitignore파일에 추가하여 준다.

# Created by https://www.toptal.com/developers/gitignore/api/unity
# Edit at https://www.toptal.com/developers/gitignore?templates=unity

### Unity ###
# This .gitignore file should be placed at the root of your Unity project directory
#
# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/[Ll]ogs/
/[Uu]ser[Ss]ettings/

# MemoryCaptures can get excessive in size.
# They also could contain extremely sensitive data
/[Mm]emoryCaptures/

# Recordings can get excessive in size
/[Rr]ecordings/

# Uncomment this line if you wish to ignore the asset store tools plugin
# /[Aa]ssets/AssetStoreTools*

# Autogenerated Jetbrains Rider plugin
/[Aa]ssets/Plugins/Editor/JetBrains*

# Visual Studio cache directory
.vs/

# Gradle cache directory
.gradle/

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.mdb
*.opendb
*.VC.db

# Unity3D generated meta files
*.pidb.meta
*.pdb.meta
*.mdb.meta

# Unity3D generated file on crash reports
sysinfo.txt

# Builds
*.apk
*.aab
*.unitypackage
*.app

# Crashlytics generated file
crashlytics-build.properties

# Packed Addressables
/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*

# Temporary auto-generated Android Assets
/[Aa]ssets/[Ss]treamingAssets/aa.meta
/[Aa]ssets/[Ss]treamingAssets/aa/*

# End of https://www.toptal.com/developers/gitignore/api/unity


버전관리를 위한 Unity 구성 변경

  1. 편집기 설정창을 오픈 : Edit > Project Settings > Editor
  2. 깨진 개체참조 방지를 위해 메타파일 표시변경 : > Version Control / Mode: Visible Meta Files
  3. 병합충돌을 위해 텍스트 직렬화 사용 : > Asset Serialization / Mode: Force Text
  4. 변경사항 저장 : File > Save Project
  • 위 변경사항이 아래 에셋파일에 구성됨
ProjectSettings/EditorSettings.asset
  m_ExternalVersionControlSupport: Visible Meta Files
  m_SerializationMode: 2


Git 대용량 파일 스토리지 사용

GitHub 또는 Git LFS API를 지원하는 서버의 경우에만 작동하므로 확인후 아래내용 참고
GitAttributes를 사용하여 경로별 git이 다루는 설정과 파일별 Merge전략을 설정한다.

  • .gitattributes 파일을 생성후 아래 내용을 저장한다.
## Unity ##

*.cs diff=csharp text
*.cginc text
*.shader text

*.mat merge=unityyamlmerge eol=lf
*.anim merge=unityyamlmerge eol=lf
*.unity merge=unityyamlmerge eol=lf
*.prefab merge=unityyamlmerge eol=lf
*.physicsMaterial2D merge=unityyamlmerge eol=lf
*.physicMaterial merge=unityyamlmerge eol=lf
*.asset merge=unityyamlmerge eol=lf
*.meta merge=unityyamlmerge eol=lf
*.controller merge=unityyamlmerge eol=lf


## git-lfs ##

#Image
*.jpg filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.gif filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
*.ai filter=lfs diff=lfs merge=lfs -text

#Audio
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.ogg filter=lfs diff=lfs merge=lfs -text

#Video
*.mp4 filter=lfs diff=lfs merge=lfs -text
*.mov filter=lfs diff=lfs merge=lfs -text

#3D Object
*.FBX filter=lfs diff=lfs merge=lfs -text
*.fbx filter=lfs diff=lfs merge=lfs -text
*.blend filter=lfs diff=lfs merge=lfs -text
*.obj filter=lfs diff=lfs merge=lfs -text

#ETC
*.a filter=lfs diff=lfs merge=lfs -text
*.exr filter=lfs diff=lfs merge=lfs -text
*.tga filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.dll filter=lfs diff=lfs merge=lfs -text
*.unitypackage filter=lfs diff=lfs merge=lfs -text
*.aif filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.rns filter=lfs diff=lfs merge=lfs -text
*.reason filter=lfs diff=lfs merge=lfs -text
*.lxo filter=lfs diff=lfs merge=lfs -text

#Linguist
*.asset linguist-generated
*.mat linguist-generated
*.meta linguist-generated
*.prefab linguist-generated
*.unity linguist-generated

결론

여기까지 설정하면 상기 What에 기재한 내용은 해결할 수 있다.
하지만 유니티가 생성한 YAML파일 간의 병합충돌을 매번 수동으로 해결하는 것은 어렵기 때문에
Smart Merge를 사용하면
어느정도 커버할 수 있다.

Ref :