2016-04-08 6 views
7

git bisect का उपयोग करते समय, कोई भी git bisect skip चला सकता है, वर्तमान प्रतिबद्धता को एक निर्विवाद/अवांछनीय होने के रूप में चिह्नित करने के लिए, गिट को इसके बजाय परीक्षण करने के लिए कुछ अन्य प्रतिबद्धता लेने के लिए प्राप्त करने के लिए चला सकता है।गिट bisect skip कैसे कोशिश करने के लिए अगली प्रतिबद्धता का चयन करता है?

गिट कैसे git bisect skip के बाद प्रयास करने का प्रयास करता है? प्रयोग से पता चलता है कि यह सिर्फ एक निकट प्रतिबद्ध नहीं है, लेकिन मैं पैटर्न को काम नहीं कर सकता।

संपादित: मुझे पता है बुनियादी git bisect एक द्विआधारी खोज है हूँ, लेकिन मैं git bisect skip, जो स्पष्ट रूप से कुछ और अधिक जटिल कर रहा है के बारे में उत्सुक हूँ।

प्रयोग से पता चलता है कि यह सिर्फ आसन्न प्रतिबद्धता नहीं उठा रहा है; नीचे 100 0 अंकों की संख्या 0 – 99 बनाता है, फिर उन्हें विभाजित करना शुरू होता है। पहली प्रतिबद्धता git bisect चुनौतियों के बीच में है, लेकिन प्रत्येक git bisect skip उसके बाद यादृच्छिक रूप से चुने गए हैं।

$ git init 
Initialized empty Git repository in .git/ 

$ for ((i=0; i<100; i++)); do echo $i > file; git add file; git commit -m $i >/dev/null; done # Create some dummy commits 

$ git bisect start HEAD $(git rev-list --max-parents=0 HEAD) # HEAD is bad, root commit is good. 
Bisecting: 49 revisions left to test after this (roughly 6 steps) 
[099e5cf2ccde625f92dc369da6cad0bdf2852ce4] 49 

$ git bisect skip 
Bisecting: 49 revisions left to test after this (roughly 6 steps) 
[88c8208a7c4322222124167e49f07c741af7d3d8] 60 

$ git bisect skip 
Bisecting: 49 revisions left to test after this (roughly 6 steps) 
[04695f2e5b2473c3ac72435c0dbfc3ba1375abda] 88 

$ git bisect skip 
Bisecting: 49 revisions left to test after this (roughly 6 steps) 
[1e9bf3d29589bcac2d8c467245ae8d446c195252] 40 

$ git bisect skip 
Bisecting: 49 revisions left to test after this (roughly 6 steps) 
[9459ed79e4112d674681c8f0f921127217c7ebc6] 13 
+0

क्या आपने प्रलेखन पढ़ा था? मैं कहता हूं कि यह एक बाइनरी खोज का उपयोग करता है। https://git-scm.com/docs/git-bisect – crashmstr

+2

@crashmstr क्या आपने किया? यह वास्तव में subcommand * छोड़ * पर बहुत स्पष्ट नहीं है। –

+2

@crashmstr: मुझे पता है कि 'गीट बिसेक्ट' का मूल उपयोग एक बाइनरी खोज है। लेकिन 'गिट बिस्केट स्किप' सिर्फ बाइनरी खोज नहीं हो सकता है क्योंकि यह एक बाइनरी खोज _does_ नहीं है। और हाँ, मैंने प्रलेखन के माध्यम से ट्रेल किया है और यहां पूछने से पहले सोर्स कोड को देखने की कोशिश करना शुरू कर दिया है, और मुझे कहीं भी नहीं मिल रहा है जो बताता है कि 'गिट बिसेक्ट स्किप' के बाद अगली प्रतिबद्धता कैसे चुनी जाती है। –

उत्तर

9

मैं कुछ Git स्रोत कोड में खुदाई और एक जवाब के सबसे पाया अपने आप को ...

Git v1.6 के रूप में किया था।4 (विशेष रूप से, commit ebc9529f के रूप में), गिट एक पूर्वाग्रह के साथ "एक पीआरएनजी (छद्म यादृच्छिक संख्या जनरेटर) का उपयोग करता है" यह निर्धारित करने के लिए कि कौन सा प्रतिबद्धता छोड़ने के बाद अगला प्रयास करें।

:

मैं यह नहीं कह सकते मैं एल्गोरिथ्म ही (जो बाद से यह पहला v2.8.1 के रूप में जोड़ा गया मौलिक अछूता प्रतीत होता है) का पालन करें, लेकिन संदेश के लिए प्रतिबद्ध समझाने का एक उचित काम क्या हो रहा है करता है

द्विभाजित: जब untestable से दूर लंघन करता

एक पूर्वाग्रह के साथ एक PRNG (छद्म यादृच्छिक संख्या जनरेटर) का उपयोग करना बेहतर 3 तय अनुपात के बीच बारी से किया जाना चाहिए एक पूर्वाग्रह के साथ एक PRNG उपयोग करें।

कई अवांछनीय कामों के साथ भंडारों में इसे को उन क्षेत्रों के बीच वैकल्पिक रूप से रोकना चाहिए जहां कई काम अवांछनीय हैं। पूर्वाग्रह का समर्थन करना चाहिए जो अधिक जानकारी दे सकता है, ताकि बीसेक्शन प्रक्रिया को अधिक दक्षता नहीं खोनी चाहिए।

एचपीए ने पीआरएनजी का उपयोग करने का सुझाव दिया और पाया कि सर्वोत्तम पूर्वाग्रह अनुपात को पीआरएनजी द्वारा बिजली 1.5 तक दिए गए 0 और 1 के बीच अनुपात बढ़ाने के लिए है। जैसे कि Git उठाता अगले यादृच्छिक पर कोशिश करने के लिए प्रतिबद्ध है, लेकिन यादृच्छिक वितरण के लिए (उम्मीद) करता है कि द्विआधारी खोज के लिए अधिक जानकारी देने के लिए चुनते हैं और प्रतिबद्ध क्षेत्रों में होने की संभावना से बचने के लिए चुना गया था

तो यह लग रहा है अवांछित काम करता है।

-4

नाम Git सुझाव के रूप में, कम जवाब है: यह अपने businness के गैर है।

git bisect के पीछे विचार यह है कि आप दो समाप्ति बिंदुओं को निर्दिष्ट और Git आंकड़ा यह एक प्रतिबद्ध, के बीच में, यह सोचता है कि परीक्षण की संख्या को कम करने के लक्ष्य के लिए उपयोगी एक है।

प्रलेखन कहते हैं यह सिर्फ एक द्विआधारी खोज है, लेकिन एल्गोरिथ्म किस तरह

फिर Git द्विविभाजित प्रयोग किया जाता है निर्दिष्ट नहीं करता उठाता एक उन दो समाप्ति बिंदुओं के बीच प्रतिबद्ध

यह हो सकता है एक सीधा पिक-द-मिडिल-प्रतिबद्ध द्विआधारी खोज नहीं है, गिट किसी भी निर्णय एल्गोरिदम को नियोजित कर सकता है और यह स्पष्ट रूप से आप यह नहीं जानना चाहते हैं कि आप इस प्रतिबद्धता पर धारणा नहीं लेंगे अप।

यह उठाया प्रतिबद्ध यह आप दो संभावनाएं देता है बदल रहा है की बात आती है:

  1. आप मैन्युअल रूप से नई प्रतिबद्ध चुनें। उदाहरण के लिए git reset --hard के साथ।
  2. आप git bisect skip के साथ एक नया विकल्प बनाने के लिए गिट को बताते हैं।

उत्तरार्द्ध मामले में, जब आप good और bad साथ अंतिम बिंदुओं को अपडेट करते ही, निर्णय Git, जिस तरह से यह चाहता है द्वारा किया जाता है।


जिज्ञासा से मैं सरल एकल शाखा भंडार बना दिया है और git bisect skip आदेश की कोशिश की।
गिट के मेरे संस्करण ने पिछले प्रतिबद्धता को उठाया।

+7

यह निश्चित रूप से ऐसा कुछ नहीं है जिसे मुझे टूल का उपयोग करने के लिए जानने की ज़रूरत है, लेकिन मैं इस बात से असहमत हूं कि ओपन सोर्स प्रोजेक्ट कैसे काम करता है "मेरा कोई भी व्यवसाय" नहीं है; अगर ऐसा होता तो यह खुला स्रोत नहीं होगा। मैं उम्मीद में अपनी जिज्ञासा का पता लगाने की कोशिश कर रहा था कि किसी को स्रोत कोड में खुदाई करने के बजाय मुझे सिर्फ जवाब पता होगा। –

संबंधित मुद्दे