Jurus Reinkarnasi Git & Sparse Checkout untuk Repo Ramping

Mengatasi obesitas repositori web statis dari 1.7 GB menjadi kurang dari 500 MB menggunakan kombinasi trik nuklir di Codespaces dan filter cerdas di lokal.

Pernahkah kamu mengecek ukuran folder proyek web statismu dan mendadak terkejut karena ukurannya sudah menyaingi installer game PC zaman dulu? Hal ini sering kali menjadi mimpi buruk bagi para pengembang yang rutin memperbarui konten situs mereka. Beberapa waktu lalu, saat melakukan audit penyimpanan untuk blog statis, aku menemukan fakta mengejutkan: repositori utama membengkak hingga menyentuh angka 1.7 GB.

Setelah diinvestigasi lebih dalam menggunakan perintah terminal, tersangka utamanya langsung terlihat jelas. Berikut adalah hasil audit ukuran folder yang aku jalankan:

◎ du -h --max-depth=1 | sort -hr
1,7G .
1,2G ./.git
344M ./node_modules
36M ./artikel
11M ./sistem-terbuka
8,2M ./warta-tekno
7,8M ./.well-known
6,0M ./jejak-sejarah
5,7M ./opini-sosial
4,1M ./lainnya
3,7M ./dapur
3,1M ./ext
2,9M ./gaya-hidup
2,4M ./mini
2,3M ./olah-media
980K ./.github
928K ./sementara
100K ./artikelx
24K ./functions
20K ./search
16K ./.devcontainer

Folder .git mendominasi dengan ukuran 1.2 GB, sementara node_modules memakan sekitar 344 MB. Git pada dasarnya beroperasi seperti seorang "tukang nimbun" data. Setiap kali kita mengubah baris kode, membuat HTML baru, atau menukar gambar resolusi tinggi dengan versi terkompresi, Git menyimpan snapshot riwayat tersebut secara abadi.

Ilustrasi terminal Git saat melakukan sparse checkout dan kompresi data

Meskipun file berukuran besar sudah lama kita hapus dari folder proyek, file tersebut secara fisik masih tersimpan di dalam perut folder .git. Hal ini dirancang agar kita bisa membatalkan perubahan ke masa lalu. Namun, untuk sebuah blog di mana kita hanya peduli pada hasil akhir artikel, menimbun riwayat commit selama bertahun-tahun hanyalah beban yang menghabiskan ruang penyimpanan dan memperlambat proses otomasi.

Sebelum mengambil langkah ekstrem, aku mencoba melakukan terapi pijat refleksi menggunakan perintah git gc --prune=now --aggressive. Perintah ini memaksa Git untuk memampatkan riwayat, membuang perubahan menggantung yang tidak terpakai, dan merapikan struktur data secara menyeluruh. Bagi repositori yang sudah bertahun-tahun bereksperimen, pembersihan ini ibarat membuang tumpukan sampah sejarah yang tidak pernah lagi kita kunjungi.

Operasi Sedot Lemak Repositori (Jalur Nuklir)

Ada kalanya perintah pembersihan standar tidak cukup efektif. Jika riwayat masa lalu benar-benar tidak lagi relevan, kita bisa mengambil jalur reinkarnasi total. Namun, menghapus dan memaksa unggah ulang (force push) data bergiga-giga menggunakan koneksi internet lokal bisa membuat kipas laptop berputar kencang dan memakan waktu berjam-jam.

Solusi paling cerdas adalah meminjam tenaga mesin cloud seperti GitHub Codespaces. Dengan kecepatan internet cloud yang menembus hitungan Gigabit, operasi seberat apa pun dapat selesai dalam hitungan detik. Biarkan server raksasa yang bekerja keras, sementara kita tetap bersantai.

Di dalam terminal Codespaces, jalankan rangkaian eksekusi pemungkas ini untuk menghancurkan riwayat lama dan melahirkan kembali repositori yang segar:

# 1. Hapus folder .git lama sampai ke akar-akarnya
rm -rf .git
# 2. Inisialisasi ulang Git dari nol (Fresh Start)
git init
# 3. Tambahkan semua file dan buat commit pertama yang baru
git add .
git commit -m "feat: Reinkarnasi repositori (Fresh Start)"
# 4. Sambungkan lagi ke repo jarak jauh
git remote add origin https://github.com/frijal/LayarKosong.git
# 5. Paksa Push (Timpa repo lama dengan yang baru)
git push -u --force origin main

