Git Submodule
Cập nhật lần cuối
Submodule nhúng một repository Git vào bên trong một repository khác, cố định ở một commit cụ thể. Repo cha ghi lại commit nào của submodule mà nó phụ thuộc, nên ai cũng nhận được cùng một phiên bản. Đây là cách đưa vào một thư viện hoặc thành phần dùng chung có repository riêng mà không phải sao chép code của nó.
Bạn có thể thử các lệnh này trong terminal playground: một shell thật ngay trên trình duyệt, không cần cài đặt gì.
Cú pháp
| Lệnh | Tác dụng |
|---|---|
git submodule add <url> libs/x | Thêm một repo làm submodule tại libs/x |
git clone --recurse-submodules <url> | Clone một repo cùng các submodule của nó |
git submodule update --init --recursive | Khởi tạo và tải submodule sau khi clone thông thường |
git submodule update --remote | Cập nhật submodule lên commit mới nhất |
git submodule status | Hiện commit của từng submodule |
Tình huống thường gặp
| Mục tiêu | Lệnh |
|---|---|
| Clone một dự án có dùng submodule | git clone --recurse-submodules <url> |
| Tải submodule khi đã clone xong | git submodule update --init --recursive |
| Nâng submodule lên bản mới nhất | git submodule update --remote |
Câu hỏi thường gặp về git submodule
Git submodule là gì?
Submodule là một repository Git lồng bên trong một repository Git khác, cố định ở một commit. Repo cha lưu con trỏ tới đúng commit đó thay vì các tệp của submodule, nên mọi người cùng làm việc sẽ checkout cùng một phiên bản. Submodule dùng để đưa vào một dependency hoặc thành phần dùng chung có repo và lịch sử riêng.
Làm sao clone một repository có submodule?
git clone --recurse-submodules <url> để clone repo cha và mọi submodule trong một bước. Nếu bạn đã clone mà quên cờ đó, chạy git submodule update --init --recursive sau đó để lấp đầy các thư mục submodule.Làm sao cập nhật submodule lên commit mới nhất?
git submodule update --remote, lệnh này fetch nhánh mà mỗi submodule theo dõi và chuyển nó tới commit mới nhất. Sau đó commit thay đổi trong repo cha, vì repo cha ghi lại commit submodule mà nó trỏ tới: bản cập nhật chưa được lưu cho tới khi bạn commit con trỏ đó.Vì sao thư mục submodule trống sau khi clone?
--recurse-submodules, nên Git tạo thư mục nhưng không tải nội dung về. Khắc phục bằng git submodule update --init --recursive, lệnh này khởi tạo và tải về mọi submodule.Có thể luyện tập lệnh này online không?
git submodule trong một shell thật ngay trên trình duyệt, không cần cài đặt gì. Khóa học Git tương tác miễn phí của Coddy cũng hướng dẫn từng bước cách thiết lập repository.