Git Bundle: Tuyệt chiêu đóng gói Repository khi làm việc Offline

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

Bối cảnh: Khi Internet là một điều xa xỉ

Hồi mình làm dự án cho một ngân hàng lớn, toàn bộ server được đặt trong khu vực biệt lập (air-gapped). Không Internet, không kết nối ngoại mạng để đảm bảo an toàn dữ liệu. Lúc đó, những lệnh quen thuộc như git push hay git pull lên GitHub bỗng trở nên vô dụng. Thử thách đặt ra là: Làm sao chuyển code vào server mà vẫn giữ nguyên lịch sử commit, các nhánh và tags?

Nhiều bạn thường chọn cách nén cả thư mục dự án thành file .zip để copy qua USB. Cách này tiềm ẩn rủi ro rất lớn. Thư mục .git có thể chứa tới 50.000 file nhỏ li ti. Chỉ cần một file bị lỗi trong lúc copy, toàn bộ repository của bạn sẽ hỏng sạch. Ngoài ra, file nén thường rất nặng vì ôm đồm cả node_modules hay các file build tạm.

Giải pháp chuyên nghiệp hơn chính là git bundle. Nó đóng gói repository thành một file binary duy nhất, hoạt động như một “repo di động”. Bạn có thể dùng file này để git clone hoặc git pull như một server thực thụ.

Tại sao git bundle tốt hơn nén file thủ công?

  • Kiểm soát lỗi: Git sẽ tự kiểm tra tính toàn vẹn khi đóng gói. Nếu file bị lỗi, lệnh mở sẽ báo ngay lập tức.
  • Gọn nhẹ: Bundle chỉ chứa các commit và object cần thiết. Một repo 500MB có thể giảm xuống còn 150MB sau khi bundle.
  • Cập nhật linh hoạt: Bạn có thể chỉ đóng gói những commit mới nhất thay vì gửi lại cả dự án nặng nề.

Chuẩn bị trước khi đóng gói

Lệnh git bundle đã có sẵn trong bộ cài Git tiêu chuẩn. Bạn không cần cài thêm bất cứ công cụ bên thứ ba nào. Trước khi bắt đầu, hãy dọn dẹp repo để file bundle có dung lượng tối ưu nhất.

Mình thường chạy lệnh git gc (Garbage Collection). Lệnh này giúp Git sắp xếp lại các object và nén dữ liệu hiệu quả hơn.

# Tối ưu hóa repo để giảm dung lượng file bundle
git gc --prune=now --aggressive

Thực tế cho thấy, bước này giúp giảm 20-30% dung lượng đối với các dự án lâu năm có lịch sử commit dày đặc.

Cách sử dụng trong thực tế

1. Tạo file Bundle toàn bộ (Full Backup)

Để gói ghém mọi thứ từ các nhánh đến tags vào một file duy nhất, bạn dùng lệnh:

# Đóng gói toàn bộ repo
git bundle create my-project.bundle --all

Nếu chỉ cần gửi một nhánh cụ thể cho đồng nghiệp để giảm dung lượng, hãy dùng:

# Chỉ đóng gói nhánh main
git bundle create main-only.bundle main

2. Khôi phục code từ file Bundle

Tại máy tính đích, bạn coi file bundle như một URL của GitHub. Việc clone diễn ra rất đơn giản:

# Clone dự án từ file đã đóng gói
git clone my-project.bundle my-new-folder

Sau khi clone, Git sẽ đặt tên remote mặc định là origin trỏ thẳng vào file bundle đó. Nếu bạn xóa hoặc di chuyển file bundle, các lệnh fetch sau này sẽ không hoạt động.

3. Chỉ gửi những thay đổi mới (Incremental Update)

Đây là tính năng đáng giá nhất. Giả sử tuần trước bạn đã gửi file bundle 1GB. Tuần này bạn chỉ code thêm 10 commit (khoảng 200KB). Việc gửi lại 1GB là cực kỳ lãng phí thời gian.

Hãy tạo một bundle “vá” chứa các commit từ phiên bản cũ đến hiện tại:

# Tạo bundle từ tag v1.0 đến hiện tại
git bundle create update-v1.1.bundle v1.0..main

Người nhận chỉ cần tải file vài trăm KB này về và thực hiện pull:

git pull update-v1.1.bundle main

Kiểm tra tính an toàn của file

Đừng vội gửi file đi khi chưa kiểm tra. Vì là định dạng binary, bạn không thể dùng trình soạn thảo văn bản để xem nội dung bên trong.

Dùng lệnh verify để chắc chắn file không bị lỗi trong quá trình copy:

git bundle verify my-project.bundle

Để xem bên trong bundle đang chứa những nhánh nào, hãy dùng list-heads:

git bundle list-heads my-project.bundle

Kinh nghiệm xương máu

Mình từng quản lý team 8 người làm việc tại văn phòng khách hàng không có mạng. Quy trình của tụi mình rất đơn giản: Cuối ngày, một người sẽ gom code cả team vào file daily_sync.bundle. File này được chép vào USB mang về nhà để push lên GitLab công ty. Cách làm này giúp giữ nguyên 100% lịch sử commit mà không lo mất mát dữ liệu.

Lưu ý nhỏ: Bundle không lưu cấu hình .git/config. Khi clone sang máy mới, bạn cần thiết lập lại user.nameuser.email để đảm bảo các commit tiếp theo được ghi nhận đúng tác giả.

Sử dụng git bundle không chỉ là phương án chữa cháy. Nó còn là cách dự phòng (backup) cực kỳ an toàn cho các dự án quan trọng của bạn.

Share: