Unity x Git
===
心酸血淚史
===
Jason Pan @ SITCON 2017
---
### Who am I ?
----
Jason Pan
大同大學資訊工程系四年級
大同資訊創意研究社總務
https://github.com/jason8399
---
# 前情提要
----
### 在不斷的換題目迴圈中
### 我們終於選定了題目<!-- .element: class="fragment" data-fragment-index="1" -->
### 要使用 Unity 製作 VR 遊戲<!-- .element: class="fragment" data-fragment-index="2" -->
### 但多人開發時就會需要用到 版本控制<!-- .element: class="fragment" data-fragment-index="3" -->
### 接下來就是噩夢的開始<!-- .element: class="fragment" data-fragment-index="4" -->
---
# 工具介紹
----
### Unity
是一個遊戲引擎
----
### Unity 推薦使用的 VCS
- Perforce<!-- .element: class="fragment" data-fragment-index="1" -->
- Plastic SCM<!-- .element: class="fragment" data-fragment-index="2" -->
----
### 都要錢
----
### Git
版本控制系統
---
# 悲劇是這樣發生的...
Note:
----
### 正常的 Git work flow
- A 同學從 develop 開一個 branch<!-- .element: class="fragment" data-fragment-index="1" -->
- B 同學從 develop 開一個 branch<!-- .element: class="fragment" data-fragment-index="2" -->
```
A---B---C A_student_branch
/
D---E---F---G develop
\
H---I---J B_student_branch
```
<!-- .element: class="fragment" data-fragment-index="3" -->
----
- A 完成一個 feature 後 merge 回 develop branch
- B 完成一個 feature 後 merge 回 develop branch<!-- .element: class="fragment" data-fragment-index="4" -->
```
A---B---C A student branch
/ \
D---E---F---G---H---I develop
\ /
H---I---J---- B student branch
```
<!-- .element: class="fragment" data-fragment-index="5" -->
----
Git 會自動 merge
若無法自動 merge 時就會...
----
# <p style="color: red;">CONFLICT!!!</p>
----
### 看到 conflict 不用太擔心
打開你常用的 merge tool (e.g. vimdiff)
修改完後 存檔就可以就解決了
----
# 輕鬆!
----
### 但是當我打開 Unity Scene 檔案時...
----

Note:
圖片大小調整
----

