Як пропустити спливаюче вікно "Loose Object" під час запуску "git gui"


123

Коли я запускаю "git gui", я отримую спливаюче вікно, яке говорить

Зараз у цьому сховищі розміщено приблизно 1500 вільних об'єктів.

Потім пропонується стиснення бази даних. Я робив це раніше, і це зменшує сипучі об'єкти до приблизно 250, але це не пригнічує спливаючі вікна. Повторне стиснення не змінює кількість пухких об'єктів.

Наш поточний робочий процес вимагає значного використання "rebase", оскільки ми переходимо з Perforce, і Perforce все ще є канонічним SCM. Після того, як Git стане канонічним SCM, ми будемо робити регулярні злиття, і проблема сипучих об'єктів повинна бути значно пом'якшена.

У той же час, я дуже хотів би, щоб ця «корисна» спливаюча думка пройшла.


1
Цей діалог є прекрасним прикладом "функції", яку багато людей хотіли б, щоб її не було. Це не тільки дратує, але може стерти важливі зобов'язання, які відключилися після жорсткого скидання.
adelriosantiago

Відповіді:


169

Оскільки ще ніхто не отримав відповіді, я заглянув у код, щоб побачити, як видалити код, який відображається в цьому діалоговому вікні. Я знайшов hint_gcпроцедуру, яка це робить, і місце, де воно викликається. У той же час я помітив, що наприкінці 2011 року було додано параметр конфігурації для відключення діалогу . Цю зміну (частина git-gui 0.16.0) було об'єднано в основну лінію Git 2011-12-14 .

Отже, якщо ви використовуєте Git v1.7.9 або новішої версії, ви можете відключити діалогове вікно попередження за допомогою наступної команди:

git config --global gui.gcwarning false

Якщо ви використовуєте старішу версію, ви можете редагувати /lib/git-core/git-guiта видаляти after 1000 hint_gcрядок, або редагувати /usr/share/git-gui/lib/database.tclта видаляти тіло hint_gcпроцедури. (Ці шляхи до файлів є на Cygwin - в інших середовищах файли можуть знаходитися в інших місцях. Для Windows це c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)


3
Чи можемо ми збільшити after 1000 hint_gcтак, щоб попередження траплялося після 10000пухких предметів?
sashoalm

@sashoalm Я згоден. Її там не просто так.
HankCa

Цікаво, які саме вагомі причини, що діалог такий біль, без поважних причин чітко пояснений, я, безумовно, дуже спокусився просто вдаритись у вищевказану команду.
Джош Мак

2
@sashoalm: Можливо, це саме ви маєте на увазі, але "1000" after 1000посилається на кількість мілісекунд, щоб зачекати, поки не з'явиться діалогове вікно. Збільшивши його до "10000", діалогове вікно все одно з’явиться, але для цього знадобиться 10 секунд.
фугледе

1
Однак, як згадується у відповіді @ NickDandoulakis, воно database.tclмістить визначення межі і може бути збільшене, щоб зробити діалог менш частим.
fuglede

50

