본문 바로가기

git

Unity git 시작 & UnityYAMLMerge

git으로 Unity 프로젝트를 관리할 때 여러 사람이 Scene이나 Prefab 등을 수정하면 골치가 아파진다. 이런 Asset들을 그냥 git 기본 설정대로 텍스트 파일처럼 merge하면 unity에서 읽을 수 없게 될 수도 있기 때문이다. 그래서 Unity에서 제공하는 UnityYAMLMerge라는 공식 merge tool을 사용해야 Scene이랑 Prefab을 제대로 merge할 수 있다. 이 과정은 각 프로젝트마다 해줘야 한다.

 

먼저 Unity를 킨 다음 Edit -> Project Settings... -> Editor로 들어간 후 Version Control의 Mode를 Visible Meta Files, Asset Serialization의 Mode를 Force Text로 설정한다. 이 과정을 거쳐야 git에서 meta 파일들을 관리할 수 있고 Asset들을 YAML 형식으로 저장해 UnityYAMLMerge로 merge할 수 있다.

 

그 후 공식 documentation의 git 항목에 써져있는 걸 (차이는 없는걸로 알고 있지만 혹시 모르니까 자기 Unity 버전에 맞는 doc을 보자) .gitconfig 파일에 추가한다. .gitconfig 파일은 .git 폴더의 config 파일을 직접 열어서 편집해도 되지만 아래 명령어를 이용해 .gitconfig 파일을 콘솔에서 열 수도 있다.

git config --local -e

이때 <path to UnityYAMLMerge>는 UnityYAMLMerge의 경로로 바꿔줘야 한다. Unity Hub를 쓴다면 C:\\Program Files\\Unity\\Hub\\Editor\\(유니티 버전)\\Editor\\Data\\Tools\\UnityYAMLMerge.exe, Unity Hub를 안 쓴다면 C:\\Program Files\\Unity\\Editor\\Data\\Tools\\UnityYAMLMerge.exe일 것이다. 이 과정을 통해 git에 UnityYAMLMerge를 merge tool에 추가할 수 있다.

 

merge tool에 UnityYAMLMerge를 추가했다고 자동으로 되는건 아니다. git보고 UnityYAMLMerge를 사용할 파일들을 알려줘야 한다. .gitattributes 파일을 이용하면 git이 각 파일을 어떻게 다뤄야 하는지 지정할 수 있다. 이 파일은 .gitconfig 파일과 달리 그냥 루트 폴더에 .gitattributes라는 파일을 만들면 된다.

*.cs diff=csharp text
*.cginc text
*.shader text
*.unity merge=unityyamlmerge eol=lf
*.prefab merge=unityyamlmerge eol=lf
*.mat -merge eol=lf
*.anim -merge eol=lf
*.physicMaterial -merge eol=lf
*.physicsMaterial2D -merge eol=lf
*.asset -merge eol=lf
*.meta -merge eol=lf
*.controller -merge eol=lf
*.spriteatlas -merge eol=lf

위 내용을 .gitattributes 파일에 추가한다.

1줄은 Unity에서 사용하는 C# 언어로 된 코드의 diff를 보여줄 때 diff가 발생한 함수 등을 보여주게 만든다.

2~3줄은 Unity의 셰이더 파일을 텍스트 파일로 취급하게 만든다. 얘들은 사실상 코드라서 텍스트 취급을 해줘도 된다.

4~5줄이 지금까지 계속 설명한 UnityYAMLMerge를 이용해서 Scene(*.unity)이나 Prefab(*.prefab)파일을 merge하라고 설정하는 부분이다. 인터넷에서 UnityYAMLMerge를 검색해보면 다른 사람들은 6~13줄도(즉, *.mat, *.anim, *.asset 등의 다른 파일들도) UnityYAMLMerge를 이용해서 merge하고 해놨는데, UnityYAMLMerge는 공식 documentation에 따르면 Scene이나 Prefab파일만 merge할 수 있다. 공식 documentation의 Mercurial, TortoiseGit, PlasticSCM 항목을 보면 Scene이랑 Prefab 파일만 설정하는 것을 볼 수 있다. 하지만 *.mat, *.anim, *.asset 등의 다른 파일들도 Scene이나 Prefab처럼 merge하면 안 되는 텍스트 파일이기 때문에 -merge로 git이 merge를 시도하지 않도록 설정해놨다. 참고로 -mergemerge=binary랑 같은 설정이다.

그리고 eol=lf은 UnityYAMLMerge랑 관계없는 부분인데, 줄바꿈 문자를 LF로 고정하는 설정이다. 기본설정대로 놔두면 git은 Windows에서 줄바꿈 문자를 CRLF로 고정하려 하고, Unity는 줄바꿈 문자를 LF로 고정하려 한다. 그래서 둘이 계속 줄바꿈 문자를 바꾸면서 쓸데없는 diff가 계속 생기기 때문에 그냥 Unity 기준대로 줄바꿈 문자를 LF로 통일시킨거다

 

여기까지만 해도 git으로 Unity 프로젝트를 관리할 수 있지만, 선택사항으로 해야할 일이 하나 남아있다. UnityYAMLMerge로도 해결할 수 없는 conflict이 생겼을 때는 직접 conflict을 해결해야 하는데, 이 때 열어야 할 merge tool을 선택해야 한다. 선택하지 않으면 해결할 수 없는 conflict이 생겼을 때 "Couldn't locate merge tool to handle ~~" 같은 경고창이 뜰 것이다. 아쉽게도 이미 깔려있는 merge tool이 없다면 새로운 프로그램을 깔아야 한다. merge tool을 정하지 않더라도 경고창을 무시하고 직접 conflict를 해결해도 된다.

merge tool을 사용하려고 한다면 UnityYAMLMerge와 같은 폴더 안에 있는 mergespecfile.txt를 수정해야 한다. Unity Hub를 쓴다면 C:\\Program Files\\Unity\\Hub\\Editor\\(유니티 버전)\\Editor\\Data\\Tools\\mergespecfile.txt, Unity Hub를 안 쓴다면 C:\\Program Files\\Unity\\Editor\\Data\\Tools\\mergespecfile.txt일 것이다. 열어보면 알겠지만 이미 여러 가지 merge tool들은 Unity에서 설정을 제공하고 있어서 굳이 편집할 필요가 없다. 여기에 적혀있지 않는 Meld 등의 다른 merge tool을 사용한다면 아쉽게도 직접 설정을 찾아서 수정해야 한다. 뭘 고를지 모르겠다면 Unity에서 추천해주는 DiffMerge를 사용하자. 여기서 다운받을 수 있다.