
Git LFS Là Gì?
Git LFS (Large File Storage) là tiện ích mở rộng chính thức của Git, giúp developer quản lý các tệp lớn như hình ảnh, video, file audio, mô hình machine learning và các file binary. Thay vì lưu toàn bộ nội dung file vào repository Git, Git LFS lưu một con trỏ tham chiếu (pointer) có kích thước chỉ vài trăm byte trong repo, còn dữ liệu thực được lưu trữ trên server LFS riêng biệt.

Vấn Đề Với Git Truyền Thống Khi Xử Lý File Lớn
Khi bạn thêm file lớn vào Git truyền thống, mỗi lần commit đều lưu toàn bộ nội dung file đó vào lịch sử (.git/objects). Điều này gây ra nhiều vấn đề nghiêm trọng:
- Kho repository phình to – chỉ vài file binary dung lượng vài trăm MB đã có thể đẩy repo lên hàng GB chỉ sau vài tháng
- Clone chậm đau đớn – mỗi developer clone repo đều tải toàn bộ lịch sử mọi phiên bản file lớn
- Diff không ý nghĩa – Git không thể so sánh binary file một cách có ích, mọi thay đổi hiển thị là “Binary files differ”
- Băng tải CI/CD tăng – mỗi pipeline clone đều tải thừa dữ liệu không cần thiết
Cài Đặt Git LFS Trên Hệ Thống
Cài đặt Git LFS sau khi đã cài Git trên máy:
git lfs install
git lfs track "*.psd"
git lfs track "*.zip"
git lfs track "*.bin"
git lfs track "*.mp4"
git lfs track "*.model"
git lfs track "*.weights"
Các lệnh trên tạo file .gitattributes ở thư mục gốc repo, liệt kê các phần mở rộng cần quản lý bằng LFS. File này cần commit vào repo để toàn bộ team cùng sử dụng.
Cách Hoạt Động Của Git LFS
Git LFS hoạt động theo mô hình con trỏ + object store:
| Thành phần | Mô tả |
|---|---|
| Con trỏ trong repo | File text ~130 byte chứa ID object, kích thước, SHA-256 hash của file thật |
| Object store (server) | Server LFS lưu file thật theo hash, không ảnh hưởng kho Git chính |
| Hook trong checkout | Tự động tải file thật khi checkout commit có chứa LFS files |
| LFS fetch/pull | Chỉ tải file cần thiết, không tải toàn bộ lịch sử |

Workflow Thực Tế Cho Developer
Quy trình làm việc với Git LFS trong dự án thực tế:
- Theo dõi file mới – Chạy
git lfs track "*.extension"cho từng loại file cần quản lý - Thêm vào staging –
git add .gitattributes file.binary(cả config lẫn file) - Push lên remote – Git đẩy con trỏ trước, LFS đẩy file thật song song qua API riêng
- Đồng đội clone – Chỉ tải con trỏ (< 1KB), tải file thật khi cần qua
git lfs pull - Switch branch – Git checkout tự động tải file LFS tương ứng với branch đó
Cấu Hình Server LFS
Phần lớn Git host (GitHub, GitLab, Bitbucket) đã tích hợp sẵn LFS server. Cấu hình cơ bản:
# GitHub: lưu trữ 1GB miễn phí, gói trả phí mở rộng
git lfs env
# Self-hosted: cài LFS adapter
git lfs track "*.psd" --verbose
git config lfs.storage "/var/lfs/objects"
Hạn Chế Cần Lưu Ý
- Bandwidth upload – mỗi push chứa file LFS mới đều phải upload toàn bộ file đó (không có incremental upload)
- Storage quota – GitHub Free giới hạn 1GB LFS, GitLab Free 10GB; vượt quá cần trả phí
- Không hỗ trợ mọi host – Cần host có cài đặt Git LFS server; không phải Git hosting nào cũng hỗ trợ
- Tốn thời gian ban đầu – Quá trình upload file LFS lớn có thể mất nhiều thời gian, đặc biệt trên đường chậm
So Sánh Git LFS Với Git Thuần
| Tiêu chí | Git thuần | Git LFS |
|---|---|---|
| File nhị phân | Lưu toàn bộ trong repo | Lưu pointer, file thật trên server riêng |
| Dung lượng repo | Tăng nhanh | Giữ nhỏ gọn |
| Clone time | Chậm hơn với file lớn | Nhanh hơn đáng kể |
| Diff | Không phân tích được binary | Không áp dụng (bỏ qua file LFS) |
| Cài đặt | Không cần thêm | Cần cài git-lfs client |
Best Practices Khi Dùng Git LFS
- Chỉ track file binary thực sự lớn (>10MB); file text nhỏ không cần LFS
- Đồng bộ
.gitattributesngay từ đầu dự án - Sử dụng
git lfs ls-filesđể kiểm tra file nào đang được track - Xóa file LFS không dùng:
git lfs prunedọn dẹp object store cục bộ
Kết Luận
Git LFS là giải pháp thiết yếu cho bất kỳ dự án nào có file nhị phân lớn trong repository. Hiểu cách cài đặt, cấu hình và quản lý giúp team tránh repo phình to, tăng tốc clone, và giữ lịch sử Git gọn nhẹ. Đặc biệt quan trọng với các dự án game dev, ML model training, và thiết kế đồ họa. Đọc tài liệu chính thức tại Git-Scm Book và GitHub Git LFS.
