2011-08-19 91 views
47

Git和GitHub都顯示SHA的短版本 - 只是前7個字符,而不是全部40個字符 - 而且Git和GitHub都支持將這些短SHA作爲參數。Git(Hub)如何處理來自短SHA的可能碰撞?

E.g. git show 962a9e8

E.g. https://github.com/joyent/node/commit/962a9e8

鑑於可能性空間現在是數量級的降低,「公正」 268 million,怎麼辦Git和GitHub上防止碰撞在這裏?他們如何處理它們?

+1

這不會成爲GitHub級別的問題,因爲sha1對於每個單獨的項目都是獨一無二的。 – Tone

+14

兩個7字符短sha1在一個項目中發生衝突仍然是完全可能的。 –

+0

有誰知道是否有可能通過github的API獲取提交短的SHA ...例如,https://github.com/alexnaspo/var_dumpling-chrome/commit/9e9726ac返回我需要的提交,但https:/ /api.github.com/repos/alexnaspo/var_dumpling-chrome/git/commits/9e9726ac不是 –

回答

54

這些簡寫形式僅僅是爲了簡化視覺識別並讓你的生活easier。 Git並沒有真正截斷任何東西,內部的一切都將以完整的值處理。儘管如此,您可以在方便時使用部分SHA-1:

只要您的部分SHA-1是提供前幾個字符的Git,至少有四個字符長和明確 - 也就是說,當前存儲庫中只有一個對象以該部分SHA-1開始。

+11

謝謝!該鏈接進一步闡述了:「Git可以找出SHA-1值的簡短縮寫,如果將'--abbrev-commit'傳遞給git log命令,輸出將使用較短的值但保持唯一性;默認使用七個字符,但如果需要使它們更長以保持SHA-1不含糊。「 –

+9

另一個有用的引用:「一般來說,8到10個字符足以在一個項目中是唯一的。最大的Git項目之一,Linux內核,開始需要可能的40箇中的12個字符才能保持獨特。」 –

+0

您的鏈接已損壞... :( – Mrchief

28

我有一個存儲庫,它有一個ID爲000182eacf99cde27d5916aa415921924b82972c的提交。

git show 00018 

顯示修訂,但

git show 0001 

打印

error: short SHA1 0001 is ambiguous. 
error: short SHA1 0001 is ambiguous. 
fatal: ambiguous argument '0001': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions 

(如果你很好奇,它是混帳本身Git倉庫的一個克隆,即承諾是一個Linus Torvalds於2005年製作)。

+6

如果您需要知道哪些對象與您的模糊id(本例中爲「0001」)匹配,您可以執行git rev-list --all --objects | grep^0001'。在你有完整的SHA1列表後,你可以爲每一個做'git show'。 –

+0

[This answer](http://stackoverflow.com/a/27428930/841555)顯示瞭如何僅使用git命令來消除歧義。 – Jeremy

10

兩點需要注意這裏:

  • 如果鍵入Ÿ顯示提交GitHub的頁面上的任何地方,你會看到完整的40個字節表示承諾。
    這說明了emboss的觀點:GitHub不截斷任何東西。

  • 反正2010年以來還有7位是不夠的。
    由Linus Torwalds自己(2010年10月,混帳1.7.4.4)見commit dce9648

的7默認來自於git的發展相當早的,到七個十六進制數字是很多(它佔地約超過250萬個散列值)。當時我認爲65k的版本是很多的(這是我們打算用BK打的),每個版本都會有大約5-10個新的東西,所以一百萬個物品是一個很大的數字。

(BK = BitKeeper的)

這些天來,內核甚至不是最大的Git項目,甚至內核約220K版本(比BK樹曾是大),我們正在接近200萬個物體。在這一點上,七個十六進制數字對於它們中的很多來說仍然是唯一的,但是當我們討論對象數目和散列大小之間的差異僅僅兩個數量級差異時,是在截斷的散列值中的衝突。它不再是不切實際的 - 它總是發生。

我們都應該增加一個不切實際的小默認縮寫,爲人們在git配置文件中設置自己的默認每個項目添加一種方法。

+0

有洞察力。謝謝! –

+0

我很好奇,什麼*是*最大的git項目?或者至少,哪些是最好的例如那裏有絕對龐大的git回購? – GMA

+1

@GeorgeMillo正如http://blogs.atlassian.com/2014/05/handle-big-repositories-git/中提到的,你有兩種巨大的回購(巨大的歷史,或巨大的二進制文件)一個巨大的git回購的例子是Facebook:https://news.ycombinator.com/item?id = 7648237(他們自此轉向他們自己的Mercurial版本) – VonC