Cara melewati popup "Objek Longgar" saat menjalankan 'git gui'

123

Saat saya menjalankan 'git gui', saya mendapatkan munculan yang bertuliskan

Repositori ini saat ini memiliki sekitar 1500 objek lepas.

Kemudian menyarankan untuk mengompresi database. Saya telah melakukan ini sebelumnya, dan itu mengurangi objek yang lepas menjadi sekitar 250, tetapi itu tidak menekan popup. Mengompresi lagi tidak mengubah jumlah benda yang lepas.

Alur kerja kami saat ini memerlukan penggunaan 'rebase' yang signifikan saat kami beralih dari Perforce, dan Perforce masih menjadi SCM kanonik. Setelah Git menjadi SCM kanonik, kami akan melakukan penggabungan reguler, dan masalah objek longgar harus sangat diatasi.

Sementara itu, saya sangat ingin menghilangkan munculan yang 'berguna' ini.

Michael Donohue
sumber
1
Dialog itu adalah contoh bagus dari "fitur" yang diharapkan banyak orang tidak ada. Ini tidak hanya mengganggu, tetapi juga dapat menghapus komitmen penting yang terlepas setelah hard reset.
adelriosantiago

Jawaban:

169

Karena belum ada yang menjawab, saya melihat ke dalam kode untuk melihat cara menghapus kode yang menampilkan dialog itu. Saya menemukan hint_gcprosedur yang melakukannya dan tempat dipanggilnya. Pada saat yang sama saya perhatikan bahwa akhir 2011 telah ditambahkan opsi konfigurasi untuk menonaktifkan dialog . Perubahan ini (bagian dari git-gui 0.16.0) digabungkan ke jalur utama Git pada 2011-12-14 .

Jadi jika Anda menggunakan Git v1.7.9 atau yang lebih baru, Anda dapat menonaktifkan dialog peringatan dengan perintah berikut:

git config --global gui.gcwarning false

