Cách biến một thư mục trong kho lưu trữ Git thành một Mô-đun con

Tác giả sysadmin, T.Bảy 18, 2023, 01:19:54 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách biến một thư mục trong kho lưu trữ Git thành một Mô-đun con


Mô-đun con Git giống như kho lưu trữ trong kho lưu trữ, cho phép bạn đưa các thư viện mã bên ngoài hoặc phần phụ thuộc vào dự án của mình, tất cả mà không cần liên kết kiểm soát phiên bản của mô-đun với chính dự án. Điều này giữ cho các mô-đun tách biệt và dễ dàng cập nhật, đồng thời dễ dàng chuyển đổi một thư mục thành một mô-đun con mới.


1. Submodule trong Git là gì?

Một Mô-đun con là một kho lưu trữ Git được nhúng trong một kho lưu trữ Git khác. Điều này cho phép bạn bao gồm mã từ dự án khác dưới dạng phần phụ thuộc, trong khi vẫn duy trì quyền kiểm soát phiên bản của chính dự án đó.

Khi bạn sao chép kho lưu trữ chính, nó cũng tự động sao chép kho lưu trữ Mô-đun con. Điều này có nghĩa là mã của mô-đun con và lịch sử Git được tách biệt khỏi điều khiển phiên bản chính và có thể được cập nhật cho nhiều kho lưu trữ sử dụng thư viện.

Một giải pháp thay thế cho các mô-đun con là xuất bản các thư viện của bạn dưới dạng các gói tới các trình quản lý gói như NPM, Maven hoặc NuGet. Tuy nhiên, điều này không hiệu quả với tất cả các loại dự án và nếu bạn đang làm việc với mã riêng, bạn sẽ cần thiết lập sổ đăng ký gói riêng, việc này có thể phức tạp hơn là chỉ nhúng mã nguồn của thư viện dưới dạng Mô-đun con.

Một trong những vấn đề chính khi biến một thư mục hiện có thành một Mô-đun con là Mô-đun con đó phải được quản lý bên ngoài. Git mong bạn tạo một thư mục trống mới cho nó và sao chép mô-đun con vào dự án. Bạn có thể sao chép mã vào một thư mục mới, nhưng bạn sẽ mất tất cả lịch sử Git liên quan đến nó, điều này có thể rất bất lợi trong các dự án lớn. Thay vào đó, chúng tôi sẽ sao chép kho lưu trữ, lọc mã không cần thiết và đẩy lịch sử mới sang Mô-đun con mới.

2. Cách biến một thư mục thành một mô-đun con

Bước đầu tiên là tạo một kho lưu trữ mới cho Mô-đun con. Điều này thường có trên dịch vụ lưu trữ Git như GitHub, mặc dù bạn có thể tạo kho lưu trữ cục bộ trên máy tính của mình.

Tiếp theo, bạn sẽ muốn lấy một bản sao mới của kho lưu trữ chính của mình để tạo kho lưu trữ Mô-đun con từ đó.

Mã nguồn [Chọn]
git clone [email protected]:username/repository.git submodule-repo
Mã nguồn [Chọn]
cd submodule-repo
Tiếp theo, bạn sẽ muốn lọc ra mọi thứ không liên quan đến Mô-đun con của mình. Thao tác này sẽ xóa tất cả lịch sử cam kết không liên quan đến mã có trong Mô-đun con. Đây là một hoạt động phá hoại, vì vậy hãy đảm bảo rằng bạn đang thực hiện việc này trên bản sao của repo chứ không phải bản chính.

Mã nguồn [Chọn]
git filter-branch --subdirectory-filter submoduledirectory -- --all
Bạn sẽ chỉ còn lại mã trong thư mục và chỉ các cam kết liên quan đến nó. Điều này sẽ cho phép bạn chuyển qua tất cả lịch sử Git liên quan đến Mô-đun con đó.

Bạn sẽ muốn thay đổi URL từ xa của thư mục mô-đun này thành kho lưu trữ mô-đun con mới của bạn, thường được đặt tên là "origin".

Mã nguồn [Chọn]
git remote set-url origin https://github.com/new-repository.git
Sau đó, bạn có thể đẩy lịch sử như bình thường.

Mã nguồn [Chọn]
git push -u origin main
3. Thêm một Mô-đun con mới

Quay lại dự án chính, bạn sẽ muốn thêm Mô-đun con.

Trước tiên, bạn cần ngừng theo dõi thư mục mà bạn muốn chuyển thành Mô-đun con từ kho lưu trữ mẹ. Nó sẽ vẫn ở đó trong lịch sử phiên bản của Git và dù sao thì bạn cũng chỉ cần thêm nó vào kho lưu trữ mô-đun mới.

Mã nguồn [Chọn]
rm -rf directory_name
Tiếp theo, bạn có thể thêm URL từ xa cho kho lưu trữ Mô-đun con mà bạn đã tạo trên Github bằng cách sử dụng git submodule addlệnh:

Mã nguồn [Chọn]
git submodule add [email protected]:username/repository.git directory_name
Khi bạn chạy lệnh này, Git sẽ tạo một thư mục mô-đun con mới trong kho lưu trữ chính và nó sẽ sao chép kho lưu trữ mô-đun con vào thư mục này. Nó cũng sẽ bắt đầu theo dõi lại thư mục mô-đun.

Để cập nhật Mô-đun con, bạn có thể sử dụng lệnh git submodule update:

Mã nguồn [Chọn]
git submodule update --remote submodule_name