Hướng dẫn dùng tính năng submodule của Git

Trong môi trường phát triển phần mềm, phát triển các dự án lớn, chúng ta không thể gôm tất cả vào một repository trên gitlab hay github được, mà chia thành nhiều module lớn nhỏ khác nhau rồi trong project chính sẽ tiến hành clone source từ các module đó về để chạy.

Có nhiều cách để quản lý vấn đề trên, trong bài viết này mình sẽ hướng dẫn các bạn sử dụng một tính năng mà git cung cấp sẵn đó là submodule.

Thao tác với submodule

Mình sẽ đi qua với các lệnh cơ bản để làm việc trên submodule và sẽ có ví dụ ở gần cuối bài để các bạn dễ hình dun

Để add một module hay nói cách khác là 1 repo khác vào làm submodule cho project hiện hành mình sử dụng lệnh sau:

git submodule add <URL repo.git> <path_to_submodule_folder>

Trong đó:

  • <URL repo.git>: Đường dẫn để bạn git clone được repo về máy
  • <path_to_submodule_folder>: Đường dẫn local trên máy tới folder để chứa submodule, nếu path chưa có nó sẽ tự tạo

Khi mà bạn git clone project của bạn trên 1 máy khác, thì nó sẽ không tự động clone các submodule đã add xuống theo mà bạn cần phải chạy update và pull các submodule về.

git submodule update --init
git submodule update --recursive --remote
git pull --recurse-submodules

Một cái hay của việc dùng submodule là dễ dàng đồng bộ source code trên repository, bạn không cần phải clone module về để sửa, sau đó copy vào project của bạn, việc quản lý sẽ rắc rối hơn khi dự án lớn dùng nhiều submodule.

Khi bạn sử dụng git submodule như vậy thì các submodule này sẽ tương đương với bạn đã clone sẵn các module về, bạn có thể chỉnh sửa code trên đó và tiến hành git commit, git push lên repository. Sau đó chỉ việc ra ngoài folder gốc của project tiến hành commit.

Vậy khi submodule đó không sử dụng, hoặc bị lỗi cần add lại thì ta phải remove như thế nào? Chạy các lệnh sau đây theo trình tự để remove submodule

git submodule deinit <path_to_submodule_folder> -f
git rm <path_to_submodule_folder>
git commit -m "Remove submodule" .
rm -rf .git/modules/<path_to_submodule_folder>

Ví dụ tham khảo

Sau đây là ví dụ để các bạn dễ hình dung:

  • 1 project ansible-monitor: Sẽ là project để run setup các dịch vụ cho monitor, project này tập hợp  ansible-roles để sử dụng cho project
  • 4 repo ansible roles cơ bản cho setup server monitor:
    • ansible-role-grafana: Chứa role để setup grafana
    • ansible-roles-prometheus: Chứa role để setup prometheus
    • ansible-roles-exporters: Chứa role để setup các exporters dành cho prometheus
    • ansible-role-alertmanager: Chứa role để setup alertmanager

Trước tiên clone project ansible-monitor về

git clone https://gitlab.cloudcraft.info/mytest/ansible-monitor.git
cd ansible-monitor/

Để add 4 repo ansible-role-grafana, ansible-role-prometheus, ansible-role-exporters vào làm submodule ta chạy các lệnh sau

git submodule add https://gitlab.cloudcraft.info/ansible/ansible-role-grafana.git roles/ansible-role-grafana/
git submodule add https://gitlab.cloudcraft.info/ansible/ansible-roles-prometheus.git roles/ansible-roles-prometheus/
git submodule add https://gitlab.cloudcraft.info/ansible/ansible-roles-exporters.git roles/ansible-roles-exporters/
git submodule add https://gitlab.cloudcraft.info/ansible/ansible-role-alertmanager.git roles/ansible-role-alertmanager/

Sau khi chạy 4 lệnh trên, trong project ansible-monitor sẽ tạo thêm 1 folder roles, trong folder roles sẽ chứa 4 repo trên, sau khi add thì sẽ có 1 file .gitmodules được tạo, chứa thông tin các submodules

Cấu trúc folder sau khi add submodule

Folder roles được tạo và chứa các submodule

Thông tin file .gitmodules

Thông tin file .git/config

Ngoài ra lệnh git submodule còn nhiều tính năng nữa, các bạn có thể tham khảo thêm với lệnh help

Tham khảo:

https://git-scm.com/book/en/v2/Git-Tools-Submodules

https://cloudcraft.info/huong-dan-cai-dat-gitbucket-tren-centos-7/

Rate this post

LEAVE A REPLY

Please enter your comment!
Please enter your name here