Список всех команд, вызывающих git gc --auto
Есть ли окончательный список команд в любом месте, которые вызывают запуск git gc --auto
? На странице git -gc (1) указано:
- авто
С помощью этой опции git gc проверяет, требуется ли ведение домашнего хозяйства; если нет, он выходит без выполнения каких-либо работ. Некоторые команды git запускают git gc --auto
после выполнения операций, которые могут создавать множество незавершенных объектов.
(выделено курсивом)
Я собираюсь организовать большую миграцию из SVN в Git. Подавляющее большинство пользователей будут на ПК с ОС Windows, а их незначительная часть не является технической. Они будут использовать TortoiseGit (так как он точно соответствует TortoiseSVN, с которым они уже знакомы) - я заметил, что TortoiseGit не содержит никаких функций для запуска git gc
вручную вообще.
Ожидается, что нетехнический персонал должен запустить командную строку "git bash" для запуска git gc --auto
из соответствующего рабочего каталога; и поскольку мы используем "переносимое" распределение MsysGit, у них не будет "git GUI Here.." контекстного меню контекстного меню Windows.
Можно ли ожидать, что с течением времени git будет в основном самоподдерживаться, или мне нужно попытаться разработать нетехнический удобный метод вызова git gc --auto
?
Ответы
Ответ 1
builtin/merge.c: const char *argv_gc_auto[] = { "gc", "--auto", NULL };
builtin/receive-pack.c: "gc", "--auto", "--quiet", NULL,
git-am.sh: git gc --auto
git-rebase--interactive.sh: git gc --auto &&
git-svn.perl: command_noisy('gc', '--auto');
Из git grep -- --auto
на git.git эти результаты выглядели интересными. Значимым является builtin/merge.c
, означающее, что когда-либо столь распространенный git pull
должен запускать git gc --auto
.
Кроме того, если ваш "нетехнический" персонал не делает "продвинутый" материал (в этот момент они больше не будут "нетехническими" ), я не понимаю, почему им когда-либо понадобится запустить git gc
вручную, а не просто git gc --auto
обрабатывать все.
Ответ 2
С Git 2.17 (Q2 2018) вам нужно добавить git commit
в список команд, запускающих git gc --auto
.
На самом деле это должно было быть с начала Git.
См. commit 095c741 (28 февраля 2018 г.) Ævar Arnfjörð Bjarmason (avar
).
(слияние Junio C Hamano - gitster
- в commit 9bb8eb0, 08 Mar 2018)
commit
: запустите git gc --auto
непосредственно перед post-commit
hook
Измените поведение git-commit
на то, что было в d4bb43e ( "Invoke" git gc --auto
"от commit
, merge
, am
и rebase
.", 2007-09-05, Git v1.5.4-rc0), когда он был git-commit.sh
.
Вскоре после этого в f5bbc32 ( "Порт git commit
до C.", 2007-11-08, Git v1.5.4-rc0), когда он был перенесен на C, вызов "git gc --auto
" ушел.
С этой непреднамеренной регрессии git gc --auto
работает только для git-am
, git-merge
, git-fetch
и git-receive-pack
.
Можно было написать script, в котором "git commit
" было бы много данных локально, а gc
никогда не запустится.
Один такой репозиторий, который локально записывал сгенерированный файл зоны изменения выросли до размера ~ 60 ГБ до того, как была добавлена ежедневная cronjob до "git gc
", доведя его до менее 1 ГБ. Это сделает такой случаи работают без вмешательства.
Я считаю, что фиксировать такие патологические случаи, когда репозиторий будет расти навсегда - достойный компромисс для проведения нескольких миллисекунды, вызывающие "git gc --auto
" (в обычных случаях, когда ничего не делает).