Git cho Unity: commit gì và bỏ qua gì
Dùng Git cho project Unity sao cho không hỏng?
Commit Assets/, ProjectSettings/ và mọi file .meta; bỏ qua Library/, Temp/, obj/, Build/ và Logs/. Đặt Version Control thành Visible Meta Files và Asset Serialization thành Force Text trước khi có ai clone, đưa file nhị phân nặng vào Git LFS ngay từ đầu, và chia việc theo prefab để hai người không bao giờ phải gộp cùng một scene.
Git dùng với Unity không có vấn đề gì. Chỗ hỏng là một project Unity chứa ba loại file — phần bạn làm ra, phần Unity ghi lại về phần bạn làm ra, và phần Unity tự dựng lại được — mà Git thì không phân biệt được ba loại đó. Commit nhầm nhóm là kho biến thành vài gigabyte rác, kéo về lần nào cũng xung đột. Phân loại ba nhóm đó một lần lúc bắt đầu, phần còn lại chỉ là Git bình thường.
Ba loại file
Phần bạn làm ra: mọi thứ trong Assets/ — scene, script, prefab, model, texture. Kho tồn tại là vì nhóm này.
Phần Unity ghi lại: ProjectSettings/, Packages/manifest.json, và một file .meta cho mỗi asset. Nhẹ, và bắt buộc phải commit.
Phần Unity tự dựng lại: Library/, Temp/, Logs/, obj/, Build/. Vài gigabyte, mỗi máy một khác, và với người khác thì vô giá trị. Tuyệt đối đừng commit.
Chỉnh project trước đã
- 1
Mở . Đặt Version Control mode thành Visible Meta Files, và Asset Serialization mode thành Force Text.
- 2
Force Text ghi scene và prefab thành YAML thay vì nhị phân. Scene nhị phân với Git chỉ là một cục không đọc được: không xem được đã đổi gì, và không bao giờ gộp được phần việc của hai người.
- 3
Commit cả hai thiết lập này trước khi có ai clone project. Đổi sau là viết lại toàn bộ file scene trong một commit khổng lồ.
File .gitignore
Đặt file này ở gốc kho, ngang hàng với thư mục Assets. Dấu gạch chéo cuối dòng có ý nghĩa: nó nói đây là thư mục, nên một file tình cờ tên Temp thì vẫn được theo dõi.
[Ll]ibrary/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
[Ll]ogs/
[Uu]serSettings/
[Mm]emoryCaptures/
# Editor and OS noise
.vs/
.idea/
.DS_Store
*.csproj
*.sln
*.user
# Build outputs
*.apk
*.aab
*.unitypackage
# Crash reports
sysinfo.txtNếu lỡ commit Library rồi
git rm -r --cached Library Temp obj Build
git commit -m "Stop tracking generated folders"--cached gỡ chúng khỏi Git mà không xoá trên ổ cứng của bạn. Lịch sử thì vẫn còn chúng, nên kho vẫn nặng cho tới khi có người viết lại lịch sử; với project còn non thì thường tạo kho mới lại nhanh hơn là đi học git filter-repo.
File nặng: texture, model, âm thanh
Mỗi lần đổi một file nhị phân, Git lưu hẳn một bản mới. Xuất lại một model 40 MB mười lần là kho mang theo 400 MB vĩnh viễn. Git LFS thay vào đó chỉ lưu một con trỏ, còn file để chỗ khác.
git lfs install
git lfs track "*.psd" "*.fbx" "*.blend" "*.wav" "*.mp3" "*.mp4"
git add .gitattributesHai người, một scene
Đây là phần Git không giải được hộ bạn. File scene là một tài liệu YAML mô tả mọi object trong đó, nên hai người sửa hai góc khác nhau của cùng một cảnh thì vẫn là sửa cùng một file, và Git đưa ra một bản gộp mà nó không có cách nào làm đúng.
Chia việc theo prefab. Người này giữ prefab kẻ địch, người kia giữ prefab giao diện, còn scene chỉ chứa instance. Hai prefab là hai file, mà hai file thì không xung đột.
Dùng scene cộng dồn cho màn lớn: mỗi khu vực một scene, lúc chạy thì nạp chung. Mỗi người mở đúng file của mình.
Nói to ai đang mở scene. Với nhóm hai ba người thì cách này nhanh và chắc hơn mọi công cụ.
Nếu vẫn dính xung đột trong file .unity, hãy lấy trọn một bên rồi làm lại phần bên kia bằng tay. Scene YAML gộp tay hỏng file đủ thường xuyên để việc đó không đáng thử.