Как пропустить всплывающее окно «Свободный объект» при запуске 'git gui'

124

Когда я запускаю git gui, я получаю всплывающее окно с надписью

В настоящее время в этом репозитории около 1500 незакрепленных объектов.

Затем он предлагает сжать базу данных. Я делал это раньше, и это уменьшает количество свободных объектов примерно до 250, но это не подавляет всплывающее окно. Повторное сжатие не меняет количество незакрепленных объектов.

Наш текущий рабочий процесс требует значительного использования «rebase», поскольку мы переходим с Perforce, а Perforce по-прежнему является каноническим SCM. Как только Git станет каноническим SCM, мы будем выполнять регулярные слияния, и проблема свободных объектов должна быть значительно уменьшена.

А пока я бы очень хотел убрать это «полезное» всплывающее окно.

Майкл Донохью
источник
1
Этот диалог - отличный пример «возможности», которой многие хотели бы, чтобы ее не существовало. Это не только раздражает, но и может стереть важные коммиты, которые были отсоединены после аппаратного сброса.
adelriosantiago

Ответы:

171

Поскольку никто еще не ответил, я просмотрел код, чтобы увидеть, как удалить код, который появляется в этом диалоговом окне. Я нашел hint_gcпроцедуру, которая это делает, и место, где она вызывается. В то же время я заметил, что в конце 2011 года в настройках была добавлена опция отключения диалога . Это изменение (часть мерзавца-гуй 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 секунд.
fuglede 06
1
Однако, как упоминалось в ответе @ NickDandoulakis, он database.tclсодержит определение лимита и может быть увеличен, чтобы сделать диалог менее частым.
fuglede 06
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, операция займет довольно много времени, и количество используемых блоков и inode значительно вырастет.

Они исчезнут после " 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вызывает repack с прописной буквой «A», что вызывает распаковку недостижимых объектов. Маленькая буква «а» предназначена для людей, которые знают, что делают, и хотят, чтобы git просто отбрасывал недостижимые объекты.

VonC
источник
1
'git prune', вероятно, решит мою непосредственную проблему - я попробую это позже сегодня. Тем не менее, мне нравится аспект безопасности, заключающийся в хранении незакрепленных предметов в течение двух недель, если я захочу вернуться и взглянуть на некоторые старые версии, поэтому мне не очень нравится это решение. У меня нет проблем с размером или производительностью git, это просто git gui настаивает на том, чтобы я просил меня сжать базу данных, даже если сжатие базы данных не повлияет.
Майкл Донохью
очень полезный комментарий. Это надоедливое сообщение о «потерянном предмете» стало действительно раздражать. Откуда вообще берется этот счет? Возможно, вывод git-fsck?
Дэвид Домбровски,
спасибо - у меня также были незакрепленные объекты, которые git gc не удалял - ответ был git prune.
shedd
Я сделал git-обрезку вне любого репозитория, и он очистил некоторые объекты. Затем я вошел в репозиторий проблем и сделал git-обрезку, и все проблемы исчезли.
Николас Орловский
«git prune» решает проблему, с которой столкнулись OP (и я): «Я делал это раньше, и это уменьшает количество свободных объектов примерно до 250, но это не подавляет всплывающее окно».
Eike
32

Когда появляется всплывающее окно «Свободный объект», я понимаю, что пора запустить сборщик мусора 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
Разве это не делается при нажатии кнопки ОК в диалоговом окне? Если gc не избавится от всех незакрепленных объектов, он все равно получит диалог.
TED
Я нажал «ОК» и запустил «git gc» из командной строки - они оба снижают меня до 250, но повторное выполнение этого не дает дальнейшего прогресса.
Майкл Донохью,
3
Я знаю, что это странно, но при очистке базы от графического интерфейса иногда остаются незакрепленные объекты. Я закрываю графический интерфейс, запускаю git-gc, и весь мусор исчезает.
Ник Дандулакис, 09
3
Изменение tcl исправляет это - я просто увеличил лимит окон до 10 * 250. Спасибо!
Майкл Донохью
для меня запуск git gcиз командной строки решил проблему ... просто щелчок okв git gui почему-то не помог ...
raphael
3

Хмммм .... Я не вижу аргументов командной строки для этого в документации .

Я полагаю, вы всегда можете загрузить его исходный код, вынуть код диалога и перестроить.

ТЕД
источник