Оновлення: git prune"вирішить" проблему, оскільки вона видалить ті вільні об'єкти
( git gcдзвінки git prune, але лише для вільних об'єктів, старших двох тижнів, за замовчуванням).
Однак, як в коментарях зазначає ОП Майкл Донохуе :

Мені подобається аспект безпеки зберігання сипучих предметів на протязі двох тижнів, якщо я хочу повернутися назад і переглянути деякі старі зміни, тому мені не дуже подобається це рішення.
У мене не виникає проблем з розміром або продуктивністю git, це просто "git gui", який наполягає на тому, щоб я попросив стиснути базу даних, навіть коли стискання бази даних не матиме жодного ефекту.


Оригінальна відповідь:

Проблему " git gc" не видалення всіх пухких об'єктів повідомлялося раніше (наприкінці 2008 р., " " git gc"Більше не видаляє пухкі об'єкти "

git gcвидаляє лише пухкі предмети старше двох тижнів, якщо ви дійсно хочете їх зараз видалити, запустіть git prune.
Але переконайтесь, що жоден інший процес git не може бути активним під час його запуску, інакше він може наступити на щось.

" git gc" розпакує об'єкти, які стали недосяжними і наразі були в пакетах.
Як результат, об'єм дискового простору, який використовується сховищем git, насправді може різко збільшитися після " git gc" операції, що може здивувати того, хто працює у своїй файловій системі близько до повного, видаляє декілька гілок із сховища відстеження. , і тоді " git gc" "може отримати дуже неприємний сюрприз.

[Приклад: ]Старі гілки зарезервовані за допомогою тегу, такого як next-20081204.
Якщо ви оновлюєте локальну копію linux-nextсховища щодня, ви накопичите велику кількість цих старих тегів філій.
Якщо потім видалити цілу серію з них і запустити git-gc, операція займе досить багато часу, а кількість використаних блоків та вкладів значно зросте.

Вони зникнуть після " git prune", але коли я роблю цю господарську операцію, я часто хотів отримати --yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repositoryваріант "git gc".

Отже, у вашому випадку, чи допоможе " git prune" "користь?

(можливо, із застосуванням "зараз" у gc.pruneexpireзмінній конфігурації, необхідній для здійснення вищезазначеної поведінки).


У вас також є (з тієї ж теми):

repack -a -d -l

Зауважте малі літери "а".

git-gcперекликає перезарядку з великого регістру "A", саме це призводить до розпакування недоступних об'єктів. Маленьке «а» - це для людей, які знають, що роблять, і хочуть, щоб git просто кидав недоступні об’єкти.


1
"git prune", ймовірно, вирішить мою найближчу проблему - я спробую це пізніше сьогодні. Однак мені подобається аспект безпеки зберігання сипучих предметів протягом двох тижнів, якщо я хочу повернутися назад і переглянути деякі старі зміни, тому мені це рішення не дуже подобається. У мене не виникає жодних проблем з розміром або продуктивністю git, це просто «git gui», яке наполягає на тому, щоб я просив стискати базу даних, навіть коли стискання бази даних не матиме жодного ефекту.
Майкл Донохуе

дуже корисний коментар. Це дратівливе повідомлення про "пухкий предмет" стало дуже дратує. Звідки взагалі береться ця кількість? Можливо, вихід git-fsck?
Девід Домбровський

дякую - у мене також були пухкі предмети, які git gc не видаляв - відповідь git prune.
пролито

Я зробив чорнову тріскунку поза будь-яким сховищем, і це очистило деякі об’єкти. Потім я зайшов у сховище проблем і зробив git prune, і всі проблеми вже не було.
Микола Орловський

"git prune" вирішує проблему OP (і я) мала: "Я робив це раніше, і це зменшує сипучі об'єкти до приблизно 250, але це не пригнічує спливаюче вікно".
Ейке

32

Коли спливає "Loose Object", я знаю, що настав час запустити збирач сміття git:

git gc

Після цього спливаюче вікно відходить.

Оновлення: (із-за пропозиції TED)

Я витягнув нижчезазначений режим із git/share/git-gui/lib/database.tcl
Ви можете змінити його, щоб відповідати вашим потребам.

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
        }
    }
}

1
Чи не натискання кнопки "OK" у діалоговому вікні робить це саме так? Якби gc не позбувся всіх сипучих об'єктів, він все одно отримає діалогове вікно.
ТЕД

Я натиснув "ОК" і запустив "git gc" з командного рядка - вони обоє зводять мене до 250, але робити це знову не дає подальшого прогресу.
Майкл Донохуе

3
Я знаю, що це дивно, але очищення основи від Gui іноді залишає пухкі предмети. Я закриваю gui, запускаю git-gc, а потім все сміття пішло.
Нік Дандолакіс

3
Зміна tcl виправляє це - я щойно збільшив ліміт вікон до 10 * 250. Дякую!
Майкл Донохуе

для мене біг git gcз командного рядка вирішив проблему ... просто натискання okна git gui якось не зробило трюку ...
raphael

3

Хмммм .... Я не бачу аргументу командного рядка для цього в документах .

Я припускаю, що ви завжди можете зняти його джерело, вийняти код для діалогу та відновити його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.