Git Submodule — Cara Pakai dan Konsep Dasar

Dasar Git Submodule

Menambahkan submodule

Untuk menambahkan Git submodule, gunakan perintah:

git submodule add <url> <path>

Perintah ini akan meng-clone repository lain ke dalam proyek sebagai subdirektori, tetapi tetap mempertahankan history-nya (repository tersebut) secara terpisah.

Keterangan:

Contoh penggunaan:

# Minimal harus menyebutkan URL-nya repo submodule
git submodule add https://github.com/user/repo.git

# Kalau path disebutkan, akan menggunakan path tersebut (libs/my-library)
git submodule add https://github.com/user/repo.git libs/my-library

# Bisa langsung track branch tertentu (opsional)
git submodule add -b main https://github.com/user/repo.git libs/my-library

Apa yang terjadi?

Setelah menjalankan perintah tersebut:

  1. Git meng-clone repositori submodule ke folder path (atau default-nya: mengikuti nama repositori)
  2. Git membuat file .gitmodules (kalau sebelumnya belum ada; kalau sudah ada, maka akan diupdate)
Note

Secara internal, di dalam direktori .git/modules di repo utamanya, Git juga membuat direktori <nama_submodule_atau_defaultnya_mengikuti_path>
untuk struktur internal git repo submodule-nya.

Lokasi direktori tersebut tertuliskan di file bernama .git di dalam folder repo submodule.

Kalau kita jalankan:

git status

di repo utamanya, akan terlihat changes:

Simpan perubahan:

git add .gitmodules <path>
git commit -m "Add submodule"
git push

Catatan penting:


Clone repo yang ada submodule-nya

Untuk pengguna lain (atau setelah clone ulang repo yang sudah ada submodule-nya):

git clone --recurse-submodules <url>

atau jika repo sudah ada:

git submodule update --init --recursive

Penjelasan:


Masalah umum

Beberapa masalah yang umum terjadi ketika menggunakan submodule:

cd <submodule>
git checkout <branch>
git submodule update --recursive

Hal yang sering membingungkan (terkait nama submodule)

Submodule punya "name" dan "path"

Di .gitmodules:

[submodule "libs/my-library"]
    path = libs/my-library
    url = ...

Secara default:


name menentukan struktur internal Git

Git menyimpan struktur internal submodule git di:

.git/modules/<name>

Jadi:


Memisahkan name dan path (advanced)

Gunakan:

git submodule add --name <name> <url> <path>

Contoh:

git submodule add --name belajar-dev \
  https://github.com/SmartechStudios/BelajarDev.git \
  mikhsan/Vaults/BelajarDev

Hasil:

Ini berguna kalau:


Perintah Git menggunakan path, bukan name

Contoh:

git submodule update --init mikhsan/Vaults/BelajarDev

Bukan:

git submodule update --init belajar-dev

Jangan ubah name sembarangan

Jika kamu mengubah:

[submodule "old-name"]

menjadi:

[submodule "new-name"]

Maka:

Jika terpaksa:

git submodule sync