Список всех команд, вызывающих 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" (в обычных случаях, когда ничего не делает).