Làm chủ Git LFS: Giải pháp xử lý file ‘khủng’ cho Repository chuyên nghiệp

Git tutorial - IT technology blog
Git tutorial - IT technology blog

Vấn đề: Khi Git trở nên “ì ách” vì file nặng

Bạn đã bao giờ push một file video 500MB lên GitHub rồi ngồi nhìn thanh tiến trình chạy “như rùa” chưa? Tệ hơn là sau 15 phút chờ đợi, bạn nhận về lỗi File exceeds 100MB limit. Bạn không cô đơn đâu.

Mình từng tham gia một dự án Computer Vision với hơn 2.000 tấm ảnh RAW (~15GB). Lúc đó vì chưa biết tới Git LFS, mình vô tư commit toàn bộ vào repo. Kết quả là mỗi lần đồng nghiệp git clone, họ phải mất cả tiếng đồng hồ để tải về một mớ hỗn độn. Thực tế, họ chỉ cần vài dòng code để làm việc.

Về bản chất, Git được thiết kế để quản lý source code (file văn bản). Nó lưu lịch sử bằng cách ghi lại sự thay đổi (diff) giữa các phiên bản. Tuy nhiên, với file nhị phân như ảnh, video hay model AI, Git không thể tính toán “diff” hiệu quả. Chỉ cần bạn sửa 1 pixel trong ảnh 10MB, Git sẽ lưu thêm một bản copy 10MB nữa. Thư mục .git của bạn sẽ phình to chóng mặt.

Git LFS (Large File Storage) ra đời để giải quyết bài toán này. Nó thay thế các file nặng bằng những “con trỏ” (pointer) siêu nhẹ, chỉ nặng vài KB.

Quick Start: Cấu hình Git LFS trong 5 phút

Bỏ qua mớ lý thuyết khô khan, hãy thử thực tế luôn. Giả sử bạn cần quản lý file video_demo.mp4 nặng 200MB.

Bước 1: Cài đặt công cụ

Tùy hệ điều hành, bạn dùng lệnh sau:

  • macOS: brew install git-lfs
  • Ubuntu/Debian: sudo apt install git-lfs
  • Windows: Tải bộ cài từ trang chủ git-lfs.github.com.

Bước 2: Kích hoạt LFS

git lfs install

Bạn chỉ cần chạy lệnh này một lần duy nhất trên máy tính.

Bước 3: Chỉ định loại file cần quản lý

Ví dụ, mình muốn LFS quản lý toàn bộ file .mp4:

git lfs track "*.mp4"

Lúc này, file .gitattributes sẽ xuất hiện. Nó đóng vai trò như một “người gác cổng”, báo cho Git biết: “Đừng đụng vào mấy file mp4 này, để LFS lo”.

Bước 4: Commit và Push

git add .gitattributes
git add video_demo.mp4
git commit -m "Add demo video using LFS"
git push origin main

Rất đơn giản! File video đã được đẩy lên server lưu trữ riêng. Repo của bạn giờ đây cực kỳ gọn nhẹ.

Cơ chế hoạt động: Tại sao LFS lại nhanh?

Thay vì nhồi nhét file 200MB vào thư mục .git, LFS chỉ lưu một file pointer có nội dung như sau:

version https://git-lfs.github.com/spec/v1
oid sha256:a7c2... (mã hash định danh file)
size 209715200

Khi bạn git checkout, Git LFS sẽ đọc pointer này và tải file thực thực tế từ server về. Nếu bạn không chuyển sang branch chứa file đó, máy bạn sẽ không tốn một byte dung lượng nào. Đây là bí quyết giúp các dự án lớn giữ được tốc độ clone thần tốc.

Kinh nghiệm thực tế: Cứu vãn một repo đã lỡ phình to

Sai lầm phổ biến nhất là chỉ track file mới khi repo đã nặng vài GB. Cách này không có tác dụng vì các file cũ vẫn nằm trong lịch sử commit. Git sẽ không tự xóa dữ liệu cũ trừ khi bạn can thiệp sâu.

Để dọn dẹp triệt để, mình thường dùng lệnh migrate:

git lfs migrate import --include="*.zip,*.psd" --everything

Cảnh báo: Lệnh này sẽ viết lại toàn bộ lịch sử commit. Hãy thông báo cho team trước khi chạy, vì mọi người sẽ phải git clone lại từ đầu để tránh xung đột cấu trúc.

Tối ưu bộ nhớ local

Sau một thời gian, máy bạn có thể bị đầy do LFS giữ lại các phiên bản cũ để switch branch nhanh. Để giải phóng không gian, hãy dùng:

git lfs prune

Lệnh này xóa các file LFS cũ trong bộ nhớ đệm local nhưng vẫn giữ an toàn trên server. Khi cần lại phiên bản cũ, Git sẽ tự động tải về sau.

Lưu ý về chi phí và băng thông

Git LFS rất mạnh nhưng không hoàn toàn miễn phí trên các nền tảng Cloud:

  • GitHub: Miễn phí 1GB lưu trữ và 1GB băng thông/tháng. Nếu vượt ngưỡng, bạn phải mua thêm gói (khoảng $5/tháng cho 50GB).
  • Self-hosted: Nếu dùng Gitea hoặc GitLab tự cài trên VPS, bạn có thể thoải mái cấu hình dung lượng mà không lo tốn phí cho bên thứ ba.

Mẹo cho team Game và Đồ họa: File Locking

Trong dự án Unity hay Unreal, các file nhị phân như .psd hay .fbx không thể merge. Nếu hai người cùng sửa một file ảnh, chắc chắn sẽ có xung đột. Giải pháp là bật tính năng File Locking:

git lfs track "*.psd" --lockable

Khi một designer sửa file, họ sẽ chạy git lfs lock character.psd. Những người khác sẽ thấy file bị khóa và không thể push đè. Cách này giúp tránh mất dữ liệu cực kỳ hiệu quả.

Lời kết

Đừng đợi đến khi repo nặng vài GB rồi mới tìm cách cứu vãn. Ngay khi khởi tạo dự án có media, hãy thiết lập .gitattributes ngay lập tức. Việc này giúp workflow của team trơn tru và chuyên nghiệp hơn hẳn. Nếu gặp lỗi trong quá trình cài đặt, bạn cứ để lại comment, mình sẽ hỗ trợ nhé!

Share: