2012-01-21 6 views
6

क्षमा करें यदि इस विषय से हटकर है, लेकिन यहाँ इस साइट पर "होमवर्क" सवाल की मात्रा को कम करने के लिए :-)क्या गिट पता लगा सकता है कि दो स्रोत फाइलें अनिवार्य रूप से एक दूसरे की प्रतियां हैं?

मैं जहां छात्रों को एक छोटी सी पर काम सी प्रोग्रामिंग की एक कक्षा को पढ़ा रहा हूँ का मौका है सी में संख्यात्मक दिनचर्या की पुस्तकालय इस वर्ष, छात्रों के कई समूहों की स्रोत फाइलों में कोड डुप्लिकेशंस की महत्वपूर्ण मात्रा थी।

(नीचे हूबहू printf डिबग बयान। मेरा मतलब है, कैसे गूंगा आप हो सकता है। गलत वर्तनी के लिए)

मैं जानता हूँ कि Git पता लगा सकते हैं कि जब दो स्रोत फ़ाइलें एक निश्चित सीमा से परे एक दूसरे के समान हैं, लेकिन मैं कभी नहीं प्रबंधक इसे दो स्रोत फ़ाइलों पर काम करने के लिए जो गिट भंडार में नहीं हैं।

ध्यान रखें कि ये विशेष रूप से परिष्कृत छात्र नहीं हैं। यह असंभव है कि वे परिवर्तनीय/फ़ंक्शन नाम बदलने की परेशानी पर जाएंगे।

क्या कोई तरीका है कि मैं महत्वपूर्ण और शाब्दिक कोड डुप्लिकेशन ए.के.ए. चोरी चोरी का पता लगाने के लिए गिट का उपयोग कर सकता हूं? या क्या कोई अन्य टूल है जिसे आप

+2

गिट शायद इसके लिए सही उपकरण नहीं है। कोड चोरी चोरी पहचान उपकरण उपलब्ध हैं, मुझे यकीन है कि एक खोज कुछ चालू हो जाएगी। –

+2

मेरे अनुभव में, सरल अंतर पर्याप्त हैं। विशेष रूप से, समान टिप्पणियां एक बड़ी छूट है। यह आश्चर्यजनक है कि वे धोखाधड़ी में कितने कम प्रयास करते हैं ... –

उत्तर

3

पर गिट का उपयोग क्यों कर सकते हैं? एक सरल लेकिन प्रभावी तकनीक सभी अलग-अलग सबमिशन के बीच अंतर के आकार की तुलना करना और फिर सबसे छोटे अंतर वाले लोगों की मैन्युअल रूप से निरीक्षण और तुलना करने के लिए होगी।

1

आप diff का उपयोग करें और जाँच दो फ़ाइलों समान प्रतीत कि क्या हो सकता है:

diff -iEZbwB -U 0 file1.cpp file2.cpp 

उन विकल्पों diff बता खाली स्थान के परिवर्तनों को अनदेखा और एक git तरह diff फ़ाइल बनाने के लिए। इसे दो नमूने पर आज़माएं।

+0

ध्यान दें कि '<'s and '> की संख्या में अंतर हमेशा समानता के बावजूद फ़ाइलों में लाइनों की संख्या में अंतर के बराबर है। :) –

+0

नहीं, हमेशा नहीं। व्हाइटस्पेस को '-w' से बाहर रखा गया है। – Blender

2

Moss एक उपकरण है जो स्टैनफोर्ड सीएस प्रोफेसर द्वारा विकसित किया गया था। मुझे लगता है कि वे वहां भी इसका इस्तेमाल करते हैं। यह स्रोत कोड के लिए diff की तरह है।

1

अन्य उत्तर को जोड़ना, आप diff इस्तेमाल कर सकते हैं - लेकिन मुझे नहीं लगता कि जवाब है कि खुद से उपयोगी होगा। क्या आप चाहते हैं लाइनों से मेल खाने वाले की संख्या, शून्य से गैर-रिक्त लाइनों की संख्या है, और कहा कि प्राप्त करने के लिए स्वचालित रूप से आप wc -l और grep साथ जादू का एक उचित बिट करने के लिए फ़ाइलों की लंबाई की राशि की गणना करने की जरूरत है, शून्य से diff फ़ाइल की लंबाई, diff मेल खाने वाली रिक्त रेखाओं की संख्या से कम है। और फिर भी आप कुछ मामलों को याद करेंगे जहां diff ने फैसला किया कि समान रेखाएं उनके सामने डाली गई विभिन्न चीजों के कारण मेल नहीं खाती हैं।

https://stackoverflow.com/questions/5294447/how-can-i-find-source-code-copying में सूचीबद्ध सुझावों में से एक बेहतर विकल्प है (या https://stackoverflow.com/questions/4131900/how-to-detect-plagiarized-code में, हालांकि उत्तर डुप्लिकेट प्रतीत होते हैं)।

0

diff का उपयोग कर रहा है बिल्कुल नहीं एक अच्छा विचार है जब तक आप combinatory नरक के दायरे में उद्यम हैं:

  • आप 2 प्रस्तुतियाँ है, तो आप साहित्यिक चोरी के लिए जाँच करने के लिए 1 diff प्रदर्शन करने के लिए है,
  • आप 3 प्रस्तुतियाँ है, तो आप साहित्यिक चोरी के लिए जाँच करने के लिए 2 diff प्रदर्शन करने के लिए है,
  • आप 4 प्रस्तुतियाँ है, तो आप साहित्यिक चोरी के लिए जाँच करने के लिए 6 diff प्रदर्शन करने के लिए है,
  • ...
  • यदि आपके पास एन सबमिशन हैं, तो आपको (n-1)! diff करना होगा!

दूसरी ओर, Moss पर, पहले से ही एक अन्य जवाब में सुझाव दिया, एक completely different algorithm उपयोग करता है। असल में, यह प्रत्येक दस्तावेज़ के महत्वपूर्ण के-ग्राम के लिए फिंगरप्रिंट का एक सेट की गणना करता है। फिंगरप्रिंट वास्तव में दस्तावेजों को वर्गीकृत करने के लिए उपयोग किया जाता है, और एक संभावित चोरी चोरी का पता लगाया जाता है जब दो दस्तावेज़ एक ही बाल्टी में क्रमबद्ध होते हैं।