情境與先備知識
相信大多工程師都聽過版本控管。版本控管工具中最為熱門的是 git. 而支援 git 工具的雲端託管平台中最有名的是 GitHub.
所以…身為一名 Unity 工程師 / 開發者,想要上傳專案到 GitHub 應該是很合情合理的事情吧!
然而這件事最後卻搞了我快 2 個小時。哭啊!
這坎坷路一定要紀錄一下,希望未來不要再踩坑…
首先,你要有
想像你剛開始一個 Unity 專案。你想要把專案上傳到 GitHub.
你所需要的基本準備,當然就是
- 一個 Unity 專案
- 幫這個專案建立 git 紀錄
- 一個可以使用的 GitHub 帳號 / 空間
GitHub for Unity
GitHub 官方提供 Unity 套件:
這個套件預期能夠為 Unity 建立 git 紀錄、並上傳專案到 GitHub.
只要有個 GitHub 帳號,用這個套件就能可以解決所有問題了。結案!
…才怪。
GitHub 套件無法登入
根據一個行之有年的 GitHub Issue 表示,GitHub 在 2020 年後改全面使用 Token 授權,也引入了二階段驗證等機制。而 GitHub for Unity 套件目前仍然使用帳號密碼的機制登入。
套件上額外有顆「 sign in with your browser 」按鈕,點下去仍然沒有作用——其只會打開一個 localhost 的網頁,而且不會有反應。
網路上多數解法是透過其他管道完成 upload, 例如 VSCode 或 command line 手動上傳。
好哇,那我就照著改用 VS Code 的 GitHub 套件來上傳專案呀!總不會有問題了吧?
…才怪。
Git LFS
如果夠幸運,在上述改手動上傳之後就不會遇到錯誤了。
如果不夠幸運——例如我——那麼你可能還會遭遇以下錯誤。
其中之一是 Git LFS 檔案不明:
This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/pre-push.
什麼是 Git LFS 呢?全名是 Large File Storage, 是 GitHub 於 2015 年推出的 Git 衍生工具:
使用 GitHub for Unity 套件創建 git 紀錄的過程中顯然幫 Unity 套用 Git LFS 功能了。你可以觀察上述提及的 hooks 資料夾內容,或者觀察 .gitattributes 檔案,可以看到類似下方的段落:
# Image formats
*.psd filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.gif filter=lfs diff=lfs merge=lfs -text
*.bmp filter=lfs diff=lfs merge=lfs -text
*.tga filter=lfs diff=lfs merge=lfs -text
*.tiff filter=lfs diff=lfs merge=lfs -text
*.tif filter=lfs diff=lfs merge=lfs -text
*.iff filter=lfs diff=lfs merge=lfs -text
*.pict filter=lfs diff=lfs merge=lfs -text
*.dds filter=lfs diff=lfs merge=lfs -text
*.xcf filter=lfs diff=lfs merge=lfs -text
大致了解 Git LFS 是在做什麼之後,我覺得 Unity Project 是很適合套用 Git LFS. 所以我沒打算把它移除。
那麼,還能如何排除上方 error 呢?其實答案出乎意料的簡單:只要安裝 Git LFS 即可。
舉例來說,Mac 可以用 terminal 透過 Homebrew 安裝:
brew install git-lfs
Over its data quota
如果你安裝完畢 Git LFS, 理想上就能直接上傳到 GitHub 了。
如果不夠幸運 — — 例如我 — — 那麼你可能還會遭遇以下錯誤:
batch response: This repository is over its data quota. Account responsible for LFS bandwidth should purchase more data packs to restore access.
這個錯誤呢,簡單來說,就是你的 GitHub 帳號使用 Git LFS 的上限到了。
就算你的專案目前沒有包含使用 LFS 的檔案,只要專案有標記要啟用 LFS 功能、GitHub 就會檢查與阻擋 LFS 用量。
要查看你的 GitHub 帳號 LFS 用量,請到 GitHub 帳戶 Settings > Billings 觀看。其中有個區塊就叫做 Git LFS Data:
可以看到你之前使用的 GitHub LFS 量。
像是上圖就說明,我之前曾經上傳過別的 Unity 專案,用了大量的 LFS 扣打。
(真是奇怪,上次上傳這個專案是在半年,那時也沒遭遇這些鬼問題啊…)
要解決這個問題,你有以下選項:
- 擴充 GitHub 帳戶的 LFS 使用量(每月 5 美金左右)
- 目前要上傳的專案,移除 LFS 功能
- 釋放 GitHub 上的 LFS 使用量
方法 3 具體來說,其實就是刪除 GitHub 上使用過 LFS 的 repository.
必須要 literally delete it. 單純的 archive repository 是沒有用的唷。
我後來是採用方法 3 啦…畢竟對我來說那個 Lab 專案可有可無。不過如果有其他考量的人,請考慮方法 1 或方法 2 吧。
至此,總算把 Unity 專案上傳了(倒)
最主要的阻礙是 Git LFS 的設定,以及 GitHub 本身的容量限制。
排除掉這兩點問題之後,應該就能順利上傳了!
幕後花絮: Plastic SCM
在排除上述錯誤的過程中,我看到有人推薦改使用 Plastic SCM 進行版本控管。Plastic SCM 是 Unity (旗下子公司)於 2020 年推出的版本控管工具:
據說能更好地視覺化版本控管流程,提供 task 綁定管理,並且支援大型檔案與各種設計檔。
在 Unity 中使用的話似乎會取代原先的 Collaborative Tools.
不過我是還沒有使用過就是了。
在這裡作個紀錄,歡迎有興趣的人去嘗試看看囉!