Begitu rangkaian perintah di atas selesai, repositori yang tadinya raksasa akan langsung menyusut drastis. Berdasarkan uji coba, proses ini berhasil memangkas ukuran dari 1.7 GB menjadi kurang dari 500 MB. Alur kerja GitHub Actions pun dipastikan akan memuat repositori dengan jauh lebih gesit.

Strategi Diet Lokal dengan Git Sparse Checkout

Setelah repositori di server kembali sehat, langkah selanjutnya adalah mengamankan laptop lokal kita. Web statis umumnya memiliki ribuan aset visual di dalam folder khusus gambar dan banyak modul di dalam folder dependensi. Mengunduh semua itu saat koneksi internet sedang labil tentu sangat menyiksa.

Di sinilah teknik Sparse Checkout hadir sebagai solusi elegan. Secara harfiah, teknik ini memungkinkan kita untuk melakukan ekstraksi hanya pada subset file tertentu. Kita bisa memilih folder mana saja yang boleh muncul di layar laptop kita, tanpa perlu menghapusnya dari repositori utama di GitHub.

Langkah 1: Clone Tanpa Beban

Proses dimulai saat kita mengunduh repositori menggunakan GitHub CLI. Kita menambahkan filter blob:none agar Git menunda pengunduhan isi file besar sampai kita benar-benar membutuhkannya di masa depan.

# Login dan clone dengan filter khusus
gh auth login
gh repo clone frijal/LayarKosong -- --filter=blob:none --sparse --depth 1
# Masuk ke direktori
cd LayarKosong/

Langkah 2: Mematikan Mode Cone

Git modern menggunakan mode Cone secara bawaan, yang dirancang hanya untuk mencakup folder secara utuh. Karena kita ingin menggunakan pola pengecualian yang spesifik (menggunakan tanda seru), kita wajib mematikan mode tersebut dan menginisialisasi ulang aturannya.

git config core.sparseCheckoutCone false
git sparse-checkout init

Langkah 3: Menetapkan Aturan Gaib

Bagian inti dari teknik ini adalah memberitahu Git untuk mengambil semua dokumen, tetapi mengabaikan folder raksasa seperti gambar, alur kerja, dan modul node secara mutlak.

git sparse-checkout set --no-cone "/*" "!/img/" "!/.github/workflows/" "!/node_modules/"

Seketika, folder raksasa tersebut akan lenyap dari penjelajah berkas di komputer kita. Namun jangan panik, mereka tetap bersandar dengan aman di dalam server GitHub, dan status Git di komputer lokal akan selalu terbaca bersih. Sebagai bukti nyata, berikut adalah log terminal asli saat seluruh rangkaian proses ini dieksekusi dalam satu tarikan napas:

◎ gh repo clone frijal/LayarKosong -- --filter=blob:none --sparse --depth 1
Cloning into 'LayarKosong'...
remote: Enumerating objects: 2773, done.
remote: Counting objects: 100% (2773/2773), done.
remote: Compressing objects: 100% (1415/1415), done.
Receiving objects: 100% (2773/2773), 559.88 KiB | 2.23 MiB/s, done.
◎ cd LayarKosong/
◎ git config core.sparseCheckoutCone false
◎ git sparse-checkout init
◎ git sparse-checkout set --no-cone "/*" "!/img/" "!/.github/workflows/" "!/node_modules/"
remote: Enumerating objects: 3317, done.
remote: Counting objects: 100% (3317/3317), done.
Receiving objects: 100% (3317/3317), 18.88 MiB | 5.95 MiB/s, done.
Resolving deltas: 100% (1540/1540), done.
Updating files: 100% (3471/3471), done.
◎ git pull
Already up to date.

Dapat dilihat dengan jelas bahwa proses penerimaan objek berjalan super ringan, hanya memakan belasan Megabyte data yang benar-benar esensial untuk kegiatan menulis kode dan artikel.

Menuju Ekosistem yang Lebih Sehat

Aturan pengecualian yang baru saja kita tetapkan tersimpan secara permanen di dalam folder tersembunyi .git/info/sparse-checkout. Keuntungannya adalah konfigurasi diet ini akan terus berlanjut dan berlaku secara otomatis ke mana pun repositori ini disalin atau dipindahkan. Tidak perlu lagi melakukan pengaturan ulang berkali-kali.

Teknik gabungan ini terbukti sangat krusial bagi arsitektur web yang mengandalkan integrasi berkesinambungan. Dengan membersihkan jejak masa lalu dan menyaring aset yang berbobot mati di mesin lokal, operasi harian menjadi secepat kilat. Perangkat keras kita akhirnya bisa bernapas lega, menghemat ruang penyimpanan, sekaligus memberikan pengalaman kerja yang jauh lebih produktif.