2015-09-04 69 views
7

--abbrev-commit標誌可與git loggit rev-list一起使用,以顯示部分前綴而不是提交對象的全部40個字符的SHA-1哈希值。按照Pro Git book在我的回購中,最長的哈希前綴需要多長時間才能防止重疊?

它默認使用七個字符,但使他們更長,如果有必要保持SHA-1歧義[...]

此外,短的SHA至少4-字符長。仍然根據Pro Git書,

一般來說,8到10個字符綽綽有餘在項目中是唯一的。

作爲一個例子,Linux內核是一個超過450k提交和360萬個對象的相當大的項目,沒有兩個對象的SHA-1重疊超過前11個字符。

由於爲防止提交對象的所有前綴哈希值(在Linux內核的情況下爲11)所需的最長前綴的長度是回購規模的粗略指標,所以我想以編程方式確定我自己的本地存儲庫中的相應數量。我怎樣才能做到這一點?

+0

你的意思是http://stackoverflow.com/a/21015031/3691891? –

+0

@ArkadiuszDrabczyk不完全。您的鏈接僅提供了一種方法,用於確定給定提交哈希的前綴可以多短以避免與其他哈希值重疊。我要求存儲庫中所有提交散列的數量最大。 – Jubobs

+1

如果不檢查回購庫中的所有提交,您無法*嚴格*確定所需的前綴長度。原則上,回購可能只有兩個提交,其前39個字符相同。實際所需的長度可能隨着下一次提交而改變。 –

回答

14

以下shell腳本在本地repo中運行時,會輸出所需最長前綴的長度,以防止該存儲庫的提交對象的所有前綴哈希值之間發生重疊。

MAX_LENGTH=4; 

git rev-list --abbrev=4 --abbrev-commit --all | \ 
    (while read -r line; do 
     if [ ${#line} -gt $MAX_LENGTH ]; then 
     MAX_LENGTH=${#line}; 
     fi 
    done && printf %s\\n "$MAX_LENGTH" 
) 

我最後一次編輯這個答案,腳本印刷

6

Jubob的腳本非常棒,向上投票。

如果你想獲得最低提交哈希長度的分佈的概念,你可以運行此一行代碼:

git rev-list --abbrev=4 --abbrev-commit --all | (while read -r line; do echo ${#line}; done;) | sort -n | uniq -c 

對於git project本身今日(GIT-上GIT) ,這會產生這樣的:

1788 4 
35086 5 
7881 6 
    533 7 
    39 8 
    4 9 

...得到提交,可以唯一地與 -char散列來表示(或更低,這是GIT中的最低縮寫),和提交需要 -of-40個字符的散列,以便唯一地選擇它們。

相比之下,一個更大的項目,如Linux kernel,有這個分佈今天:

6179 5 
446463 6 
139247 7 
10018 8 
655 9 
41 10 
3  11 
擁有近500萬個對象的數據庫

所以和600K承諾,有犯下目前要求的11 40個十六進制數字以區別於其他所有提交。

相關問題