Saat membangun aplikasi besar, sering kali kita butuh mengintegrasikan repository lain sebagai bagian dari project utama — misalnya library internal, shared components, atau third-party modules. Git menyediakan dua cara untuk mengelola dependency semacam ini: Submodule dan Subtree.
Kedua metode ini punya kelebihan dan kekurangan masing-masing. Artikel ini akan membahas cara kerja, use case, dan kapan menggunakan Submodule vs Subtree.
Apa itu Git Submodule?
Submodule adalah cara untuk menyimpan repository Git di dalam repository Git lain. Submodule tetap menjadi repository terpisah dengan histori commit sendiri, tapi di-track sebagai dependency oleh parent repository.
Karakteristik Submodule:
- Repository terpisah dengan
.gitsendiri - Parent repo hanya menyimpan pointer commit submodule
- Update submodule harus dilakukan manual
- Cocok untuk library/module yang aktif dikembangkan secara terpisah
Cara Menggunakan Git Submodule
1. Menambahkan Submodule
git submodule add https://github.com/username/library.git libs/library
Perintah ini:
- Clone repository
libraryke folderlibs/library - Membuat file
.gitmodulesyang menyimpan konfigurasi submodule - Menambahkan pointer commit submodule ke parent repo
File .gitmodules yang dihasilkan:
[submodule "libs/library"]
path = libs/library
url = https://github.com/username/library.git
Commit perubahan:
git add .gitmodules libs/library
git commit -m "Add library submodule"
git push
2. Clone Repository dengan Submodule
Saat clone repository yang punya submodule:
git clone https://github.com/username/main-project.git
cd main-project
Folder submodule kosong. Kamu harus init dan update:
git submodule init
git submodule update
Atau clone langsung dengan submodule:
git clone --recurse-submodules https://github.com/username/main-project.git
3. Update Submodule ke Commit Terbaru
Submodule tidak otomatis update. Kamu harus manual:
Masuk ke folder submodule:
cd libs/library
git pull origin main
cd ../..
Commit pointer commit baru:
git add libs/library
git commit -m "Update library submodule"
git push
Cara cepat update semua submodule:
git submodule update --remote
4. Menghapus Submodule
Menghapus submodule agak tricky:
git submodule deinit libs/library
git rm libs/library
rm -rf .git/modules/libs/library
git commit -m "Remove library submodule"
Apa itu Git Subtree?
Subtree adalah cara untuk menyimpan repository lain sebagai bagian dari repository utama. Berbeda dengan submodule, subtree tidak memiliki .git terpisah — semua histori commit dari subtree menjadi bagian dari parent repo.
Karakteristik Subtree:
- Menjadi bagian integral dari parent repo
- Tidak butuh command khusus saat clone
- Histori commit subtree menyatu dengan parent repo
- Cocok untuk library yang jarang diupdate atau untuk vendor dependencies
Cara Menggunakan Git Subtree
1. Menambahkan Subtree
Tambahkan remote untuk repository library:
git remote add library-remote https://github.com/username/library.git
Fetch dan tambahkan sebagai subtree:
git subtree add --prefix=libs/library library-remote main --squash
Penjelasan:
--prefix=libs/library: Path di mana subtree disimpanlibrary-remote main: Remote dan branch--squash: Gabungkan semua histori subtree jadi satu commit (opsional, tapi recommended)
Commit dan push:
git push
2. Clone Repository dengan Subtree
Subtree otomatis ter-include saat clone:
git clone https://github.com/username/main-project.git
Tidak ada command tambahan! Folder subtree langsung ada dengan semua filenya.
3. Update Subtree dari Repository Upstream
Pull update terbaru:
git subtree pull --prefix=libs/library library-remote main --squash
Git akan fetch commit baru dari remote dan merge ke subtree.
4. Push Perubahan Subtree ke Repository Upstream
Jika kamu melakukan perubahan di subtree dan ingin push ke repository aslinya:
git subtree push --prefix=libs/library library-remote main
5. Menghapus Subtree
Karena subtree adalah bagian dari parent repo, kamu cukup hapus folder:
git rm -r libs/library
git commit -m "Remove library subtree"
git push
Submodule vs Subtree: Perbandingan
| Aspek | Submodule | Subtree |
|---|---|---|
| Struktur | Repository terpisah | Bagian dari parent repo |
| Clone | Butuh --recurse-submodules |
Otomatis ter-include |
| Update | Manual (git submodule update) |
git subtree pull |
| Histori | Histori terpisah | Histori menyatu |
| Kompleksitas | Lebih complex, butuh command khusus | Lebih simple untuk end user |
| Use Case | Library yang aktif dikembangkan | Vendor dependencies, library stabil |
Kapan Menggunakan Submodule?
✅ Library yang sering diupdate:
- Shared component library di monorepo perusahaan
- Plugin atau extension yang dikembangkan terpisah
✅ Butuh kontrol versi yang ketat:
- Setiap developer bisa pin ke commit spesifik
✅ Repository dependency besar:
- Tidak ingin semua histori dependency masuk ke parent repo
Kapan Menggunakan Subtree?
✅ Vendor dependencies yang jarang diupdate:
- Third-party library yang sudah stabil
- Framework atau SDK yang jarang berubah
✅ Simplicity untuk tim:
- Tidak ingin developer repot dengan
git submodule update - Ingin clone langsung jalan tanpa command tambahan
✅ Butuh merge histori:
- Ingin melacak perubahan subtree dalam histori parent repo
Tips Menggunakan Submodule dan Subtree
✅ Untuk Submodule:
- Selalu dokumentasikan cara init dan update di README
- Gunakan
git clone --recurse-submodulessaat clone - Set auto-update di CI/CD pipeline
✅ Untuk Subtree:
- Gunakan
--squashuntuk menghindari histori yang berantakan - Dokumentasikan remote URL untuk update
- Buat script untuk mempermudah pull/push
✅ General:
- Jangan mix submodule dan subtree untuk dependency yang sama
- Pilih satu metode dan konsisten
- Untuk monorepo modern, pertimbangkan tools seperti Git Worktrees atau Turborepo
Kesimpulan
Submodule dan Subtree adalah dua cara berbeda untuk mengelola dependency antar repository:
- Submodule: Repository terpisah, butuh command khusus, cocok untuk library yang aktif dikembangkan
- Subtree: Bagian dari parent repo, lebih simple, cocok untuk vendor dependencies
Key Takeaway:
- Gunakan Submodule jika butuh kontrol versi ketat dan library sering diupdate
- Gunakan Subtree jika ingin simplicity dan library jarang berubah
- Dokumentasikan workflow yang dipilih agar tim tidak bingung
Di artikel berikutnya, kita akan membahas Monorepo dengan Git: Strategi dan Tools. Stay tuned!
Kiki/🎮🍉⌨️🍩💻