2013-02-05 46 views
7

एक प्रश्न के हिस्से के रूप में मैंने पहले finding the best match between two sources पर देखा, जहां एक सक्रिय गिट रेपो है और दूसरे के पास कोई गिट इतिहास नहीं है, मैंने a perl script to find the closest git commit लिखा था।बड़े स्रोत पेड़ों में "निकटता" मापना

मैं स्क्रिप्ट को फिर से लिखने की प्रक्रिया में हूं ताकि आपको अनुमान लगाने की आवश्यकता न हो कि किस शाखा का उपयोग करना है, लेकिन यह सभी शाखाओं में सबसे नज़दीकी मैच चलाएगा और फिर आपको सबसे अच्छा प्रतिबद्धता बताएगा सबसे अच्छी शाखा दुर्भाग्य से, मुझे लगता है कि मैं जिस माप का उपयोग कर रहा हूं वह "निकटता" का सबसे अच्छा न्यायाधीश नहीं हो सकता है।

वर्तमान में, मैं कोड पेड़ कितने करीब हैं यह निर्धारित करने के लिए diff -burN -x.git my_git_subtree my_src_subtree | wc -l का उपयोग करता हूं। ऐसा लगता है कि यह कम या ज्यादा काम करता है लेकिन मैं उन मामलों में चलाता हूं जहां पूरे फ़ोल्डर्स जोड़े जाते हैं या गायब होते हैं, जो संभवतः मौजूद है या किसी अन्य शाखा में मौजूद नहीं है।

क्या यह निर्धारित करने का एक बेहतर तरीका है कि स्रोत कितने करीब हैं? मैं ऐसी चीज की कल्पना कर रहा हूं जो निर्देशिका संरचनाओं की तुलना करता है, संभवतः साथ ही साथ कितनी लाइनें अलग-अलग हैं। यह diff पर अलग-अलग पैरा को पारित करने का मामला हो सकता है, या हो सकता है कि वहां ऐसा कोई अन्य टूल है जो ऐसा कुछ करता है।

+4

कार्यक्रमों के "निकटता" को मापने पर जीतने का कोई तरीका नहीं है। "अगर (~ x) विस्फोट" अगर एक (x) विस्फोट "(एक चरित्र) से थोड़ा अलग है, लेकिन इन दो कार्यक्रमों के परिणाम मूल रूप से अलग हैं। आपके द्वारा प्रस्तावित किसी भी उपायों पर हर कोई ऑब्जेक्ट करेगा; मेरा सुझाव है कि आप एक सेट उठाएं और फ्लेक के साथ रहें। जो नापसंद करते हैं, आप एक बेहतर उत्तर को लागू करने के लिए स्वागत कर सकते हैं। –

उत्तर

3

अपने माप में सुधार करने के लिए, 'git diff --shortstat' क्यों न करें? उत्पादन इस तरह दिखता है:

1 file changed, 1 insertion(+), 2 deletions(-) 

आप कैसे फ़ाइलों परिवर्तन/सम्मिलन/विलोपन प्राथमिकता देने के लिए, परिणाम के आधार पर के साथ चारों ओर खेल सकते हैं।

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

मैं यह भी सुझाव दूंगा कि निकटतम की तलाश करने के बजाय, आप (प्रतिबद्ध, "निकटता") जोड़ों की एक क्रमबद्ध सूची रखें और शायद शीर्ष कुछ प्रदर्शित करें और उन्हें हाथ से समीक्षा करें। जैसा कि नीचे बताया गया है, यह निर्धारित करने के लिए कोई चांदी की बुलेट नहीं है कि कोड के दो सेट बंद हैं या न केवल परिवर्तनों की संख्या को देखकर। जिसके अनुसार, परिवर्तन की संख्या निश्चित रूप से मदद कर सकते हैं डाउन सूची आप की समीक्षा करनी चाहिए संकीर्ण ...

अद्यतन: मैं भी कि Git diff का उपयोग करने का एक और लाभ यह है कि आप एक कठिन चलाने की जरूरत नहीं है कि है उल्लेख करना चाहिए प्रत्येक प्रतिबद्धता के लिए रीसेट करें। बस अपने अज्ञात पेड़ (एक डब्ल्यू/ओए गिट इतिहास) से .git/निर्देशिका को सिंक्रनाइंक करें, और गिट रीसेट [--mixed] का उपयोग करें और यह वर्तमान हेड पॉइंटर को अपडेट करेगा लेकिन आपके स्रोत को अपरिवर्तित छोड़ देगा (स्पष्ट रूप से अज्ञात बैकअप लेने की आवश्यकता है इस विधि का उपयोग करने से पहले स्रोत पेड़)।

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

  • कोई संबंधित समस्या नहीं^_^