Список всех команд, вызывающих 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?


person rejj    schedule 28.02.2011    source источник
comment
Примечание. git rebase скоро будет обрабатывать git gc --auto более разумным способом: см. stackoverflow.com/a/35033755/6309   -  person VonC    schedule 27.01.2016
comment
Не забывайте git commit, начиная с Git 2.17 (второй квартал 2018 г.). См. мой ответ ниже   -  person VonC    schedule 11.03.2018


Ответы (2)


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 справиться со всем.

person Arrowmaster    schedule 28.02.2011
comment
Согласен: auto для автоматического, т.е. обычному пользователю не нужно ничего делать. - person Cascabel; 28.02.2011
comment
Я понимаю, что --auto должен быть за кадром, но мне также любопытно, вызывается ли он достаточно часто, чтобы можно было полагаться на --auto для выполнения gc. Я видел другие вопросы, например, как часто мне следует запускать git gc?, но не мог понять, вызывается ли --auto достаточно часто, чтобы пользователям практически никогда не приходилось думать о ручном запуске git gc. Я отмечу это как принятое, так как в нем есть список команд, спасибо, Arrowmaster. Мне все еще любопытно, думают ли люди, что --auto достаточно хорош, или пользователям все же следует время от времени делать git gc вручную. - person rejj; 01.03.2011
comment
Иногда я использую git для резервного копирования своих файлов. В этих репозиториях cronjob выполняет только команды git add, git commit и git push. Ни один из них не вызовет git gc --auto. Поэтому в этой ситуации я не могу полагаться на автоматическую очистку и должен выполнить git gc или git repack вручную. - person Richard Brinkman; 24.11.2017

В Git 2.17 (второй квартал 2018 г.) вам придется добавить git commit в список команд, вызывающих git gc --auto.
На самом деле, так должно было быть с самого начала Git.

См. commit 095c741 (28 февраля 2018 г.) от Ævar Arnfjörð Bjarmason (avar).
(объединено Хунио C Хамано -- gitster -- в commit 9bb8eb0, 08 марта 2018 г.)

commit: запустить git gc --auto прямо перед хуком post-commit

Измените поведение git-commit обратно на то, что было в d4bb43e ("Вызов" git gc --auto «из commit, merge, am и rebase.», 05 сентября 2007 г., Git v1.5.4-rc0), когда было git-commit.sh.

Вскоре после этого в f5bbc32 ("Port git commit to 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.
Можно было написать сценарий, который "git commit" выдавал бы много данных локально, а gc никогда не запускался.

Один из таких репозиториев, который локально фиксирул сгенерированные изменения файла зоны, вырос до размера ~ 60 ГБ, прежде чем ежедневное задание cron было добавлено к «git gc», в результате чего его размер уменьшился до менее 1 ГБ. Это заставит такие дела работать без вмешательства.

Я думаю, что исправление таких патологических случаев, когда репозиторий будет расти вечно, является достойным компромиссом для того, чтобы потратить пару миллисекунд на вызов «git gc --auto» (в обычных случаях, когда он ничего не делает).


Вы можете найти другую иллюстрацию этого списка с Git 2.27 (второй квартал 2020 г.), который учит "am", "commit", "merge" и "rebase", когда они запускаются с параметром "--quiet", передавать "--quiet" до "gc --auto".

См. коммит 7c3e9e8, коммит 850b6ed (6 мая 2020 г.), автор Junio ​​C Хамано (gitster).
(Объединено Юнио С. Хамано -- gitster -- в commit 3af459e, 13 мая 2020 г.)

auto-gc: извлечение многоразового помощника из "git fetch"

Отзыв: Тейлор Блау

Еще в 1991006c (fetch: преобразовать argv_gc_auto в структуру argv_array, 16 августа 2014 г., Git v2.1.1), мы научили "git fetch --quiet" передавать параметр "--quiet" вниз до "gc --auto".

Однако эта проблема не ограничивается «выборкой»:

$ git grep -e 'gc.*--auto' \*.c

находит совпадения в «am», «commit», «merge» и «rebase», и эти команды не передают «--quiet» вниз к «gc --auto», когда им самим говорят замолчать.

В качестве подготовительного шага давайте представим вспомогательную функцию run_auto_gc(), в которую вызывающая сторона может передать логическое значение «quiet» и повторно исправить «git fetch» с помощью вспомогательной функции.

person VonC    schedule 11.03.2018