किसी दिए गए कोडबेस में बदलाव की पहचान करने के लिए आवश्यक रूप से एक git sha का कितना हिस्सा * आम तौर पर * माना जाता है?


212

यदि आप निर्माण करने जा रहे हैं, तो कहें, एक निर्देशिका संरचना जहां एक निर्देशिका का नाम Git रिपॉजिटरी में एक कमेटी के लिए रखा गया है, और आप चाहते हैं कि यह आपकी आंखों को खून न बहाने के लिए पर्याप्त हो, लेकिन लंबे समय तक यह संभव है कि इसके टकराने की संभावना हो नगण्य होगा, एसएचए सबस्टेशन की आम तौर पर कितनी आवश्यकता होती है?

मान लें कि मैं इस परिवर्तन को विशिष्ट रूप से पहचानना चाहता हूं: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11b7e920

मैं पहले चार पात्रों के रूप में कम उपयोग कर सकता हूं: https://github.com/wycats/handlebars.js/commit/629

लेकिन मुझे ऐसा लगता है कि यह जोखिम भरा होगा। लेकिन एक कोडबेस को ssuming, जो कुछ वर्षों में, कह सकता है- 30k परिवर्तन, अगर मैं 8 वर्णों का उपयोग करता हूं तो टकराव की संभावना क्या है? 12? क्या ऐसी संख्या है जिसे आम तौर पर इस तरह की चीज़ के लिए स्वीकार्य माना जाता है?


जवाबों:


230

यह प्रश्न वास्तव में प्रो गिट पुस्तक के अध्याय 7 में दिया गया है :

आम तौर पर, एक परियोजना के भीतर आठ से दस अक्षर अद्वितीय होने के लिए पर्याप्त से अधिक होते हैं। सबसे बड़ी Git परियोजनाओं में से एक, लिनक्स कर्नेल, को अद्वितीय रहने के लिए संभावित 40 में से 12 पात्रों की आवश्यकता है।

7 अंक एक छोटे SHA के लिए Git डिफ़ॉल्ट है, इसलिए यह अधिकांश परियोजनाओं के लिए ठीक है। उल्लेख के अनुसार कर्नेल टीम ने कई बार अपनी वृद्धि की है, क्योंकि कई सौ कमिट्स हैं। तो आपके ~ 30k के लिए, 8 या 10 अंक पूरी तरह से ठीक होना चाहिए।


38
यह भी ध्यान दें कि gitजब यह आता है तो यह काफी स्मार्ट है। आप संक्षिप्त नाम को 4 पर सेट कर सकते हैं और 4 gitहैश के लिए 4 अंकों का उपयोग कर सकते हैं, लेकिन यह 5 या अधिक पर स्विच कर सकता है जब यह पता
चले

31
हालांकि, यह भी ध्यान दें कि निश्चित रूप से यह केवल उस समय के लिए लागू होता है जब गिट SHA प्रिंट करता है। यदि आप संक्षिप्त किए गए SHAs (जैसे, लॉग, ईमेल, IM, आदि में) को "सेव" करते हैं और बाद में कमिट्स को संदर्भित करने के लिए उनका उपयोग करते हैं, तो वे अब अद्वितीय नहीं हो सकते हैं! हालांकि, 7-12 अक्षरों की तरह सामान्य लंबाई के लिए निश्चित रूप से संभावना नहीं है, अगर आप 4 या 5 से नीचे जाते हैं, और आपको कुछ दस हजार नई वस्तुएं मिलती हैं (या संदर्भ के आधार पर), यह वास्तव में आपको काटने के लिए वापस आ सकती है।
नेविक रेहेल

140

नोट: आप git rev-parse --shortसबसे छोटे और अभी तक अद्वितीय SHA1 के लिए पूछ सकते हैं ।
" नियमित रूप से हैश से कम हैश देखें "

git rev-parse --short=4 921103db8259eb9de72f42db8b939895f5651489
92110

जैसा कि आप मेरे उदाहरण में देख सकते हैं कि SHA1 की लंबाई 5 है, भले ही मैंने 4 की लंबाई निर्दिष्ट की हो।


बड़े रेपो के लिए, 2010 के बाद से 7 पर्याप्त नहीं है, और खुद लिनुस टॉर्वाल्ड्स द्वारा dce9648 प्रतिबद्ध करें (1.7.4.4, अक्टूबर 2010 को git):

7 का डिफ़ॉल्ट जीआईटी विकास में काफी पहले से आता है, जब सात हेक्स अंक बहुत अधिक थे (यह लगभग 250+ मिलियन हवेल मूल्यों को शामिल करता है)।
फिर मैंने सोचा कि 65k संशोधन बहुत कुछ था (यह वही था जो हम बीके में हिट करने वाले थे), और प्रत्येक संशोधन में लगभग 5-10 नए ऑब्जेक्ट या तो होते हैं, इसलिए एक मिलियन ऑब्जेक्ट एक बड़ी संख्या थी।

