दिलचस्प पोस्ट
खिड़कियां बैच फ़ाइलें: पाश के लिए वैरिएबल सेट करना सी # में एक ही फाइल के लिए दो पथ संदर्भ निर्धारित करने का सबसे अच्छा तरीका मैं ActiveRecord में डिफ़ॉल्ट मान कैसे सेट करूं? EditText के बाहर क्लिक करने के बाद एंड्रॉइड पर सॉफ्ट कीबोर्ड कैसे छिपाएंगे? क्या आप iPhone पर स्थिर पुस्तकालयों से Xib फ़ाइलों का संदर्भ दे सकते हैं? PHP – एकाधिक छवियों को अपलोड करें मर्ज सॉर्ट एल्गोरिथ्म का उपयोग करके इन्हें कैसे सॉर्ट करना है? .NET एसिंक्रोनस स्ट्रीम पढ़ें / लिखें दृश्य स्टूडियो में दस्तावेज़ों के बीच चलने के लिए Ctrl + Tab व्यवहार बदलना सी में एक फ़ंक्शन में पास किए गए एक पॉइंटर को मैं कैसे संशोधित करूं? सोप क्लाइंट क्लास का उपयोग करके एक PHP SOAP कॉल कैसे करें Symfony 2: एक रिपॉजिटरी से एक सेवा बनाना सी ++ स्रोत कोड में यूनिकोड का उपयोग करना ऑब्जेक्ट को JSON स्ट्रिंग में कनवर्ट करें सशर्त त्रिगुट ऑपरेटर का प्रयोग करके लैम्ब्डा के बीच एक फोंक <> सशर्त रूप से मैं कैसे आवंटित कर सकता हूं?

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

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

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

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

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

Solutions Collecting From Web of "दिए गए कोडबेस में परिवर्तन की विशिष्ट पहचान करने के लिए कितनी गिट शा की * आम तौर पर * आवश्यक है?"

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

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

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

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

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

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


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

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

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

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

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

 core.abbrev 

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

environment.c :

 int minimum_abbrev = 4, default_abbrev = 7; 

नोट: जैसा कि marco.m द्वारा नीचे टिप्पणी की गई, core.abbrevLenght को कोर . core.abbrevLenght में इसका नाम दिया गया था, उसी में core.abbrev 1.7.4.4 प्रतिबद्ध ए 71 एफ 0 9 एफ

core.abbrevlength वापस core.abbrevlength नाम बदलें

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


हाल ही में, लीनस ने ई 6 सी 587 सी में जोड़ा ( गीट 2.11, क्यू 4 2016 के लिए):
(जैसा कि मथायी मोय के जवाब में बताया गया है)

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

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

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

लाइलस टॉर्वाल्ड्स ( टॉर्वाल्ड्स ) द्वारा e6c587c (01 अक्टूबर 2016) को देखें।
कमांड 7 बी 5 बी 772 देखें, 65 सीपीए (1 अक्टूबर 2016) को जूनो सी gitster ( gitster ) द्वारा gitster
( जूनो सी gitster द्वारा मर्ज किए गए – gitster – इन बीबी 188 डी 0 , 03 अक्टूबर 2016)

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

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

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

पी ~ = (एन 2 ) / (2 मी)

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

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

तो 8 अक्षर और 30 के लिए कमिट करता है

30K ~ = 2 15

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

इसे 12 वर्णों तक बढ़ाना

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

इस प्रश्न का उत्तर दिया गया है, लेकिन इसके पीछे किसी को भी गणित की तलाश है – इसे जन्मदिन की समस्या ( विकिपीडिया ) कहा जाता है।

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

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

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

अधिक जानकारी के लिए, "core.abbrev" के लिए डिफ़ॉल्ट को बदलना देखें ? गिट रेव न्यूज़ संस्करण 20 में चर्चा और बीबी 188 डी 800 एफ 7 को प्रतिबद्ध