Mengelola dependensi multi-repository: menyisipkan library eksternal ke repository utama dengan git submodule add, mengkloning repository bertingkat, serta membandingkan submodule dan subtree untuk memilih pendekatan yang paling cocok.

Di episode 17 kita menjelajah dan menyelamatkan riwayat dalam satu repository. Di episode 18 ini persoalannya melebar: bagaimana jika sebuah project membutuhkan kode dari repository lain — misalnya shared library yang dipakai tiga tim berbeda? Kita membahas dua cara resmi Git: Submodules dan Subtrees.
Ini masalah nyata di perusahaan: pustaka internal lib-auth, lib-design-system, atau lib-utils dipakai lintas tim, tapi setiap tim punya kode utama masing-masing. Naif jika menyalin-paste kode library ke tiap project — perbaikan bug di satu salinan tidak pernah sampai ke salinan lain. Submodule dan subtree adalah jawaban resminya.
Sebelum memilih alat, pastikan masalahnya benar. Multi-repository dibutuhkan ketika:
Jika library hanya dipakai satu project, pertimbangkan memindahkannya langsung ke dalam project itu. Dependency manager bahasa pemrograman (npm, pip, Bun) tetap pilihan utama; submodule dan subtree dipakai untuk kasus yang tidak tertangani alat-alat itu.
Submodule adalah commit eksternal yang disematkan ke repository utama. Repository utama hanya menyimpan referensi — sebuah pointer ke commit tertentu di repository lain.
git submodule add https://github.com/devnull/lib-auth.git libs/authPerintah di atas meng-clone lib-auth ke folder libs/auth dan mencatat referensinya di file .gitmodules:
[submodule "libs/auth"]
path = libs/auth
url = https://github.com/devnull/lib-auth.git.gitmodules ikut di-commit ke repository utama — dan di sinilah letak kelemahan utamanya, seperti akan kita lihat nanti.
git clone biasa tidak mengisi isi submodule — folder submodule datang kosong. Solusinya:
git clone --recurse-submodules https://github.com/devnull/my-app.gitUntuk repository yang sudah ter-clone:
git submodule update --init --recursiveFlag --recursive penting ketika submodule memiliki submodule lagi (repository bertingkat). Saat versi library naik, perbarui submodule lalu commit perubahan pointer-nya:
git submodule update --remote
git add libs/auth && git commit -m "chore: update lib-auth"Untuk memeriksa status seluruh submodule, termasuk apakah ada commit yang belum di-sinkronkan dengan versi yang direkam di .gitmodules:
git submodule statusBaris dengan prefix minus menandakan submodule belum di-inisialisasi, sementara baris dengan suffix tambahan menandakan working tree submodule menyimpang dari commit yang dikunci.
Subtree adalah pendekatan berlawanan: isi repository lain disalin langsung ke dalam tree repository utama, tanpa file pointer, tanpa .gitmodules:
git subtree add --prefix=libs/auth https://github.com/devnull/lib-auth.git mainHasilnya folder libs/auth berisi seluruh kode library yang di-commit biasa ke repository utama. Mengambil pembaruan dari upstream:
git subtree pull --prefix=libs/auth https://github.com/devnull/lib-auth.git mainKarena kodenya menyatu, alur kerjanya seperti file biasa: edit, commit, review lewat PR — tanpa ritual inisialisasi tambahan.
| Aspek | Submodule | Subtree |
|---|---|---|
| Penyimpanan | Pointer ke commit eksternal | Salinan penuh di dalam tree |
File .gitmodules | Wajib | Tidak ada |
| Kode langsung terbaca | Perlu update dan init dulu | Langsung ada di working tree |
| Update versi | git submodule update | git subtree pull |
| Kemudahan kolaborasi | Lebih rumit, mudah lupa init | Alur kerja git biasa |
| Jejak riwayat kode library | Tidak ada di repository utama | Tersimpan penuh |
Tip
Aturan praktis: jika anggota tim banyak dan nilai terpentingnya adalah kemudahan kolaborasi, subtree biasanya lebih ramah — tidak ada .gitmodules, tidak ada langkah init, dan PR berjalan seperti biasa. Pilih submodule jika kalian perlu mengunci versi library secara eksplisit per environment dan menerima biaya inisialisasi.
git submodule update. Tim men-download repository, submodule kosong, dan aplikasi error. Kenali gejalanya: folder submodule tampak ada tapi isinya tidak..gitmodules ikut ter-commit dan URL tidak berisi credential.main.Poin yang harus kalian bawa:
.gitmodules.git clone --recurse-submodules dan git submodule update --init --recursive mengisi submodule setelah clone..gitmodules — alur kerjanya seperti file biasa.Automasi di level repository sudah lengkap, tapi ada satu lapisan terakhir di sisi lokal: memastikan setiap commit berkualitas sejak dari laptop. Di episode 19 berikutnya kita membahas Git Hooks & Automasi Lokal untuk menjalankan linter, validasi pesan commit, dan unit test secara otomatis. Sampai jumpa di episode 19!