Jika Anda menggunakan versi yang lebih lama, maka Anda dapat mengedit /lib/git-core/git-guidan menghapus after 1000 hint_gcgaris, atau mengedit /usr/share/git-gui/lib/database.tcldan menghapus isi hint_gcprosedur. (Jalur file ini berada di Cygwin - di lingkungan lain file mungkin berada di lokasi yang berbeda. Untuk Windows, ini c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

Esko Luontola
sumber
3
Bisakah kita meningkatkan after 1000 hint_gcsehingga peringatan terjadi setelah 10000benda lepas?
sashoalm
@ashoalm Saya setuju. Itu ada di sana karena suatu alasan.
HankCa
Bertanya-tanya apa sebenarnya alasan yang bagus, dialog itu sangat menyakitkan, tanpa alasan yang jelas dijelaskan dengan jelas, saya pasti sangat tergoda untuk hanya mendera perintah di atas.
Josh Mc
2
@sashoalm: Mungkin ini yang Anda maksud, tetapi "1000" after 1000mengacu pada jumlah milidetik untuk menunggu sampai dialog ditampilkan. Dengan meningkatkannya menjadi "10000", dialog akan tetap muncul, tetapi akan memakan waktu 10 detik untuk melakukannya.
fuglede
1
Namun, seperti yang disebutkan dalam jawaban @ NickDandoulakis, database.tclmengandung definisi limit dan dapat ditingkatkan untuk mengurangi frekuensi dialog.
fuglede
50

Pembaruan: git pruneakan "memecahkan" masalah, dalam hal itu akan menghapus objek yang longgar
( git gcpanggilan git prune, tetapi hanya untuk objek longgar yang lebih tua dari dua minggu, secara default).
Namun, seperti yang disebutkan oleh OP Michael Donohue di komentar:

Saya sangat menyukai aspek keamanan menyimpan benda-benda yang lepas selama dua minggu, jika saya ingin kembali dan melihat beberapa revisi lama, jadi saya tidak terlalu menyukai solusi ini.
Saya tidak mengalami masalah dengan ukuran atau kinerja git, hanya 'git gui' yang meminta saya untuk mengompresi database, bahkan saat mengompresi database tidak akan berpengaruh.


Jawaban asli:

Masalah " git gc" tidak menghilangkan semua benda lepas telah dilaporkan sebelumnya (akhir 2008, " " git gc"sepertinya tidak menghilangkan benda lepas lagi "

git gchanya membuang benda lepas yang berumur lebih dari dua minggu, jika Anda benar-benar ingin membuangnya sekarang, jalankan git prune.
Tetapi pastikan tidak ada proses git lain yang dapat aktif saat Anda menjalankannya, atau mungkin menginjak sesuatu.

" git gc" akan membongkar objek yang tidak dapat dijangkau dan saat ini ada dalam paket.
Akibatnya, jumlah ruang disk yang digunakan oleh repositori git dapat benar-benar naik secara dramatis setelah git gcoperasi " ", yang mungkin mengejutkan bagi seseorang yang hampir kehabisan ruang pada sistem file mereka, menghapus sejumlah cabang dari repositori pelacakan , dan kemudian melakukan " git gc" mungkin mendapatkan kejutan yang sangat tidak menyenangkan.

[Contoh: ]Cabang lama dipesan melalui tag seperti next-20081204.
Jika Anda memperbarui salinan lokal linux-nextrepositori Anda setiap hari, Anda akan mengakumulasikan banyak tag cabang lama ini.
Jika Anda kemudian menghapus seluruh rangkaiannya, dan menjalankannya git-gc, operasi akan memakan waktu cukup lama, dan jumlah blok dan inode yang digunakan akan bertambah secara signifikan.

Mereka akan menghilang setelah " git prune", tetapi saat saya melakukan operasi rumah tangga ini, saya sering berharap ada --yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repositoryopsi untuk "git gc".

Jadi, dalam kasus Anda, apakah " git prune" bisa membantu?

(mungkin dengan menggunakan "sekarang" dalam gc.pruneexpirevariabel config, diperlukan agar perilaku di atas terjadi).


Anda juga memiliki (dari utas yang sama):

repack -a -d -l

Perhatikan huruf kecil 'a'.

git-gcpanggilan membungkus kembali dengan huruf besar 'A' yang menyebabkan objek yang tidak dapat dijangkau dibongkar. Sedikit 'a', untuk orang yang tahu apa yang mereka lakukan, dan ingin git menjatuhkan benda yang tidak terjangkau.

VonC
sumber
1
'git prune' mungkin akan menyelesaikan masalah langsung saya - saya akan mencobanya nanti hari ini. Namun, saya menyukai aspek keamanan menyimpan benda-benda yang lepas selama dua minggu, jika saya ingin kembali dan melihat beberapa revisi lama, jadi saya tidak terlalu menyukai solusi ini. Saya tidak mengalami masalah dengan ukuran atau kinerja git, hanya 'git gui' yang meminta saya untuk mengompresi database, bahkan saat mengompresi database tidak akan berpengaruh.
Michael Donohue
komentar yang sangat membantu. Pesan "benda lepas" yang mengganggu itu menjadi sangat mengganggu. Dari mana asal hitungan itu? Keluaran dari git-fsck, mungkin?
David Dombrowsky
terima kasih - saya juga punya benda lepas yang tidak dihapus git gc - git prune adalah jawabannya.
shedd
Saya melakukan git prune di luar repositori mana pun dan itu membersihkan beberapa objek. Kemudian saya pergi ke repositori masalah dan melakukan pemangkasan git dan semua masalah hilang.
Nicholas Orlowski
"git prune" memecahkan masalah yang dimiliki OP (dan saya): "Saya telah melakukan ini sebelumnya, dan ini mengurangi objek yang lepas menjadi sekitar 250, tetapi itu tidak menekan popup."
Eike
32

Saat popup "Objek Longgar", saya tahu sudah waktunya menjalankan pengumpul sampah git:

git gc

Setelah itu popupnya hilang.

Pembaruan: (karena saran TED)

Saya mengekstrak rutinitas di bawah ini dari git/share/git-gui/lib/database.tcl
Anda dapat memodifikasinya untuk memenuhi kebutuhan Anda.

proc hint_gc {} {
    set object_limit 8
    if {[is_Windows]} {
        set object_limit 1
    }

    set objects_current [llength [glob \
        -directory [gitdir objects 42] \
        -nocomplain \
        -tails \
        -- \
        *]]

    if {$objects_current >= $object_limit} {
        set objects_current [expr {$objects_current * 256}]
        set object_limit    [expr {$object_limit    * 256}]
        if {[ask_popup \
            [mc "This repository currently has approximately %i loose objects.

To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist.

Compress the database now?" $objects_current $object_limit]] eq yes} {
            do_gc
        }
    }
}
Nick Dandoulakis
sumber
1
Tidakkah mengklik OK di dialog hanya melakukan itu? Jika gc tidak menyingkirkan semua objek yang lepas, dia masih akan mendapatkan dialog.
TED
Saya telah mengklik 'OK' dan saya telah menjalankan 'git gc' dari baris perintah - keduanya menurunkan saya ke 250, tetapi melakukannya lagi tidak membuat kemajuan lebih lanjut.
Michael Donohue
3
Saya tahu itu aneh tetapi membersihkan alas dari gui terkadang meninggalkan benda-benda yang lepas. Saya menutup gui, menjalankan git-gc, lalu semua sampah hilang.
Nick Dandoulakis
3
Mengubah tcl memperbaikinya - Saya baru saja menaikkan batas jendela menjadi 10 * 250. Terima kasih!
Michael Donohue
bagi saya menjalankan git gcdari baris perintah memecahkan masalah ... hanya mengklik okdi git gui entah bagaimana tidak berhasil ...
raphael
3

Hmmmm .... Saya tidak melihat argumen baris perintah untuk itu di dokumen .

Saya kira Anda selalu dapat menurunkan sumbernya, mengambil kode untuk dialog, dan membangun kembali.

TED
sumber