Как пропустить "свободный объект" всплывающее окно при запуске графический интерфейс в Git'


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

This repository currently has approximately 1500 loose objects.

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

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

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

4 107

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)

обновление: git prune будет "решить" проблему, в том, что он будет удалять эти свободные объекты
(git gc звонки git prune, но только для незакрепленных объектов старше двух недель, по умолчанию).
Впрочем, как и OP Michael Donohue упоминает в комментарии:

мне нравится аспект безопасности хранения свободных объектов в течение двух недель, если я хочу вернуться и посмотреть на некоторые старые изменения, поэтому я не хочу очень нравится это решение.
У меня нет никаких проблем с размером или производительностью 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

обратите внимание на нижний регистр 'a'.

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

когда всплывающее окно" 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
        }
    }
}

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

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