Как пропустить всплывающее окно "Loose Object" при запуске 'git gui'

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

This repository currently has approximately 1500 loose objects.

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

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

Между тем, я бы очень хотел, чтобы это "полезное" всплывающее окно исчезло.

Ответ 1

Поскольку у меня еще не было ответа, я просмотрел код, чтобы увидеть, как удалить код, который показывает этот диалог. Я нашел процедуру hint_gc, которая делает это, и место, где оно вызывается. В то же время я заметил, что в конце 2011 года была добавлена ​​опция конфигурации для отключения диалога. Это изменение (часть git -gui 0.16.0) было объединено с Git mainline на 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)

Ответ 2

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

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


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

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

git gc удаляет только свободные объекты старше двух недель, если вы действительно хотите их удалить сейчас, запустите git prune.
Но убедитесь, что никакой другой git-процесс не может быть активным, когда вы его запускаете, или он может что-то наступить.

" git gc " распакует объекты, которые стали недоступными и в настоящее время находятся в пакетах.
В результате объем дискового пространства, используемого репозиторием git, может действительно резко расти после операции " git gc ", что может быть удивительно для тех, кто работает в полной мере на своей файловой системе, удаляет несколько ветвей из, а затем " git gc " может получить очень неприятный сюрприз.

[ Пример: ] Старые ветки зарезервированы через тег, например, next-20081204.
Если вы обновляете локальную копию linux-next repository каждый день, вы накапливаете большое количество этих старых тегов ветвей.
Если вы удалите целую серию из них и запустите 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 "?

(возможно, с использованием "now" в gc.pruneexpire конфигурации gc.pruneexpire, необходимой для выполнения описанного выше поведения).


У вас также есть (из той же темы):

repack -a -d -l

Обратите внимание на строчку "a".

git-gc вызывает переупаковку с верхним регистром "А", что и приводит к распаковке недостижимых объектов. Маленький "а" - для людей, которые знают, что они делают, и хотят, чтобы git просто удалял недоступные объекты.

Ответ 3

Когда всплывает всплывающее окно "Loose Object", я знаю, что нужно запустить 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
        }
    }
}

Ответ 4

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

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