updated July 05, 2024408 views

Git Submodule là một tính năng của Git, cho phép bạn nhúng một kho lưu trữ Git khác vào một kho lưu trữ Git hiện có. Khi bạn sử dụng Git Submodule, kho lưu trữ cha sẽ giữ một liên kết đến kho lưu trữ con. Khi bạn clone hoặc checkout kho lưu trữ cha, Git sẽ tự động tải xuống và cập nhật kho lưu trữ con.

Trang web của tôi đã là mã nguồn mở trên Github, tất cả nội dung đều được lưu trữ công khai. Nhưng vì một số lý do nên tôi quyết định lưu nội dung đăng tải của mình ở một repostory khác và đặt chế độ private. Nếu bạn đi đến repo trang web của tôi, bạn sẽ thấy một thư mục trông như thế này _posts @ <hash> (đây là thư mục tôi lưu các bài viết của tôi). Nếu bạn click vào nó, bạn sẽ được đưa đến trang báo lỗi 404 và khi tôi nhấp vào nó, tôi sẽ được đưa đến một repo riêng tư chứa tất cả hình ảnh và bài đăng của tôi.

Cách sử dụng Submodule, Git Submodule, Private Repo Submodules

Rất nhiều người đã hỏi tôi cách sử dụng private git submodules, vì vậy tôi sẽ nói qua ở đây. Lưu ý rằng đây không phải là phần đi sâu vào Submodule mà chỉ là những kiến ​​thức cơ bản về thêm, cập nhật và sao chép một repo với Submodules.

Git Submodules

Git Submodule là tính năng của Git cho phép bạn liên kết một repository git khác vào một thư mục trong repository của bạn. Điều này cho phép bạn quản lý các thư viện hoặc mã nguồn đó như một đối tượng riêng biệt trong repository của bạn, giúp bạn quản lý phiên bản và cập nhật dễ dàng.

Trước khi làm bất cứ điều gì với Submodule, tôi khuyên bạn nên chạy lệnh sau để cập nhật cấu hình và đặt submodule-recurse thành true, cho phép git clonegit pull tự động cập nhật các mô-đun con.

git config --global submodule.recurse true
LệnhMô tả
git submodule add <repo>Thêm một mô-đun con trong một kho lưu trữ.
git submodule updateCập nhật các mô-đun con hiện có trong kho lưu trữ (thêm --remote để kéo từ một vị trí từ xa).
git submodule initKhởi tạo tệp mô-đun con cục bộ (sử dụng nếu repo không được sao chép với --recurse-submodules.

Thêm một Submodule

Thêm một repository git vào dạng submodule trong repository của bạn:

  • Giả sử ta có 2 repo:

    • Một repo public: github.com/you/blog
    • Một repo private: github.com/you/posts
  • Trước tiên, bạn sẽ add repo private vào repo public bằng cách từ thư mục gốc của souce code, chạy lệnh:

    git submodule add https://github.com/you/posts.git posts
    

    Với đoạn lệnh trên thì khi chạy Git nó sẽ tạo cho bạn 1 file .gitmodules và clone 1 thư mục có tên là posts. Bạn có thể chạy lênh git status thì sẽ thấy kết quả như:

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   .gitmodules
	new file:   posts

Trông file .gitmodules sẽ có nội dung tương tự như sau:

[submodule "posts"]
	path = posts
	url = https://github.com/you/posts

Bây giờ bạn có thể push .gitmodulesposts lên thế là xong!

Deploy lên Netlify

Với ví dụ trên thì Submodule ở chế độ Private. Do vậy để Netlify tự động tìm và nạp lên được thì bạn có thể tham khảo thêm cách thực hiện tại đây hoặc làm theo các bước sau:

  1. Sửa url trong file .gitmodules thành dạng SSH (ví dụ: git@github.com:you/posts.git)
  2. Lấy Deploy key từ Netlify.
  3. Thêm Deploy Key vừa lấy vào repo private (vào Setting → Deploy Keys) ở chế độ Read-only là xong.

Như vậy khi bạn push code lên thì Netlify sẽ tự động tìm nạp module con từ file .gitmodules