(बीके = बिटकीपर)

इन दिनों, कर्नेल सबसे बड़ी git परियोजना भी नहीं है, और यहां तक ​​कि कर्नेल में 220k संशोधन ( कभी बीके के पेड़ की तुलना में बहुत बड़ा है) और हम दो मिलियन ऑब्जेक्ट्स से संपर्क कर रहे हैं।
उस बिंदु पर, सात हेक्स अंक अभी भी उनमें से बहुत कुछ के लिए अद्वितीय है, लेकिन जब हम वस्तुओं की संख्या और हैश आकार के बीच परिमाण के अंतर के सिर्फ दो आदेशों के बारे में बात कर रहे हैं, तो काटे गए हैश मूल्यों में टकराव होंगे
यह अब अवास्तविक के करीब भी नहीं है - यह हर समय होता है।

हम दोनों को डिफ़ॉल्ट abbrev को बढ़ाना चाहिए जो कि अनुचित रूप से छोटा था, और लोगों के लिए git config फाइल में अपने स्वयं के डिफ़ॉल्ट प्रति प्रोजेक्ट को सेट करने का एक तरीका जोड़ें

core.abbrev

लंबाई की वस्तु के नाम संक्षिप्त करें।
यदि अनिर्दिष्ट है, तो कई कमांड 7 हेक्सिडिज के लिए संक्षिप्त हैं, जो संक्षिप्त नाम के लिए पर्याप्त रूप से लंबे समय तक अद्वितीय रहने के लिए पर्याप्त नहीं हो सकता है।

environment.c:

int minimum_abbrev = 4, default_abbrev = 7;

नोट: जैसा कि नीचे marco.m द्वारा टिप्पणी की गई थी , उसी core.abbrevLengthनाम से इसका नाम बदल दिया गया था। core.abbrev1.7.4.4 कमिट में a71f09f

नाम बदलें core.abbrevlengthकरने के लिए वापसcore.abbrev

यह --abbrev=$nसब के बाद कमांड लाइन विकल्प से मेल खाती है ।


हाल ही में, लिनस ने प्रतिबद्ध e6c587c (Git 2.11, Q4 2016 के लिए) में जोड़ा :
(जैसा कि मैथ्यू मोय के जवाब में बताया गया है )

काफी शुरुआती दिनों में हमने किसी तरह 7-hexdigits के नीचे ऑब्जेक्ट नामों को संक्षिप्त करने का निर्णय लिया, लेकिन जैसे-जैसे प्रोजेक्ट बढ़ते हैं, यह पहले के दिनों में किए गए ऐसे शॉर्ट ऑब्जेक्ट नामों को देखने के लिए अधिक से अधिक हो रहा है और लॉग संदेशों में दर्ज नहीं रह गया है।

वर्तमान में लिनक्स कर्नेल प्रोजेक्ट को 11 से 12 हेक्सिडिज की जरूरत है, जबकि गिट को खुद की वस्तुओं की विशिष्ट पहचान करने के लिए 10 हेक्सिडिज की जरूरत है, जबकि कई छोटी परियोजनाएं मूल 7-हेक्सिडिज डिफ़ॉल्ट के साथ अभी भी ठीक हो सकती हैं। एक-आकार सभी परियोजनाओं के लिए फिट नहीं है।

एक तंत्र का परिचय दें, जहां हम पहले ऑब्जेक्ट पर डिफ़ॉल्ट सेटिंग के साथ एक वस्तु का नाम संक्षिप्त करने के लिए भंडार में वस्तुओं की संख्या का अनुमान लगाते हैं और भंडार के लिए एक डिफ़ॉल्ट डिफ़ॉल्ट के साथ आते हैं। इस उम्मीद के आधार पर कि हम 2^(2N)ऑब्जेक्ट्स के साथ एक रिपॉजिटरी में टकराव देखेंगे जब ऑब्जेक्ट नामों को पहले एन बिट्स के लिए छोटा किया जाता है, रिपॉजिटरी में ऑब्जेक्ट्स की संख्या को कवर करने के लिए पर्याप्त संख्या में हेक्सिडिट्स का उपयोग करें।
प्रत्येक हेक्सिडिटिज (4-बिट्स) जिसे हम संक्षिप्त नाम से जोड़ते हैं, हमें रिपॉजिटरी में कई वस्तुओं के रूप में चार गुना (2-बिट्स) करने की अनुमति देता है।

