Как пропустить всплывающее окно «Loose Object» при запуске git gui - PullRequest
111 голосов
/ 10 июля 2009

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

This repository currently has approximately 1500 loose objects.

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

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

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

Ответы [ 4 ]

149 голосов
/ 13 апреля 2012

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

47 голосов
/ 10 июля 2009

Обновление: 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".

Итак, в вашем случае "1059 *" было бы полезно?

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


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

repack -a -d -l

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

git-gc вызывает repack с прописной буквой «A», что приводит к распаковке недоступных объектов. Маленькая буква «а» предназначена для людей, которые знают, что делают, и хотят, чтобы git просто сбрасывал недоступные объекты.

30 голосов
/ 10 июля 2009

Когда появляется всплывающее окно "Loose Object", я знаю, что пора запустить сборщик мусора в git:

git gc

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

Обновление: (по предложению Т.Э.Д.)

Я извлек следующую процедуру из 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
        }
    }
}
3 голосов
/ 10 июля 2009

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

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

...