2010-08-08 22 views
0

Je voudrais utiliser le git pre-auto-gc hook mais il ne semble pas être invoqué du tout.Git pré-auto-gc crochet pas invoqué du tout

Le fichier est exécutable et je l'ai testé avec git 1.7.1 et 1.5.6.5, ni l'un ni l'autre ne semble fonctionner comme prévu (ils n'invoquent pas le script lorsque git gc --auto est exécuté).

Est-ce que quelqu'un parmi vous en sait quelque chose? Peut-être que je dois configurer quelque chose dans la configuration pour que git soit conscient de ce hook?

J'ai essayé de google un peu, mais je ne trouve rien ...

Merci :-).

Répondre

0

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.

+0

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. –

+0

@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

+0

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é? –