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

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

This repository currently has approximately 1500 loose objects.

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

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

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


person Michael Donohue    schedule 09.07.2009    source источник
comment
Этот диалог - отличный пример функции, которой многие хотели бы, чтобы ее не существовало. Это не только раздражает, но и может стереть важные коммиты, которые были отсоединены после аппаратного сброса.   -  person adelriosantiago    schedule 05.09.2017


Ответы (4)


Поскольку никто еще не получил ответа, я просмотрел код, чтобы увидеть, как удалить код, отображающий это диалоговое окно. Я нашел 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)

person Esko Luontola    schedule 12.04.2012
comment
Можем ли мы увеличить after 1000 hint_gc, чтобы предупреждение появлялось после 10000 незакрепленных предметов? - person sashoalm; 17.02.2017
comment
@sashoalm Согласен. Это здесь по какой-то причине. - person HankCa; 29.11.2017
comment
Интересно, в чем именно заключаются веские причины, что диалог - такая боль, без четкого объяснения веских причин, я, конечно, очень хочу просто ударить по приведенной выше команде. - person Josh Mc; 15.05.2018
comment
@sashoalm: Возможно, это то, что вы имеете в виду, но 1000 из after 1000 обозначают количество миллисекунд ожидания, пока не отобразится диалоговое окно. Если увеличить его до 10000, диалоговое окно все равно будет отображаться, но вместо этого потребуется 10 секунд. - person fuglede; 06.08.2018
comment
Однако, как упоминалось в ответе @ NickDandoulakis, database.tcl содержит определение лимита и может быть увеличено, чтобы сделать диалог менее частым. - person fuglede; 06.08.2018
comment
Лучше разобраться с проблемой, чем отключить предупреждение. Закройте Git GUI, откройте Git Bash и выполните команду git gc --aggressive. Теперь снова откройте Git GUI. - person AlainD; 09.01.2021
comment
@AlainD git уже время от времени самостоятельно выполняет сборку мусора, как часть других команд git, когда считает это необходимым. Поэтому я бы сказал, что предупреждение git gui и пользователь, запускающий вручную git gc, (как правило) не нужны и излишне самоуверенны в отношении git gui. - person tjalling; 17.05.2021

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

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


Оригинальный ответ:

О проблеме "git gc" не удаления всех незакрепленных объектов сообщалось ранее (конец 2008 г., "" _ 5_ ", похоже, больше не удаляет незакрепленные объекты"

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

person VonC    schedule 10.07.2009
comment
'git prune', вероятно, решит мою непосредственную проблему - я попробую это позже сегодня. Тем не менее, мне нравится аспект безопасности, заключающийся в хранении незакрепленных предметов в течение двух недель, если я захочу вернуться и взглянуть на некоторые старые версии, поэтому мне не очень нравится это решение. У меня нет проблем с размером или производительностью git, это просто git gui настаивает на том, чтобы я просил меня сжать базу данных, даже если сжатие базы данных не повлияет. - person Michael Donohue; 10.07.2009
comment
очень полезный комментарий. Это надоедливое сообщение о незакрепленном объекте стало действительно раздражать. Откуда вообще берется этот счет? Возможно, вывод git-fsck? - person David Dombrowsky; 07.10.2009
comment
спасибо - у меня также были незакрепленные объекты, которые git gc не удалял - git prune был ответом. - person shedd; 20.03.2012
comment
Я сделал git prune вне любого репозитория, и он очистил некоторые объекты. Затем я вошел в репозиторий проблем и сделал git-обрезку, и все проблемы исчезли. - person Nicholas Orlowski; 30.01.2013
comment
git prune решает проблему, возникшую у OP (и у меня): я делал это раньше, и он уменьшает количество свободных объектов примерно до 250, но это не подавляет всплывающее окно. - person Eike; 01.10.2019
comment
@Eike убирает ли предложенный ниже git gc всплывающее окно (как указано ниже)? - person VonC; 01.10.2019
comment
@VonC Я пробовал только git prune, и это избавило меня от всплывающего окна. - person Eike; 21.10.2019
comment
Распаковывать незакрепленные предметы кажется хорошей идеей, потому что они исчезнут в течение 2 недель. Так что, если вы можете подождать этот период времени, это имеет смысл. - person usr; 16.02.2020

Когда появляется всплывающее окно «Свободный объект», я понимаю, что пора запустить сборщик мусора git:

git gc

После этого всплывающее окно исчезнет.

Обновление: (по предложению T.E.D.)

Я извлек приведенную ниже процедуру из 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
        }
    }
}
person Nick Dandoulakis    schedule 09.07.2009
comment
Разве это не делается при нажатии кнопки ОК в диалоговом окне? Если gc не избавится от всех незакрепленных объектов, он все равно получит диалог. - person T.E.D.; 10.07.2009
comment
Я нажал «ОК» и запустил «git gc» из командной строки - они оба снижают меня до 250, но повторное выполнение этого не приводит к дальнейшему прогрессу. - person Michael Donohue; 10.07.2009
comment
Я знаю, что это странно, но при очистке базы от графического интерфейса иногда остаются незакрепленные объекты. Я закрываю графический интерфейс, запускаю git-gc, и весь мусор исчезает. - person Nick Dandoulakis; 10.07.2009
comment
Изменение tcl исправляет это - я просто увеличил лимит окон до 10 * 250. Спасибо! - person Michael Donohue; 10.07.2009
comment
для меня запуск git gc из командной строки решил проблему ... просто щелчок ok в git gui как-то не помог ... - person raphael; 18.02.2020

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

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

person T.E.D.    schedule 09.07.2009