Linus Torvalds ( ) द्वारा प्रतिबद्ध e6c587c (01 अक्टूबर 2016) देखें । देखें प्रतिबद्ध 7b5b772 , प्रतिबद्ध 65acfea (01 अक्टू 2016) द्वारा Junio सी Hamano ( )(द्वारा विलय Junio सी Hamano - - में bb188d0 प्रतिबद्ध , 03 अक्टू 2016)torvalds
gitster
gitster

उस नई संपत्ति (SHA1 abbrev मूल्य के लिए एक उचित डिफ़ॉल्ट का अनुमान लगाते हुए) का सीधा प्रभाव होता है कि कैसे Git रिलीज के लिए अपने स्वयं के संस्करण संख्या की गणना करता है


3
यह उत्तर एक एकल रिपॉजिटरी में सबसे लंबे समय तक "छोटा" हैश की जांच करने का एक तरीका प्रदान करता है: stackoverflow.com/a/32406103/1858225
काइल स्ट्रैंड

1
ध्यान दें कि core.abbrevLengthइसका नाम बदल दिया गया है core.abbrev
marco.m

@ मार्को। धन्यवाद। मैंने उसी हिसाब से जवाब में संशोधन किया है। और मैंने Git प्रतिबद्ध से जुड़ा है जो उस नए नाम को रिकॉर्ड करता है core.abbrev
VonC

मैं इसमें सिर्फ इतना जोड़ूंगा कि आप git rev-parse --short=10 --verify HEAD10 अक्षर उत्पन्न कर सकते हैं । हम उपयोग कर रहे थे git log -1 --format=%h, लेकिन इससे केवल 7 चरित्र उत्पन्न हुए और हमें टक्कर मिली।
ग्रेई

स्पष्टीकरण के लिए धन्यवाद, डॉक्स ( git-scm.com/docs/git-rev-parse ) बासी हैं।
एंड्रे वेरलैंग

36

इसे जन्मदिन की समस्या के रूप में जाना जाता है।

1/2 से कम संभावनाओं के लिए टकराव की संभावना के रूप में अनुमान लगाया जा सकता है

p ~ = (n 2 ) / (2m)

जहाँ n वस्तुओं की संख्या है और m प्रत्येक आइटम के लिए संभावनाओं की संख्या है।

हेक्स स्ट्रिंग के लिए संभावनाओं की संख्या 16 सी है जहां सी अक्षर की संख्या है।

तो 8 अक्षर और 30K के लिए

30K ~ = 2 15

पी ~ = (एन 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 8 ) = 2 30 /2 33 = ⅛

इसे बढ़ाकर 12 अक्षर कर दिया

पी ~ = (एन 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 12 ) = 2 30 /2 49 = 2 -19


बिल्कुल सवाल मैं हल करने के लिए कोशिश कर रहा था, धन्यवाद! @ मेसा के जवाब में लिंक की गई संभावना तालिका भी सहायक है।
काइल चड्ढा

उत्कृष्ट, हमें इसके अलावा और कुछ भी नहीं चाहिए, इसे न केवल समझाएं कि यह क्या है, बल्कि यह कैसे आता है ...
वर्कप्लेसिफाइकल

13

इस सवाल का जवाब दिया गया है, लेकिन पीछे गणित देखने वाले किसी व्यक्ति के लिए - इसे जन्मदिन की समस्या ( विकिपीडिया ) कहा जाता है ।

यह एन के समूह के 2 (या अधिक) लोगों के वर्ष में एक ही दिन जन्मदिन होने की संभावना के बारे में है। जो 2 के प्रोबिली से अनुरूप है (या अधिक) git भंडार से होता है जिसमें N का कुल लंबाई X का समान हैश उपसर्ग होता है।

को देखो संभावना तालिका । उदाहरण के लिए हैश हेक्स स्ट्रिंग ऑफ़ लेंथ 8 के टकराने की संभावना 1% तक पहुँच जाती है जब रिपॉजिटरी में लगभग 9300 आइटम होते हैं (git commits)। 110 000 के लिए संभावना 75% है। लेकिन अगर आपके पास हैश की लंबाई 12 है, तो 100 000 कमिट में टकराने की संभावना 0.1% से कम है।


2

Git संस्करण 2.11 (या शायद 2.12?) में एक विशेषता होगी git log --onelineजो परियोजना के आकार के लिए लघु पहचानकर्ताओं (जैसे ) में प्रयुक्त वर्णों की संख्या को बढ़ाती है । एक बार जब आप Git के ऐसे संस्करण का उपयोग करते हैं, तो आपके प्रश्न का उत्तर "जिस भी लंबाई के साथ Git आपको देता है git log --oneline, उसे उठाएं , यह काफी सुरक्षित है"।

अधिक जानकारी के लिए, "core.abbrev" के लिए डिफ़ॉल्ट बदलना देखें ? Git Rev News संस्करण 20 में चर्चा करें और bb188d00f7 प्रतिबद्ध करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.