Update Massal Koleksi Repo Git

Am not a data hoarder, tapi memang rajin menyimpan berkas yang didapat dari berkelana di internet.

Ada banyak variabel yang membuat saya lebih menyukai menyimpan berkas di lokal. Misalnya saja data di internet tidak akan berada di sana selamanya dan koneksi internet yang tidak selalu ada. Jadi, jika ada berkas yang lumayan saya butuhkan maka saya akan menyimpannya. Ada laman web yang memuat informasi penting? I’ll save it.
Demikian juga dengan repo git. Walau sedang tidak memiliki koneksi internet, atau si empunya repo menghapus reponya tersebut maka saya akan tetap memiliki akses.

Mulanya, saya hanya menyimpan koleksi repo git ini di satu folder dan –jika dirasa perlu– memutakhirkannya satu per satu. Memang sederhana jika reponya sedikit, namun jika mencapai puluhan ya lumayan merepotkan.

Kemudian saya membuat sebuah skrip Bash untuk memutakhirkan repo-repo tersebut secara otomatis. Skripnya sederhana saja; ia akan mendaftar seluruh folder repo kemudian masuk ke dalam folder-folder tersebut dan melakukan git pull.

Sampai akhirnya terantuk laman https://stackoverflow.com/questions/1030169/easy-way-to-pull-latest-of-all-git-submodules. Then I realize what a fool I was.

Ternyata git memiliki perintah foreach yang bekerja layaknya loop pada bahasa pemrograman pada umumnya. Dan untuk kasus menyimpan repo seperti di atas, lebih baik jika repo-repo tersebut disimpan saja sebagai submodule. Jadi alih-alih membuat skrip Bash untuk memutakhirkan banyak repo, kita simpan repo sebagai submodule dan menggunakan git foreach untuk memutakhirkan semuanya sekaligus.

Manual is boring, jadi pastinya gist ini akan cukup membantu yang masih awam untuk mengenal submodule.
Ringkasnya sih seperti berikutlah yang saya lakukan:

  • Buat sebuah folder untuk menempatkan koleksi repo.

  • Masuk ke dalam folder tersebut dan jalankan perintah git init untuk menginisiasi folder ini sebagai repo.

  • Gandakan repo yang hendak dikoleksi sebagai submodule. Misalnya:

    git submodule add https://github.com/rizaumami/kbbi
    

    Ulangi sebanyak yang diperlukan.

  • Mutakhirkan seluruh koleksi repo sekaligus dengan menggunakan perintah berikut:

    git submodule foreach "(git checkout master; git pull)&"
    

    Yang artinya, untuk tiap submodule, lakukan checkout ke master kemudian lakukan git pull.
    Tanda ampersand (&) di ujung baris menunjukkan perintah dilempar ke latar belakang, jadi sekilas akan tampak sebagai async.

Demikianlah saya menulis artikel ini agar memiliki salinan sendiri untuk trik yang dirasa berguna dan nantinya tidak terlalu bergantung pada tautan antah-berantah di internet.

Cheers ….