Bayangkan kita mempunyai aplikasi web berbasis ... well, Wordpress –uhukk–, dimana kita banyak membuat plugin dan template di dalamnya. Lebih sadis lagi jika semangat open source di dalam diri kita yang berkobar-kobar, membuat kita ingin men-share plugin atau template yang kita buat di dalam aplikasi tersebut ke orang lain. Wajarnya, hal ini akan sulit dilakukan, terutama jika kita menempatkan aplikasi di dalam satu repositori.

Ada beberapa cara yang bisa kita lakukan. Cara paling jahiliyyah adalah membuat folder dan repositori sendiri untuk tiap plugin dan template yang terpisah dari aplikasi, dimana kita bisa melakukan update secara regular kesana. Di satu sisi, jika ada update dari plugin yang kita gunakan, kita harus men-download plugin tersebut lalu menyalinnya ke dalam aplikasi kita. Sehingga plugin di dalam aplikasi kita juga ter-update. Selanjutnya, kita tinggal meng-commit perubahan tersebut. Cukup jahiliyyah.

Saya sendiri tidak menyarankan hal itu, selain karena merepotkan, juga karena ada solusi lain yang lebih efisien untuk menangani problem tersebut. Saya perkenalkan messiah untuk masalah tersebut, yaitu git subtree. Perintah git subtree di dalam git yang dapat membuat folder di dalam suatu repositori dapat terhubung dengan remote repositori, tanpa membuat repositori di dalam repositori. Masih bingung? Lihat gambar dibawah ini.

Git Subtree

Sumber gambar: Atlassian.com

Dari gambar di atas, bisa kita simpulkan bahwa kita dapat memasukkan sebuah folder (Local Machine Repo 2) ke dalam suatu repositori (Local Machine Repo 1) dan kita tetap dapat meng-update baik ke Bitbucket Repo 1 atau pun Bitbucket Repo 2. Atau dengan kata lain, melihat kasus kita di atas, semisal kita melakukan perubahan terhadap plugin di dalam aplikasi, kita dapat melakukan commit-nya dan push perubahan tersebut ke repositori aplikasi. Selanjutnya, kita juga bisa melakukan push lagi ke repositori khusus plugin telah kita siapkan.

Menggunakan git subtree

Sebagai contoh, saya mempunyai sebuah repositori bernama main-module di https://github.com/glendmaatita/main-module. Selanjutnya, di dalam main-module tersebut saya mempunyai module lagi bernama module-1 yang berlokasi di folder module1, tepatnya di main-module/module1. Module-1 inilah yang akan saya share ke orang lain. Saya membuat repositori lain untuk module ini di https://github.com/glendmaatita/module-1.

Pertama, saya akan clone main-module terlebih dahulu.

~$ git clone git@github.com:glendmaatita/main-module.git

Langkah berikutnya adalah menambahkan remote repositori untuk module-1. Remote repositori ini secara lokal akan kita beri nama module-1.

~$ git remote add module-1 git@github.com:glendmaatita/module-1.git

Langkah berikutnya adalah memberi tahu ke git bahwa kita mempunyai sebuah folder yang terkoneksi dengan remote repositori module-1

~$ git subtree add --prefix=module1/ module-1 master --squash

Sampai disini kita bisa melakukan perubahan sesuka kita, baik di dalam module1 ataupun di folder lainnya. Jika sudah dan hendak melakukan push ke remote repositori, kita bisa melakukan ritual seperti biasa.

~$ git commit -am "Update dari saya"

Hal menarik bisa bermula disini. Selain ke remote repositori main-module, kita juga dapat melakukan push ke repositori module-1, spesifik untuk segala perubahan yang terjadi di module-1.

~$ git push origin master
~$ git subtree push --prefix=module1/ module-1 master 

Sebaliknya, jika ada perubahan di remote repositori module-1 kita dapat mengambil update tersebut untuk secara otomatis di-merge ke main-module

~$ git subtree pull --prefix=module1/ module-1 master --squash

Menarik bukan? Kita bisa mengkombinasikan teknik di atas dengan hook misalnya, sehingga kita tidak perlu repot melakukan subtree push tiap kali ada perubahan.