Nỗi ám ảnh: Chờ đợi git clone đến “héo mòn”
Bạn đã bao giờ ngồi đợi 20 phút chỉ để sửa một dòng CSS trong một dự án Monorepo khổng lồ chưa? Cảm giác đó thật tệ. Bạn chỉ cần cập nhật file README nhưng phải tải toàn bộ mã nguồn nặng 5-10 GB về máy. Ổ cứng SSD trên con Macbook “quốc dân” thì liên tục báo đỏ vì hết dung lượng.
Khi mới làm dự án với hơn 50 microservices, tôi từng rơi vào cảnh dở khóc dở cười này. Cả repo chứa code của mọi phòng ban, trong khi tôi chỉ phụ trách đúng 2 dịch vụ Backend. Mỗi lần pull code, quạt tản nhiệt máy tính kêu như động cơ phản lực. Sau nhiều lần ức chế, tôi tìm thấy Sparse Checkout — một tính năng cực xịn của Git giúp giải quyết triệt để vấn đề này.
Sparse Checkout cho phép bạn chỉ lấy đúng những thư mục mình cần. Những phần còn lại sẽ được Git ẩn đi và không tải dữ liệu về máy. Đây không phải là việc clone cả repo rồi xóa tay các thư mục thừa đâu nhé!
Sparse Checkout là gì?
Nói một cách thực tế, Sparse Checkout (kiểm tra thưa thớt) giúp bạn định nghĩa một “danh sách trắng” các thư mục muốn xuất hiện. Những gì không nằm trong danh sách này sẽ biến mất khỏi working directory của bạn. Tuy nhiên, chúng vẫn nằm an toàn trên server như GitHub hay GitLab.
Từ phiên bản Git 2.25, chúng ta đã có lệnh git sparse-checkout chuyên dụng. Cách tiếp cận mới này đơn giản hơn nhiều so với việc can thiệp vào file cấu hình hệ thống như trước đây.
Có hai chế độ bạn cần biết:
- Cone mode (Mặc định): Chỉ cho phép chọn các thư mục cụ thể. Chế độ này cực nhanh, ổn định và được khuyến khích sử dụng.
- Non-cone mode: Cho phép dùng pattern (như regex) để lọc file. Cách này linh hoạt hơn nhưng hiệu năng kém và dễ gây lỗi cấu hình.
Quy trình clone một phần thư mục (Pro Tips)
Đừng clone toàn bộ rồi mới bật sparse-checkout. Làm vậy bạn vẫn tốn băng thông tải “rác” về. Hãy áp dụng quy trình 4 bước tối ưu sau đây.
Bước 1: Khởi tạo Repo với Blobless Clone
Thay vì git clone thông thường, hãy dùng flag --filter và --no-checkout. Lệnh này chỉ tải metadata của các commit chứ không tải nội dung file (blobs).
# Thay URL bằng repo thực tế của bạn
git clone --filter=blob:none --no-checkout https://github.com/example/monorepo-khong-lo.git
cd monorepo-khong-lo
Lúc này thư mục sẽ trống trơn. Đừng hoảng hốt, chúng ta đang đi đúng hướng.
Bước 2: Kích hoạt chế độ tiết kiệm
Bật tính năng sparse-checkout với chế độ Cone mode để đạt hiệu suất cao nhất:
git sparse-checkout init --cone
Bước 3: Chọn thư mục làm việc
Giả sử bạn chỉ cần làm việc với apps/api-gateway và libs/shared-auth. Hãy ra lệnh cho Git:
git sparse-checkout set apps/api-gateway libs/shared-auth
Git sẽ ghi nhận danh sách này và chuẩn bị sẵn sàng để tải dữ liệu.
Bước 4: Checkout dữ liệu
Cuối cùng, hãy lấy code của branch bạn cần:
git checkout main
Kết quả thật bất ngờ: Thư mục dự án giờ chỉ hiện đúng 2 folder bạn chọn. Dung lượng project giảm từ 5GB xuống còn khoảng 150MB. Tốc độ làm việc tăng lên rõ rệt.
Kinh nghiệm thực chiến sau 6 tháng áp dụng
Áp dụng Sparse Checkout trong môi trường doanh nghiệp mang lại hiệu quả lớn, nhưng bạn cần lưu ý 3 điểm quan trọng sau.
1. Luôn kết hợp với Partial Clone
Nếu bạn dùng sparse-checkout trên một repo đã clone đầy đủ, bạn chỉ giải quyết được vấn đề “đỡ rối mắt”. Để thực sự tiết kiệm dung lượng ổ cứng, bạn bắt buộc phải dùng --filter=blob:none ở Bước 1.
2. Quản lý Dependency thông minh
Đây là lỗi phổ biến nhất. Một dịch vụ trong Monorepo thường phụ thuộc vào các thư mục common hoặc utils. Nếu thiếu chúng, IDE sẽ báo lỗi đỏ rực và code không thể build.
Mẹo nhỏ: Kiểm tra file package.json hoặc go.mod để biết các local package cần thiết. Sau đó dùng lệnh add để bổ sung thư mục:
git sparse-checkout add common/utils
3. Tối ưu CI/CD Pipeline
Tôi đã thử áp dụng kỹ thuật này vào Jenkins và GitHub Actions. Thời gian chạy pipeline giảm từ 4 phút xuống còn 45 giây. Runner không còn phải kéo hàng nghìn file thừa thãi qua mạng, giúp tiết kiệm chi phí băng thông đáng kể.
Cách quay trở lại trạng thái đầy đủ
Nếu cần tìm kiếm global hoặc refactor toàn bộ dự án, bạn có thể tắt tính năng này bất cứ lúc nào:
git sparse-checkout disable
Lệnh này đưa repo về trạng thái clone đầy đủ. Mọi thứ diễn ra rất linh hoạt và an toàn.
Lời kết
Git Sparse Checkout không đơn thuần là một thủ thuật kỹ thuật. Nó là tư duy làm việc hiện đại giúp bạn tập trung vào phần việc quan trọng nhất. Khi loại bỏ được hàng nghìn file không liên quan, máy tính chạy nhanh hơn và đầu óc bạn cũng bớt xao nhãng hơn.
Nếu team bạn đang vật lộn với Monorepo, hãy thử áp dụng ngay. Ổ cứng và băng thông của bạn chắc chắn sẽ biết ơn bạn rất nhiều!