----
# 這時候我們"才"發現
Unity Scene 是以 binary 方式儲存(大哭
----
### 上網 Google 了一下
發現原來 [Unity 說明書](https://docs.unity3d.com/Manual/Versioncontrolintegration.html)有寫
<!-- .element: class="fragment" data-fragment-index="1" -->
----
### 簡單三步驟
- 至 Edit->Project Settings->Editor<!-- .element: class="fragment" data-fragment-index="1" -->
- <p>將 <b>Version Control Mode</b> 改為 <b>Visible Meta files</b></p><!-- .element: class="fragment" data-fragment-index="2" -->
- <p>將 <b>Asset Serialization Mode</b> 改為 <b>Force Text</b></p><!-- .element: class="fragment" data-fragment-index="3" -->
----
### 就可以把 Scene 從 Binary
### 轉為 YMAL 語法儲存
----
### 但是檔案也會跟著變大
### 因為轉成文字檔了嘛 ¯\\\_\(ツ\)_/¯ <!-- .element: class="fragment" data-fragment-index="1" -->
----
#### 這樣就可以快快樂樂的 vimdiff 了!

Note:
改圖[](https://i.imgur.com/CmSQYPx.png)
----
### 那幾千幾萬行的 YAML 檔誰看得懂?
### 會不會解完 conflict Scene 就壞了?<!-- .element: class="fragment" data-fragment-index="1" -->
---
### Unity YAML merge tool
是 Unity 用來處理 merge YAML 的 tool
可以將 Scene 以及 Prefab 以正確的語法做 merge<!-- .element: class="fragment" data-fragment-index="1" -->
Note:
merge 原理
----

Note:

----

----
### 有兩種 mode
- Premerge
- Ask
----
### Premerge
會將沒有 conflict 的區塊做 merge
再交由使用者做選擇
----
### Premerge

Note:

----
### Ask
只要有 conflict
就由使用者來決定使用的版本
----
### Ask mode

Note:

----
### 如何使用呢?
----
### 在 .git/config 或 .gitconfig 加入這段
```
[merge]
tool = unityyamlmerge
[mergetool "unityyamlmerge"]
trustExitCode = false
cmd = '<UnityYAMLMerge 的 path>' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"
```
----
### 而這個 Tool 的 Path (for Windows):
```
C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe
or
C:\Program Files (x86)\Unity\Editor\Data\Tools\UnityYAMLMerge.exe
```
----
### 而這個 Tool 的 Path (for macOS):
```
/Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge
```
----
### 太快?
### 沒關係<!-- .element: class="fragment" data-fragment-index="1" -->
### <p>Unity <a href="https://docs.unity3d.com/Manual/SmartMerge.html">說明書</a>也有寫</p><!-- .element: class="fragment" data-fragment-index="2" -->
----
### 當 Scene 或 Prefab merge 產生 Conflict 時
#### 下 git mergetool 呼叫 UnityYAMLmerge 來拯救你
----
# 愉悅!
----
### Windows 用戶會遇到一個問題
----
### Mac 有內建 FileMerge
### Windows 沒有內建 merge tool <!-- .element: class="fragment" data-fragment-index="1" -->
----
### 執行完沒有視窗跑出來啊
# ಥ_ಥ
----
### 1. 安裝 merge tool (e.g. kdiff3)
### 2. 去修改 Tools 資料夾中的 mergespecfile.txt<!-- .element: class="fragment" data-fragment-index="1" -->
<h3>可參考<a href="https://gist.github.com/Ikalou/197c414d62f45a1193fd">這篇</a>做設定</h3><!-- .element: class="fragment" data-fragment-index="2" -->
---
# 另一個故事是這樣的...
----
### 同學 A 將素材加入專案內
### git add 完也 commit
### 很開心地 push 出去
----
### 同學 B 說我沒有看到你新的 commit
### 同學 A 一看 log
```
remote: warning: Large files detected.
remote: error: File giant_file is 123.00 MB; this exceeds GitHub's file
size limit of 100 MB
```
----
## 素材檔案太大 push 被 reject ...
----
### GitHub repo 限制
- 單一 repo 不超過 1GB<!-- .element: class="fragment" data-fragment-index="1" -->
- 單一檔案 不超過 100MB<!-- .element: class="fragment" data-fragment-index="2" -->
----
## Git LFS
可以將大型 binary 檔案交由遠端 server 儲存
在 repo 中使用 text pointer 指向
----

<p style="font-size:10px">src:https://git-lfs.github.com/</p>
----
### Pros
- 減少 repo 空間
- 加快 clone 以及 fetch 速度
- 跟操作 git 沒有太大差別
----
### Cons
我想不太出來...
----
### 如何使用呢
官網也有[教學](https://git-lfs.github.com/)
但是我還是要講(硬要<!-- .element: class="fragment" data-fragment-index="1" -->
----
### Step 1.
下載 git-lfs 並安裝
然後在 terminal 下 git lfs install
----
### Step 2.
輸入追蹤的檔案類型
git lfs track "*.psd"
且
讓 git 追蹤 .gitattributes
git add .gitattributes
Note:
在這邊 git lfs 會將相關設定寫入.gitattributes中
----

----
### Step 3.
Add 你的檔案 & Commit & Push
----
## 就是這麼簡單
----
### GitHub 提供一般 Account 一個 repo
- 1 GB LFS stroage
- 1 GB bandwidth per month
---
### 趕快讓你們的 Unity 專案上 GitHub 吧
----
# Thanks for your listening
----
# Q&A
{"metaMigratedAt":"2023-06-14T12:26:03.604Z","metaMigratedFrom":"Content","title":"Unity x Git","breaks":true,"contributors":"[]"}