Git Submodules

Git ขั้นสูง

Amanda Crawford-Adamo

Software and Data Engineer

Git Submodule คืออะไร?

Git Submodule

git submodule
  • repository ที่ซ้อนอยู่ภายใน repository อื่น
  • มี version control และประวัติแยกจากกัน
  • การเปลี่ยนแปลงใน submodule ไม่กระทบ repo หลัก
  • repo หลักอ้างอิง submodule ได้ในเวอร์ชันที่ระบุ

ภาพแสดง repo ที่มี repository หลายรายการอยู่ภายใน

Git ขั้นสูง

การเพิ่ม submodule

เพิ่ม submodule โดยใช้ลิงก์หรือไดเรกทอรีภายใต้โฟลเดอร์ที่กำหนด

git submodule add <repository link|dir> <path>

$$

ตัวอย่าง

เพิ่มไลบรารี data validator เข้าสู่โปรเจกต์ ETL ไว้ในโฟลเดอร์ libs/validator ของ ETL repo

git submodule add https://github.com/example/data-validator.git libs/validator
Git ขั้นสูง

การดูรายการ submodule

แสดงรายการ submodule ทั้งหมดในโปรเจกต์

git submodule status

ตัวอย่าง

$ git submodule status
e1f2...7w8x9 data_cleaning_lib
a1b2...q7r8 api_connector
d9e8...t3u2 visualization_toolkit
Git ขั้นสูง

การอัปเดต submodule

อัปเดต submodule ให้เป็นเวอร์ชันล่าสุด

มีหลายตัวเลือก:

  1. อัปเดต submodule ทั้งหมดที่ซอร์สโค้ดอยู่บนเครื่อง local
    git submodule update --init 
    
  2. อัปเดต submodule ทั้งหมดที่ซอร์สโค้ดอยู่บน remote repo
    git submodule update --init --remote 
    
  3. อัปเดต submodule ที่ระบุ
    git submodule update --init <path_to_submodule>
    
Git ขั้นสูง

การลบ submodule

ขั้นตอนการลบ submodule

  1. ยกเลิกการเริ่มต้น submodule
    git submodule deinit <submodule_name>
    
  2. ลบ submodule ออกจาก index ของ git repo
    git rm <path>
    
Git ขั้นสูง

การแยก submodule ออกจาก repo ขนาดใหญ่

  1. คัดลอกไฟล์ทั้งหมดที่ต้องการใส่ใน submodule repo ใหม่ไปยังโฟลเดอร์อื่นนอก repo

  2. ภายในโฟลเดอร์ใหม่ สร้าง repository สำหรับ submodule:

    git init <new-submodule>
    
  3. ใช้ filter-repo ของ git เพื่อแยกไฟล์และประวัติที่เกี่ยวข้องออกจากโปรเจกต์หลัก:

    git filter-repo --path <extract_path> --invert-paths
    
  4. เพิ่ม repository ที่แยกออกมาเป็น submodule ในโปรเจกต์หลัก:

    git submodule add <new-submodule_path> <path_to_store_submodule>
    
Git ขั้นสูง

เมื่อใดควรใช้ submodule และแนวปฏิบัติที่ดี

กรณีการใช้งาน:

  1. จัดการไลบรารีภายนอก
  2. แชร์โค้ดข้ามโปรเจกต์
  3. ดูแลเวอร์ชันเฉพาะของ dependency

แนวปฏิบัติที่ดี:

  1. อัปเดต submodule ให้เป็นปัจจุบันอยู่เสมอ
  2. ใช้ relative path
  3. แจ้งทีมเมื่อมีการเปลี่ยนแปลง
Git ขั้นสูง

มาฝึกกันเถอะ!

Git ขั้นสูง

Preparing Video For Download...