Git डेल्टा एन्कोडिंग आधारित कॉपी/डालने है।
इसका मतलब है कि व्युत्पन्न फ़ाइल opcodes जो प्रति निर्देश प्रतिनिधित्व कर सकते हैं की एक अनुक्रम के रूप में एन्कोड किया गया है: या प्रविष्टि निर्देशों (जैसे आधार फ़ाइल y बाइट्स से प्रतिलिपि ऑफसेट एक्स लक्ष्य बफर में से शुरू) (जैसे: डालने लक्ष्य बफर में अगला एक्स बाइट्स)।
एक बहुत ही सरल उदाहरण (कागज 'डेल्टा संपीड़न के लिए फाइल सिस्टम का समर्थन' से लिया गया), पर विचार हम में पाठ "प्रॉक्सी कैश" को बदलने के लिए एक डेल्टा बफर बनाना चाहते हैं कि "कैश प्रॉक्सी के रूप में "। जिसके परिणामस्वरूप निर्देश होना चाहिए:
- कॉपी (आधार बफर से प्रतिलिपि 'कैश') ऑफसेट 7 से 5 बाइट्स
- सम्मिलित दो आधार से रिक्त स्थान
- कॉपी 5 बाइट्स ऑफसेट 0 (कॉपी 'प्रॉक्सी' से बफर)
कौन सा के लिए git एन्कोडिंग अनुवाद हो जाता है:
(बाइट्स 1-3 पहले अनुदेश का प्रतिनिधित्व करते हैं)
- 0x91 (10,010,001) है, जो
- 0x80 (10000000) में विभाजित है
- 0x01 (00000001) (का अर्थ है 'अग्रिम (सबसे महत्वपूर्ण बिट सेट यह निर्देश एक' आधार से उत्पादन के लिए प्रति 'बनाता है) एक बाइट और आधार ऑफसेट)
- 0x10 (00,010,000) (अग्रिम एक बाइट के रूप में उपयोग और लंबाई के रूप में उपयोग)
- 0x07 (ऑफसेट)
- 0x05 (लम्बाई)
(बाइट्स 4-6 दूसरा अनुदेश का प्रतिनिधित्व करते हैं)
- 0x02
- 0x20 (अंतरिक्ष) (के बाद से MSB सेट नहीं है, इस 'उत्पादन में अगले दो बाइट्स डालने' का अर्थ है)
- 0x20 (अंतरिक्ष)
(बाइट्स 7-8 पिछले अनुदेश का प्रतिनिधित्व करते हैं)
- 0x90 (10,010,000) है, जो
- 0x80 (10000000) (का अर्थ है 'प्रतिलिपि')
- 0x10 (00,010,000) में विभाजित (अग्रिम एक बाइट और लंबाई के रूप में उपयोग)
- 0x05 (है लंबाई)
सूचना है कि पिछले प्रतिलिपि शिक्षा में निर्दिष्ट नहीं है एक ऑफसेट जो ऑफसेट 0. अन्य बिट्स प्रति opcode में भी जब बड़ा ऑफसेट/लंबाई की जरूरत है स्थापित किया जा सकता मतलब है।में इस उदाहरण 8 बाइट्स है, जो एक संपीड़न के ज्यादा के बाद से लक्ष्य बफर 12 बाइट्स है नहीं दे रहा है
परिणाम डेल्टा बफर है, लेकिन यह एक बहुत बड़ा फर्क कर सकते हैं जब इस एन्कोडिंग बड़े पाठ के लिए लागू फ़ाइलें।
मैंने हाल ही में node.js library को जिथब पर धक्का दिया है जो गिट डेल्टा एन्कोडिंग का उपयोग करके दोनों diff/पैच फ़ंक्शन लागू करता है। code अधिक पठनीय होना चाहिए और गिट स्रोत में से एक की टिप्पणी की है, जिसे अत्यधिक अनुकूलित किया गया है।
मैंने कुछ tests भी लिखा है जो को प्रत्येक उदाहरण में उपरोक्त प्रारूप के साथ आउटपुट आउटपुट का उपयोग करते हैं।
स्रोत
2013-01-13 13:30:54
अंतिम algo जब मैं 2011 धागा जैसे http पढ़ा है, एक कस्टम एक हो सकता है: //git.661346.n2.nabble.com/diff-ing-files-td6446460.html – VonC
2008 में, libXDiff का स्पष्ट रूप से उपयोग किया गया था: http://git.661346.n2.nabble.com/libxdiff-and-patience- diff-td1452272.html – VonC
वह 2011 धागा एक अच्छा लिंक है। चॉइस उद्धरण: "तो, सख्ती से बोलते हुए, गिट में वर्तमान कोड libxdiff कोड के साथ कोई समानता नहीं लेता है। हालांकि दोनों कार्यान्वयन के पीछे मूल एल्गोरिदम समान है।" – Thilo