Untuk menemukan file terbesar yang tersimpan dalam riwayat Git yang dapat dijangkau (reachable) pada sebuah repositori di macOS, buka Terminal, berpindahlah ke repositori tersebut, lalu teruskan (pipe) daftar objek Git melalui git cat-file dan sort. Perintah ini melaporkan ukuran tiap blob yang belum dikompresi dalam satuan bita beserta petunjuk jalurnya (path hint). Hal ini dapat mengungkap file yang telah dihapus atau diganti tetapi masih tersisa dalam commit yang dapat dijangkau dari cabang atau tag.
Jalankan pemindaian riwayat dari Terminal
Di Terminal, gunakan cd untuk masuk ke repositori. Beri tanda kutip pada jalur folder jika terdapat spasi. Kemudian jalankan:
git rev-list --objects --all |
git cat-file --batch-check='%(objecttype) %(objectsize) %(objectname) %(rest)' |
awk '$1 == "blob"' |
sort -k2,2nr |
head -20
Keluarannya diurutkan dari yang terbesar terlebih dahulu. Setiap baris menampilkan tipe objek, jumlah bita, ID objek, dan petunjuk jalur jika Git menyediakannya. git rev-list --objects --all menyusuri objek yang dirujuk oleh commit yang dapat dijangkau dari refs, seperti cabang lokal dan tag; git cat-file --batch-check melaporkan tipe dan ukuran tiap objek. Rangkaian perintah (pipeline) ini memfilter untuk blob, yaitu objek yang menyimpan isi file. Dokumentasi rev-list Git menjelaskan penelusuran dan penamaan objek, dan cat-file mendokumentasikan keluaran ukuran dan tipe batch.
sort -k2,2nr menggunakan sort bawaan macOS untuk mengurutkan secara numerik dari nilai tertinggi berdasarkan bidang kedua yang dipisahkan oleh spasi, yaitu ukuran bita. head -20 membatasi tampilan hingga 20 baris; ubah angka tersebut atau hapus baris terakhir itu untuk melihat lebih banyak. Perintah ini hanya membaca data repositori. Perintah ini tidak mengubah commit maupun file.
Pahami dan tafsirkan hasilnya dengan cermat
Suatu baris mengidentifikasi sebuah objek blob, belum tentu file yang saat ini ada di working tree. Objek besar bisa saja berasal dari versi lama suatu file, dan petunjuk jalur bukanlah indeks jalur historis yang lengkap: Git mencatat bahwa dengan --objects, nama-nama tersebut hanyalah petunjuk, dapat berubah karena baris baru (newlines), dan jika suatu objek memiliki beberapa nama, hanya satu yang mungkin ditampilkan. Anggaplah jalur yang tercantum sebagai petunjuk awal, lalu periksa commit yang relevan untuk memastikan kapan dan di mana konten tersebut muncul. Catatan nama objek rev-list Git menjelaskan batasan-batasan ini.
Pemindaian ini mencakup objek yang dapat dijangkau dari refs yang ditemukan oleh --all, bukan setiap objek yang mungkin secara fisik masih tersisa di basis data objek. Untuk memeriksa penyimpanan objek lokal, termasuk objek yang tidak dapat dijangkau (unreachable), jalankan:
git cat-file --batch-all-objects \
--batch-check='%(objecttype) %(objectsize) %(objectname)' |
awk '$1 == "blob"' |
sort -k2,2nr |
head -20
--batch-all-objects meninjau semua objek di dalam repositori dan penyimpanan objek alternatif, termasuk objek yang tidak dapat dijangkau dari refs. Perintah kedua ini tidak menyertakan jalur file, jadi gunakan ID objek untuk melakukan penelusuran lebih lanjut. Dokumentasi cat-file mencatat cakupan objek yang lebih luas ini serta fakta bahwa setiap objek hanya ditampilkan sekali meskipun disimpan beberapa kali.
Ukuran blob tidak sama dengan ruang disk
Nilai objectsize yang dilaporkan adalah ukuran objek Git yang belum dikompresi. Git mungkin mengompresi objek atau menyimpannya sebagai delta di dalam packfile, sehingga blob yang besar belum tentu menggunakan ruang disk sebesar itu. Untuk ringkasan penggunaan penyimpanan, jalankan git count-objects -vH; bidang size-pack miliknya melaporkan ukuran data yang telah dikemas (packed) dan bidang-bidang lainnya merangkum loose object serta penyimpanan terkait. Panduan count-objects Git mendokumentasikan angka-angka ini. Untuk memeriksa ukuran objek yang dikemas dan detail delta, git verify-pack -v mencantumkan ukuran tiap objek yang dikemas serta ukurannya di dalam packfile, tetapi memerlukan file .idx yang relevan. Panduan verify-pack menjelaskan keluaran tersebut.
Jika Anda menemukan file historis berukuran besar
Pertama, tentukan apakah tujuan Anda adalah untuk memahami status checkout saat ini atau memperkecil riwayat repositori. Jika hanya untuk versi saat ini, periksa file di Finder atau gunakan daftar ukuran file di Terminal; pemindaian riwayat menjawab pertanyaan yang berbeda dengan mencari objek Git yang dapat dijangkau.
Jika file besar harus dihapus dari setiap revisi, menghapusnya begitu saja di commit baru tidak akan menghilangkan salinan lama dari riwayat. Menulis ulang riwayat (rewriting history) mengubah ID commit dan berdampak pada orang lain yang menggunakan repositori tersebut, jadi lakukan koordinasi sebelum melakukannya dan simpan cadangan (backup). Proyek git-filter-repo menyediakan mode analisis hanya-baca (read-only), git filter-repo --analyze, yang menghasilkan laporan untuk membantu memutuskan apa yang perlu difilter; mode ini tidak melakukan penulisan ulang dalam mode analisis. Dokumentasi proyek tersebut menjelaskan opsi analisis dan memperingatkan bahwa pemfilteran akan menulis ulang riwayat.
Rangkaian perintah (pipeline) pertama adalah langkah awal yang praktis ketika tujuannya adalah menemukan isi file terbesar di balik riwayat repositori lokal. Gunakan pemindaian semua objek jika sisa-sisa objek yang tidak dapat dijangkau penting untuk diperiksa, dan bandingkan ukuran objek Git dengan penyimpanan pack sebelum menyimpulkan penggunaan disk ke blob tertentu.
Sumber
git-filter-repo — GitHub