Ok, je peux avoir une réponse.
Dans la source git de gc.c, je vois que le crochet est exécuté dans la fonction need_to_gc
qui ont deux façons de le presser ...
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;
}
OMI le premier court-circuit (si gc.auto
est réglé à 0) est correct. Mais le second ne devrait pas empêcher les hameçons d'être exécutés, peut-être qu'il devrait lui passer un argument booléen disant si oui ou non le gc est nécessaire. Parce que, comme c'est le cas maintenant, c'est frustrant que le crochet ne soit pas lancé quand vous le voudriez.
Et BTW j'ai découvert le code source git, c'est vraiment un plaisir de lire du code bien propre!
EDIT: J'ai testé à nouveau le hook sur certains anciens et plutôt gros repos et le gc n'a jamais été appelé lorsque l'option --auto
a été fournie. La valeur par défaut auto_threshold
(qui est apparemment de 27) peut être un peu trop élevée, ou peut-être que le gc n'est nécessaire que dans des situations extrêmes.
Quoi qu'il en soit, cela m'ennuie que ce hook ne soit pas invoqué, tellement pour ça.
Je suis curieux, pourquoi voulez-vous que le hook soit exécuté s'il a déjà été déterminé que gc ne sera pas exécuté? Le hook est conçu pour vous donner l'opportunité de refuser le gc automatique s'il doit être exécuté; il ne semble pas y avoir de raison de lancer le hook si gc ne va pas être exécuté dans tous les cas. –
@Charles: Je veux que ce hook soit exécuté car je l'utilise pour autre chose. J'écris un moteur de blog basé sur git en utilisant des hooks pour générer du HTML statique. Je veux être capable de reconstruire tous les fichiers html avec un hook (en cas de changement de template par exemple) et le seul moyen "clean" que je vois est d'utiliser ce hook pre-auto-gc. – p4bl0
Si vous utilisez un hook pour générer du contenu en fonction des modifications du référentiel, n'est-il pas complètement pré-auto-gc complètement inapproprié? Est-ce que post-commit ou post-update ne serait pas plus approprié? –