- Berbagai manajer paket menggunakan Git seperti database karena kemudahan versioning dan kolaborasi, tetapi ketika skalanya membesar mereka akhirnya menghadapi masalah performa dan pemeliharaan
- Cargo, Homebrew, CocoaPods, dan lainnya pada akhirnya beralih ke indeks berbasis HTTP atau CDN karena ukuran indeks Git yang terus membesar, kecepatan pembaruan yang lambat, dan inefisiensi di lingkungan CI
- vcpkg masih beroperasi berdasarkan hash tree Git, dan di lingkungan shallow clone muncul kegagalan build serta solusi workaround yang rumit
- Sistem modul Go menghilangkan ketergantungan pada Git dengan memperkenalkan GOPROXY dan database checksum (sumdb), sehingga keamanan dan kecepatan meningkat
- Git sangat unggul untuk kolaborasi kode, tetapi berulang kali terbukti tidak cocok untuk kueri metadata paket atau pengelolaan registry berskala besar
Kegagalan berulang dari upaya menggunakan Git sebagai database
- Git menarik karena keunggulannya seperti riwayat versi, struktur terdistribusi, dan hosting gratis, tetapi ketika digunakan sebagai database ia terbentur batas skalabilitas
- Banyak manajer paket mengadopsi Git sebagai indeks, namun seiring waktu penurunan performa dan beban infrastruktur makin parah
Cargo
- Indeks crates.io dimulai sebagai repositori Git, dan semua klien melakukan clone penuh
- Saat repositori membesar, muncul bottleneck performa libgit2 pada tahap delta resolution
- Di lingkungan CI, seluruh indeks diunduh pada setiap build sehingga pemborosan menjadi serius
- Melalui RFC 2789, diperkenalkan protokol sparse HTTP sehingga hanya metadata yang diperlukan yang diambil lewat HTTPS
- Per April 2025, 99% permintaan menggunakan mode sparse
- Indeks Git masih ada, tetapi sebagian besar pengguna tidak lagi mengaksesnya
Homebrew
- GitHub meminta Homebrew untuk berhenti menggunakan shallow clone, dan pembaruan disebut sebagai “operasi yang sangat mahal”
- Folder
.git pada homebrew-core mendekati 1GB, dan saat pembaruan terjadi keterlambatan akibat delta resolution
- Pada Februari 2023, Homebrew 4.0.0 mengubah pembaruan tap ke metode unduhan JSON
- Dengan menghapus Git fetch, kecepatan pembaruan meningkat, dan interval auto-update juga berubah dari 5 menit menjadi 24 jam
CocoaPods
- Manajer paket iOS/macOS CocoaPods memiliki repositori Specs berisi ratusan ribu podspec yang menjadi terlalu besar
- Clone dan pembaruan memakan waktu beberapa menit, dan sebagian besar waktu CI habis untuk operasi Git
- GitHub menerapkan CPU rate limit, dan shallow clone ditunjuk sebagai penyebab beban server
- Tim menerapkan langkah sementara seperti menghentikan fetch otomatis, beralih ke full clone, dan sharding repositori
- Sejak versi 1.8, sistem ini beralih ke distribusi HTTP berbasis CDN, menghemat sekitar 1GB ruang disk pengguna dan sangat meningkatkan kecepatan instalasi
Nixpkgs
- Nix di sisi klien sudah menggunakan channel berbasis tarball untuk menghindari clone Git
- Ekspresi paket disediakan melalui HTTP dari S3 dan CDN
- Namun, infrastruktur GitHub tetap terbebani oleh repositori berukuran 83GB dan 20.000 fork
- Pada November 2025, GitHub melaporkan kegagalan konsensus antar replika dan error pada pekerjaan pemeliharaan
- Clone lokal berukuran 2,5GB, tetapi seluruh jaringan fork menekan kapasitas penyimpanan GitHub
vcpkg
- Manajer paket C++ dari Microsoft, vcpkg, melakukan versioning dengan hash tree Git
- Untuk mereproduksi port pada commit tertentu melalui
builtin-baseline, seluruh riwayat diperlukan
- Di lingkungan shallow clone (GitHub Actions, DevContainers), build dapat gagal
- Solusinya memerlukan pengaturan
fetch-depth: 0, yang berarti harus mengunduh seluruh riwayat
- Karena struktur hash tree Git, pelacakan commit tidak dimungkinkan, dan keterbatasan ini tidak bisa diperbaiki secara struktural
- Hingga kini, registry berbasis repositori Git masih menjadi satu-satunya yang didukung, tanpa alternatif HTTP atau CDN
Sistem modul Go
- Tim engineering Grab melaporkan bahwa setelah modul proxy diperkenalkan, waktu
go get berkurang dari 18 menit menjadi 12 detik
- Pada cara lama, seluruh repositori dari setiap dependensi harus di-clone hanya untuk membaca
go.mod
- Tim Go mengkhawatirkan ketergantungan pada alat VCS dan celah keamanan
- Mulai Go 1.13, GOPROXY menjadi default, menyediakan source modul dan
go.mod melalui HTTP
- sumdb (database checksum) menjamin integritas dan persistensi modul
Masalah umum saat Git digunakan sebagai database
- Wiki berbasis Git (Gollum) menjadi lambat saat menelusuri direktori dan memuat halaman pada repositori besar
- GitLab berencana menghentikan penggunaan Gollum
- CMS berbasis Git (Decap) terbentur batas permintaan GitHub API (5.000 kali)
- Di atas sekitar 10.000 item, performa menurun, dan pengguna baru dengan cache kosong memicu lonjakan permintaan
- Alat GitOps (ArgoCD) mengalami masalah kehabisan ruang disk saat melakukan clone repositori
- Satu commit dapat membatalkan seluruh cache, dan monorepo besar memerlukan scaling terpisah
Alasan struktural mengapa Git tidak cocok sebagai database
- Batasan direktori: makin banyak file, makin lambat
- CocoaPods menghasilkan objek tree yang sangat besar karena 16.000 direktori, dan ini diatasi dengan sharding berbasis hash
- Masalah pembedaan huruf besar-kecil: Git membedakannya, tetapi macOS dan Windows tidak
- Azure DevOps menambahkan fitur pemblokiran di sisi server untuk mencegah konflik
- Batas panjang path: batas 260 karakter di Windows menyebabkan error pada
git status
- Ketiadaan fitur database:
- Tidak ada constraint CHECK/UNIQUE, locking, indeks, maupun fitur migrasi
- Setiap manajer paket harus membangun sendiri sistem validasi dan pengindeksannya
Kesimpulan
- Git sangat unggul untuk kolaborasi source code, tetapi tidak cocok untuk kueri metadata paket atau pengelolaan registry berskala besar
- Sebagian besar manajer paket pada akhirnya beralih ke indeks berbasis HTTP atau database
- Keunggulan Git seperti riwayat versi dan workflow PR memang menarik, tetapi sebagai pengganti database ia gagal
- Saat merancang manajer paket baru, meskipun indeks Git terlihat menarik, pada akhirnya akan mencapai batas yang sama seperti kasus Cargo, Homebrew, CocoaPods, vcpkg, dan Go
2 komentar
Mereka memakainya karena
gitlebih praktis daripada harus membuat sistem terpisah untuk menerima kontribusi dari para kontributor. Ini disebut sebagai keterbatasan, tetapi saya pribadi tidak terlalu setuju, dan saya sama sekali tidak melihat alternatif untuk masalah yang realistis.Komentar Hacker News
Ini terlihat seperti semacam tragedi milik bersama. GitHub gratis dan punya banyak fitur hebat, jadi semua orang ingin memakainya. Tapi keputusan seperti ini selalu muncul ketika ada eksternalitas
Eksternalitas yang paling penting menurut saya adalah waktu pengguna. Kebanyakan perusahaan software hanya peduli pada biaya waktu engineering, dan mengabaikan waktu pengguna. Mereka bersemangat mengembangkan fitur, tetapi tidak mengoptimalkan waktu interaksi pengguna. Misalnya, jika saya menghabiskan 1 jam untuk membuat aplikasi 1 detik lebih cepat, satu juta pengguna akan menghemat 277 jam per tahun. Tetapi karena waktu pengguna adalah eksternalitas, optimasi seperti ini hampir tidak pernah dilakukan
Pada akhirnya pengguna harus mengunduh lebih banyak data tanpa guna dan menunggu lebih lama, sementara pengembang tidak bertanggung jawab atas pemborosan itu
Saya sedang membuat Cargo/UV untuk C. Tulisan yang bagus dan saya sangat berempati dengannya.
Saat baru memulai, mengoperasikan registry itu benar-benar sulit. Bukan cuma soal menulis kode, menjaga kualitas tool, dan memperluas komunitas, tetapi juga harus memikirkan infrastruktur yang sanggup menangani trafik global. Dalam situasi seperti ini, solusi berbasis git memang menarik
Tapi masalahnya adalah sparse checkout. Saya ingin versioning package manifest dengan git, tetapi karena harus melacak commit arbitrer, jadinya tidak efisien. Pada akhirnya strukturnya jadi harus push dua commit, jadi secara praktik tidak memungkinkan
Saya rasa pendekatan Conan adalah yang paling praktis. Alih-alih reproduktibilitas sempurna, ia menaruh logika kondisional di manifest. Pemetaan manifest berdasarkan rentang versi juga dimungkinkan. Tidak sempurna, tetapi kompromi yang praktis dan berguna.
Tentu saja solusi yang sebenarnya adalah memakai database, tetapi tidak ada yang akan membayari biaya server dan pemeliharaannya, jadi secara realistis sulit
Jika masalahnya adalah uang dan kemandirian, pendekatan P2P juga memungkinkan. Hanya saja, kalau CI tidak bisa melakukan caching, trafik bisa meledak
Struktur mirror distribusi Linux seperti Debian, Fedora, dan openSUSE juga layak dijadikan referensi
Tulisan ini mencampuradukkan dua masalah. Yang satu adalah memakai git sebagai database indeks package, yang lain adalah mengambil kode tiap package lewat git. Keduanya terpisah.
Indeks bisa pakai git, package bisa pakai zip/tar, dan kebalikannya juga memungkinkan. Dalam kasus Go, strukturnya bahkan tanpa indeks sama sekali
Cerita tentang implementasi backend GitHub atau 20 ribu fork tidak relevan dengan esensinya. Bahkan tanpa git working tree pun, pencarian key-value yang efisien tetap memungkinkan.
Klaim bahwa “rewrite histori git itu setara dengan migrasi DB” juga aneh. Memangnya tidak lebih baik jalankan saja satu Postgres?
Pendekatan “pakai cara yang mudah saat masih bekerja, dan kalau nanti tidak bekerja baru diperbaiki” itu realistis.
Julia juga memakai pendekatan yang sama, dan jumlah package-nya masih sekitar 1/7 dari Rust jadi belum ada masalah.
Kita bisa memperbaikinya agar hanya mengambil file Registry.toml tingkat teratas lalu mengunduh package yang diperlukan saja. Bukan masalah besar
Budaya “Move fast and break things” telah menghasilkan software masa kini yang lambat dan penuh bug
Saya setuju dengan kesimpulan bahwa “Git adalah database yang sangat bagus untuk titik awal package manager”
Saya berada di kubu “pada akhirnya toh berhasil”. Untuk operasi awal, itu cukup membantu, dan masalah skala bisa diselesaikan nanti
Ada survivorship bias di sini. Cargo menjadi masalah karena sukses, sehingga indeks git-nya membesar.
Sebagian besar proyek kecil menggunakan git dengan baik sebagai protokol distribusi data.
Pada tahap awal ketika skala masih belum pasti, masuk akal memanfaatkan git dan GitHub agar bisa fokus pada masalah inti
Setiap kali melihat tulisan di halaman depan HN yang mengatakan “apa yang sedang kamu lakukan sekarang itu salah”, saya jadi rendah hati.
Saya juga pernah mengalami hal seperti itu beberapa kali. Kali ini yang seperti itu adalah tulisan tentang PG Notify.
Tapi saat ini saya masih mengembangkan sendirian, bahkan belum tahu apakah proyek ini akan berhasil, jadi mendistribusikan plugin dengan git adalah pilihan yang paling realistis.
Meski begitu, kalau nanti muncul masalah skala, saya akan merujuk ke tulisan ini
Saya pribadi meng-host kode dengan Forgejo. Saya melindunginya dengan mTLS tanpa eksposur ke luar.
Tapi modul Go membutuhkan sertifikat sehingga tidak bisa mengenali instance Forgejo saya.
Bahkan kalau memakai SSH pun tetap perlu akses HTTPS, jadi akhirnya saya memakai salinan lokal lewat replace directive. Cukup merepotkan
.gitdi akhir path modul dan mengatur$GOPRIVATE, Anda bisa memakai autentikasi perintah git tanpa permintaan HTTPS. Lihat dokumentasi resmiBukan hanya package manager, banyak proyek kecil juga melakukan crowdsourcing data ke dalam repositori git.
Sebagian besar skalanya kecil, jadi tidak pernah menabrak batas teknis.
Tetapi struktur seperti ini meningkatkan hambatan partisipasi bagi non-pengembang. Package manager adalah pengecualian, tetapi untuk proyek umum ini menjadi masalah
Untuk membantu masalah seperti ini, saya membuat library open source bernama Datatig.
Materi presentasi terkait ada di sini. Ke depannya saya akan merujuk tulisan ini dan menambahkan konten terkait scaling juga.