Versi singkat: artinya apa yang dikatakannya, dan jika Anda membiarkannya selesai, semuanya akan baik-baik saja.
Selama sebagian besar operasi yang berpotensi meningkatkan jumlah objek lepas (tidak terbungkus) dalam repositori (termasuk dorongan), Git memanggil git gc --auto
. Jika ada cukup banyak objek longgar (secara default, setidaknya 6700), maka akan dipanggil git repack -d -l
untuk mengemasnya. Jika ada terlalu banyak paket terpisah, itu juga akan mengemasnya menjadi satu.
Paket adalah file tunggal terkompresi-delta, berisi sejumlah besar objek. Ini lebih efisien untuk menyimpan objek dalam paket, tetapi membutuhkan waktu untuk mengemas (kompres) objek, jadi Git awalnya membuat objek yang longgar, lalu mengemasnya dalam batch sekarang dan kemudian, melalui permintaan otomatis git gc --auto
.
Jika Anda membiarkan Git selesai mengemas ulang, ini tidak akan terjadi lagi untuk sementara waktu. Memang bisa memakan waktu, terutama jika Anda memiliki banyak objek biner besar, tetapi jika itu memicu, maka itu pertanda bahwa itu mungkin akan secara drastis mengurangi jumlah ruang disk yang diambil oleh repo. Jika Anda benar-benar tidak ingin itu terjadi, Anda dapat mengubah parameter konfigurasi gc.auto
. Jika Anda meningkatkannya ke sesuatu yang jauh lebih besar dari 6700, itu akan terjadi lebih jarang, tetapi butuh waktu lebih lama ketika itu terjadi. Jika Anda menguranginya, itu masih harus melakukan repack Anda saat ini, tetapi selanjutnya itu akan terjadi lebih sering dan selesai lebih cepat. Jika Anda mengaturnya ke 0, itu akan menonaktifkan pengemasan ulang otomatis.
Lihat man git-gc
(di bawah --auto
) dan man git-config
(di bawah gc.auto
) untuk informasi lebih lanjut.
fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack
- inilah yang aku dapatkan untuk menempelkan seluruh basis kode kita menjadi satu repo git. Kira saya akan mematikan aplikasi dan memaksa repack "secara manual"Meskipun Jefroni benar bahwa kadang-kadang pengemasan otomatis hanya perlu waktu untuk menyelesaikannya, jika pesan pengemasan otomatis berlangsung selama beberapa hari seperti yang dijelaskan OP, ada kemungkinan bagus bahwa pembersihan git tidak ada objek yang menggantung, seperti dijelaskan dalam pertanyaan ini .
Untuk melihat apakah objek yang menggantung memicu pesan yang sedang berlangsung tentang pengemasan otomatis, coba jalankan
git fsck
. Jika Anda mendapatkan daftar panjang komitmen menjuntai, Anda dapat membersihkannya dengangit gc --prune=now
Saya biasanya harus menjalankan ini pada repo saya setiap 2-3 bulan ketika pesan pengepakan otomatis tidak hilang setelah satu tarikan.
sumber
git pull
, selama beberapa hari, danfsck
memang menunjukkan banyak komitmen menggantung.Untuk menonaktifkan satu proyek:
Untuk menonaktifkan secara global:
sumber
Git menjalankan git-repack, yang mengemas banyak objek (= file, commit dan pohon) menjadi satu file paket. Git melakukan ini kadang-kadang, ketika heuristik mengatakan bahwa mungkin ada ruang yang disimpan (file paket berisi delta objek terkompresi, sementara setiap file di objek / direktori berisi konten file lengkap terkompresi)
sumber
Semoga
git gc --auto
langkah itu sekarang (git 2.0.1, 25 Juni 2014) lebih efisien.Lihat commit 62aad18 oleh Nguyễn Thái Ngọc Duy (
pclouds
)gc --auto
: jangan mengunci referensi di latar belakangDan Git 2.22 (Q2 2019) lebih lanjut mengoptimalkan
git gc
.sumber