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 구성 변경
- 편집기 설정창을 오픈 :
Edit > Project Settings > Editor - 깨진 개체참조 방지를 위해 메타파일 표시변경 :
> Version Control / Mode: Visible Meta Files - 병합충돌을 위해 텍스트 직렬화 사용 :
> Asset Serialization / Mode: Force Text - 변경사항 저장 :
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 :