Khi làm việc với git repository, đặc biệt là với mono repository thì rất có thể bạn sẽ gặp trường hợp bạn chỉ muốn clone về một phần của repo, nhất là trường hợp bạn chỉ phụ trách một phần rất nhỏ.

Ở đây mình sẽ ví dụ với repo MaxLeiter/Drift mà mình đang làm việc, kiến trúc thư mục repo của anh ấy như sau:

1
2
3
4
5
6
7
8
├── client
│ ├── components
│ ├── lib
│ └── ...
├── server
│ ├── src
│ ├── ...
└── ...

và bạn là một node.js dev, và bạn muốn đóng góp cho dự án khi bạn cảm thấy cách xử lý database của anh MaxLeiter chưa hợp lý và thật sự bạn chẳng có lý do gì phải clone toàn bộ repository này về để tốn thời gian chờ đợi và băng thông của đất nước, bạn chỉ làm việc với backend và thư mục bạn cần phải làm việc thực sự là: Drift/server.

Đầu tiên, chúng ta clone repo này về, và thêm vào --no-checkout để lấy về toàn bộ tracking info của repo chứ không lấy về bất cứ file/folder nào cả.

1
$ git clone --no-checkout https://github.com/MaxLeiter/Drift.git

Sau đó bạn dùng sparse-checkout để set những thư mục mà bạn cần làm việc:

1
2
$ cd Drift/
$ git sparse-checkout set /server /README.md

bạn cần README.md để update lại tài liệu cho project :3

Cuối cùng bạn có thể checkout các file trong list này về bằng lệnh:

1
$ git checkout

Để kiểm tra phần bạn checkout là bao nhiêu bạn có thể dùng lệnh: git status nó sẽ hiện message kiểu như:

1
2
3
4
5
6
On branch main
Your branch is up to date with 'origin/main'.

You are in a sparse checkout with 23% of tracked files present.

nothing to commit, working tree clean

Tức là chúng ta chỉ đang lưu 23% nội dung project trên working copy này.

*Lưu ý: chức năng sparse-checkout chỉ có từ phiên bản git v2.26.0 trở lên