Хорошо, у меня может быть ответ.
В исходном коде git gc.c я вижу, что ловушка запускается в функции need_to_gc
, которая имеет два способа сжать ее ...
static int need_to_gc(void)
{
/*
* Setting gc.auto to 0 or negative can disable the
* automatic gc.
*/
if (gc_auto_threshold <= 0)
return 0;
/*
* If there are too many loose objects, but not too many
* packs, we run "repack -d -l". If there are too many packs,
* we run "repack -A -d -l". Otherwise we tell the caller
* there is no need.
*/
if (too_many_packs())
append_option(argv_repack,
prune_expire && !strcmp(prune_expire, "now") ?
"-a" : "-A",
MAX_ADD);
else if (!too_many_loose_objects())
return 0;
if (run_hook(NULL, "pre-auto-gc", NULL))
return 0;
return 1;
}
IMO первое короткое замыкание (если gc.auto
установлено в 0) в порядке. Но второе не должно препятствовать запуску хуков, возможно, ему следует передать логический аргумент, говорящий, если да или нет, нужен gc. Потому что в настоящее время разочаровывает, что крюк не запускается, когда вы этого хотите.
И кстати, я обнаружил исходный код git, действительно приятно читать такой чистый код!
РЕДАКТИРОВАТЬ: Я снова протестировал ловушку на некоторых старых и довольно больших репозиториях, и gc никогда не вызывался, когда была предоставлена опция --auto
. Значение по умолчанию auto_threshold
(которое, очевидно, равно 27) может быть слишком высоким или, возможно, gc необходим только в экстремальных ситуациях.
Во всяком случае, меня раздражает, что этот хук не вызывается, так много для этого.