Как пропустить всплывающее окно "Loose Object" при запуске git gui
Когда я запускаю "git gui", я получаю всплывающее окно, которое говорит
Этот репозиторий в настоящее время содержит около 1500 незакрепленных объектов.
Затем предлагается сжатие базы данных. Я делал это раньше, и это уменьшает количество потерянных объектов примерно до 250, но это не подавляет всплывающее окно. Сжатие снова не меняет количество потерянных объектов.
Наш текущий рабочий процесс требует значительного использования "rebase" при переходе от Perforce, и Perforce по-прежнему остается каноническим SCM. Как только Git станет каноническим SCM, мы будем выполнять регулярные слияния, и проблема свободных объектов должна быть значительно уменьшена.
В то же время я бы очень хотел, чтобы это "полезное" всплывающее окно исчезло.
5 ответов
Поскольку никто еще не получил ответа, я изучил код, чтобы увидеть, как удалить код, отображающий этот диалог. Я нашел 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
, но только для незакрепленных объектов старше двух недель, по умолчанию).
Однако, как отмечает в комментариях 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
переменная config, необходимая для выполнения описанного выше поведения).
У вас также есть (из той же темы):
repack -a -d -l
Обратите внимание на строчную букву "а".
git-gc
вызывает repack с прописной буквой 'A', что приводит к распаковке недоступных объектов. Маленькая "а" предназначена для людей, которые знают, что делают, и хотят, чтобы git просто сбрасывал недоступные объекты.
Когда всплывающее окно "Loose Object", я знаю, что пришло время запустить сборщик мусора в 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
}
}
}
Хмммм.... Я не вижу аргумента командной строки для этого в документах.
Я полагаю, вы всегда можете найти его исходный код, взять код для диалога и перестроить.
Чтобы добавить к ответам и объяснениям:
Если вы хотите продолжать отслеживать незакрепленные объекты, но не хотите, чтобы всплывающее окно полностью исчезло (оно постоянно всплывает для больших проектов), вы можете изменить файл database.tcl, который, вероятно, находится в этой папке:
C:\Program Files\Git\mingw64\share\git-gui\lib\
В функции proc hint_gc {}
proc hint_gc {} {
set ndirs 1
set limit 8
if {[is_Windows]} {
set ndirs 8
set limit 1
}
Вы можете изменить
set ndirs 8
к
set ndirs 32
Например.