아래 내용은 Windows 기준으로 작성되었습니다.
사용되는 툴
- SourceTree (Git GUI)
- 다른 GUI 클라이언트도 사용 가능하지만, 클라이언트에 따라 설정 방식이 다름 (공식 문서 참고)
- UnityYAMLMerge
- SourceTree가 자동으로 처리하지 못하는 씬, 프리팹 등의 충돌을 해결하기 위하여 사용
- Unity에서 기본으로 제공, Unity 설치 시 함께 설치됨
- Meld (Merge tool)
- UnityYAMLMerge가 처리하지 못하는 충돌을 해결하기 위하여 사용
- OS X를 지원하지 않음
기본 툴 설정
Meld 설치 및 fallback 설정
Meld 설치
https://meldmerge.org/ 에서 Meld 설치 파일을 다운받고 설치한다. 설치 경로는 C:\Program Files\Meld
으로 지정한다.
- (참고) 설치 중 관리자 권한 관련 에러 발생할 경우
- 관리자 권한으로 cmd 실행
- 설치 파일 경로로 이동하여 설치 파일 직접 실행
UnityYAMLMerge fallback 파일 수정 - mergespecfile.txt
파일 경로: C:\Program Files\Unity\Editor\Data\Tools\mergespecfile.txt
위 경로의 파일을 열어 아래와 같이 수정한다. 내용 변경에 관리자 권한이 필요할 수 있다. 이 경우 메모장을 관리자 권한으로 실행한 후 해당 경로의 파일을 열어 해결할 수 있다.
15~21줄이 해당 캡쳐처럼 변경되어야 UnityYAMLMerge가 처리하지 못하는 부분이 있을 때 에러가 발생하지 않고 외부 툴을 실행하여 충돌을 직접 처리하게 해준다. 여기에서는 Meld를 사용한다.
파일을 위 캡쳐와 같이 수정하기 위해 15~21 줄을 아래 내용으로 수정한다.
before
1unity use "%programs%\YouFallbackMergeToolForScenesHere.exe" "%l" "%r" "%b" "%d"2prefab use "%programs%\YouFallbackMergeToolForPrefabsHere.exe" "%l" "%r" "%b" "%d"34#5# Default fallbacks for unknown files. First tool found is used.6#
after
1unity use "%programs%\Meld\meld.exe" "%b" "%r" "%l" -o "%d" --auto-merge2prefab use "%programs%\Meld\meld.exe" "%b" "%r" "%l" -o "%d" --auto-merge34#5# Default fallbacks for unknown files. First tool found is used.6#78* use "%programs%\Meld\meld.exe" "%b" "%r" "%l" -o "%d" --auto-merge
SourceTree 병합 도구 설정
- SourceTree→도구→옵션→비교 탭으로 이동
- 병합 도구의 드롭다운에서 [커스텀] 선택
- 병합 명령어에 입력:
C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe
- 변수에 입력:
merge -p $BASE $REMOTE $LOCAL $MERGED
- [확인] 클릭
상단 메뉴에서 도구→옵션→비교
모든 설정이 완료되었으므로, 이후 브랜치 병합 도중 씬이나 프리팹 등에서 충돌이 발생할 경우 충돌이 발생한 파일을 우클릭 → 충돌 해결 → 외부 병합 툴 시작을 선택하여 UnityYAMLMerge를 실행해 충돌을 해결할 수 있다.
충돌이 발생한 씬에서 오른쪽 클릭 후 [외부 병합 툴 시작]을 누르면 UnityYAMLMerge가 실행되며 자동으로 씬을 병합해 준다
병합 예시 프로젝트
기본적인 프로젝트를 구성했다.
현재 브랜치는 master 브랜치 뿐이다.
master 브랜치에서 간단한 씬을 구성했다.
Master 브랜치에서 구성한 간단한 씬의 모습
충돌 환경 생성
new-feature라는 새로운 브랜치를 생성했다.
충돌 상황을 만들기 위하여, 각 브랜치의 Main 씬 내의 오브젝트를 다음과 같이 수정했다.
- Cube
- master 브랜치에서 material 변경
- master 브랜치에서 자식으로 큐브 추가
- new-feature 브랜치에서 자식으로 원통 추가
- Sphere
- new-feature 브랜치에서 Transform의 scale 변경
- master 브랜치에서 Transform의 position 변경
- Canvas > Text
- new-feature 브랜치에서 텍스트 내용 변경
- master 브랜치에서 텍스트 내용 변경
이를 통해 테스트하고자 하는 부분은 다음과 같다.
- 씬의 한 오브젝트에 서로 다른 자식 오브젝트가 있을 경우
- 씬의 한 오브젝트의 컴포넌트 내부 같은/다른 값을 서로 다른 브랜치에서 수정했을 경우
- 프로젝트 내에 새로운 파일이 추가되었을 경우
- new-feature 브랜치 새로 만든 new-feature 브랜치에서 수정한 Main 씬의 모습
- master 브랜치 기존 master 브랜치에서 수정한 Main 씬의 모습
- material을 추가하면서 새로운 폴더 및 파일도 생성되었다.
두 브랜치 각각에서 작업의 내용을 커밋했다.
SourceTree에서 외부 병합 툴 사용
둘을 병합하려고 하면 충돌 병합 메시지가 표시된다.
SourceTree는 유니티 씬 파일의 충돌을 자동으로 병합해 주지 못하기 때문에 발생하는 에러
커밋을 확인해 보면 스테이지에 병합이 실패한 Main 씬 파일이 올라와 있는 것을 확인할 수 있다. 파일 오른쪽 클릭 → 충돌 해결 → 외부 병합 툴 시작을 누르면 UnityYAMLMerge가 실행된다.
충돌이 발생한 씬에서 오른쪽 클릭 후 [외부 병합 툴 시작]을 누르면 UnityYAMLMerge가 실행되며 자동으로 씬을 병합해 준다
앞에서 Meld 설정을 하지 않았을 때, UnityYAMLMerge가 해결할 수 없는 충돌이 있다면 그 충돌을 해결하기 위한 외부 툴을 찾지 못하여
Couldn't locate merge tool to handle extension tmp in \my\path\to\mergespecfile.txt
에러가 발생한다. 해당 에러를 해결하기 위하여 앞에서 fallback file에 Meld 툴의 경로를 설정해 주었다.
Meld에서 충돌 병합하기
UnityYAMLMerge가 처리하지 못한 충돌은 Meld에서 직접 처리해야 한다
텍스트의 내용을 변경한 것을 UnityYAMLMerge 내부에서 해결하지 못했다. 변경된 두 텍스트 중에서 선택할 것을 고른 후 Save하고 창을 닫으면 충돌을 직접 처리할 수 있다. 충돌이 잘 처리되었다면 유니티로 이동해 해당 씬을 reload 했을 때 충돌 관련 에러가 발생하지 않고 잘 실행되어야 한다.
충돌이 잘 처리되었다
병합이 잘 처리되어 master 브랜치로 커밋된 모습
병합 결과
충돌 처리 및 병합 이후 master 브랜치의 씬 모습
- 씬의 한 오브젝트에 서로 다른 자식 오브젝트가 있을 경우
- 추가된 오브젝트 모두 자식 오브젝트로 적용된다
- 씬의 한 오브젝트의 컴포넌트 내부 같은/다른 값을 서로 다른 브랜치에서 수정했을 경우
- 같은 값을 변경한 경우 UnityYAMLMerge가 처리하지 못한다. Meld 등 외부 툴로 처리해 주어야 한다.
- 하나의 브랜치에서만 값이 변경된 경우 그 변경된 값으로 적용된다.
- 프로젝트 내에 새로운 파일이 추가되었을 경우
- 문제 없이 추가된다.