Apa artinya “Pengemasan repositori otomatis untuk kinerja optimal”?

225

Saya mengalami masalah dengan repo git saya. Selama beberapa hari terakhir setiap kali saya melakukan push ke server saya mendapatkan pesan ini: "Otomatis mengemas repositori untuk kinerja optimal", dan sepertinya tidak hilang dan mengembalikan shell.

Saya juga mencoba memeriksa ke cabang baru dan kemudian melakukan rebase pada cabang saya sebelumnya dan kemudian git gcuntuk menghapus objek sejarah yang tidak digunakan dan kemudian melakukan push tetapi pesan ini tetap muncul. Tolong beri tahu saya apa yang terjadi dengan repo saya.

Furqan Asghar
sumber

Jawaban:

305

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 -luntuk 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.

Cascabel
sumber
14
Memang, ini memakan waktu sekitar 5 menit untuk saya, tetapi itu selesai. Jawaban yang bagus
Joshua Pinter
6
Kami melihat itu terjadi dengan setiap dorongan (membuat beberapa saat, heh).
2
@ dpk: Itu seharusnya tidak terjadi dalam keadaan normal - jumlah objek dalam satu dorongan tidak boleh cukup besar untuk memicunya (kecuali repositori Anda sangat besar dan / atau Anda mendorong banyak komit), jadi setelah berhasil selesai (Anda membiarkannya selesai, bukan?) itu tidak boleh terjadi lagi sampai Anda membangunnya. Jika Anda tidak dapat menemukannya, ajukan pertanyaan terpisah.
Cascabel
6
"Jika kamu membiarkan Git menyelesaikan", dan itu bisa ... 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"
ruffin
11
Saya mendapatkannya setiap kali saya melakukan git pull. Saya sudah melakukan manual git gc, tapi itu masih terjadi setiap kali saya menarik. Aneh.
Barry Kelly
51

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 dengan

git gc --prune=now

Saya biasanya harus menjalankan ini pada repo saya setiap 2-3 bulan ketika pesan pengepakan otomatis tidak hilang setelah satu tarikan.

wbharding
sumber
5
Meskipun bukan jawaban yang diterima, inilah tepatnya yang saya butuhkan. Saya mendapat pesan setiap kali saya melakukan git pull, selama beberapa hari, dan fsckmemang menunjukkan banyak komitmen menggantung.
Jörn Zaefferer
36

Untuk menonaktifkan satu proyek:

cd your_project_dir
git config gc.auto 0

Untuk menonaktifkan secara global:

git config --global gc.auto 0
Anders Lindén
sumber
2
Saya rasa saya tahu caranya: buka folder .git, buka file konfigurasi, dan hapus teks 'auto = 0', dan simpan. Itu tampaknya mengaktifkan kembali autopacking.
Adrian Keister
18
git config --unset gc.auto
jtatum
10

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)

Rudi
sumber
2

Semoga git gc --autolangkah 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 belakang

9f673f9 ( gc: opsi config untuk menjalankan --auto di latar belakang - 2014-02-08, Git 2.0.0) menempatkan " gc --auto" di latar belakang untuk mengurangi waktu tunggu pengguna.
Bagian dari pengumpulan sampah adalah pak ref dan pemangkasan reflog. Ini membutuhkan penguncian beberapa referensi dan dapat membatalkan proses lain yang mencoba mengunci referensi yang sama.

Jika gc --autodipecat di tengah-tengah skrip, memegang kunci gc di latar belakang bisa gagal skrip, yang tidak pernah bisa terjadi sebelum 9f673f9 .

Terus berjalan pack-refsdan " reflog --prune" di latar depan untuk menghentikan pembaruan ref paralel. Operasi latar belakang yang tersisa (repack, prune, dan rerere) tidak boleh memengaruhi proses git yang sedang berjalan.

Dan Git 2.22 (Q2 2019) lebih lanjut mengoptimalkangit gc .

VONC
sumber