tutorial, git,

Git Submodule vs Subtree: Mengelola Dependency antar Repository

Kiki/🎮🍉⌨️🍩💻 Kiki/🎮🍉⌨️🍩💻 Sep 29, 2026 · 5 mins read
Git Submodule vs Subtree: Mengelola Dependency antar Repository
Share this

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 .git sendiri
  • 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 library ke folder libs/library
  • Membuat file .gitmodules yang 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 disimpan
  • library-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-submodules saat clone
  • Set auto-update di CI/CD pipeline

✅ Untuk Subtree:

  • Gunakan --squash untuk 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/🎮🍉⌨️🍩💻
Written by Kiki/🎮🍉⌨️🍩💻
hello I'm friend K.