2010-08-08 64 views
0

我想使用git pre-auto-gc hook,但它似乎沒有被調用。git pre-auto-gc hook根本不會被調用

該文件是可執行文件,我使用git 1.7.1和1.5.6.5對它進行了測試,它們都沒有像預期的那樣工作(當運行git gc --auto時,它們沒有調用腳本)。

有沒有人對此有所瞭解?也許我需要在配置中設置一些東西讓git知道這個鉤子?

我試着google了一下,但我沒有發現任何東西......

感謝:-)。

回答

0

好的,我可能會有答案。

gc.c Git的來源,我看到鉤在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只在極端情況下才需要。

無論如何,它讓我很煩,這個鉤子沒有被調用,這麼多。

+0

我很好奇,如果已經確定gc不會運行,爲什麼要運行該鉤子?該鉤子旨在讓您有機會拒絕自動gc,如果它是由於運行;如果gc不會在任何情況下運行,似乎沒有任何意義。 – 2010-08-08 10:17:45

+0

@Charles:我想讓這個鉤子運行,因爲我用它來做別的事情。我正在編寫一個基於git的博客引擎,使用鉤子來生成靜態html。我希望能夠用鉤子來重建每個html文件(例如在模板更改的情況下),而我所看到的唯一「乾淨」方式就是使用這個pre-auto-gc鉤子。 – p4bl0 2010-08-08 12:01:53

+0

如果您使用鉤子來生成基於存儲庫更改的內容,是不是pre-auto-gc完全不合適?不會後提交或更新後更適合? – 2010-08-08 13:12:35