क्यों अलग / पैच का उपयोग करें जब यह सिर्फ सीपी का उपयोग करने के लिए आसान है


19
diff -u file1.txt file2.txt > patchfile

एक पैच फ़ाइल बनाता है, जिसमें patchfile1.txt को बदलने के लिए निर्देश होते हैं, बिल्कुल file2.txt की तरह

cpइसके बजाय कमांड का उपयोग करके ऐसा नहीं किया जा सकता है ? मैं कल्पना कर सकता हूं कि यह तब उपयोगी है जब फ़ाइल बहुत बड़ी हो और उसे एक नेटवर्क पर स्थानांतरित किया जाए जहां यह दृष्टिकोण बैंडविड्थ को बचा सकता है। क्या अलग / पैच का उपयोग करने का कोई अन्य तरीका है जो अन्य परिदृश्यों में फायदेमंद होगा?

जवाबों:


31

केवल एक फ़ाइल बनाम दूसरे की तुलना में मुश्किलें अधिक जटिल हो सकती हैं। पूरी निर्देशिका पदानुक्रम की तुलना कर सकते हैं। उदाहरण पर विचार करें कि मैं जीसीसी में बग को ठीक करना चाहता हूं। मेरा परिवर्तन 4 या 5 फ़ाइलों में एक पंक्ति या दो जोड़ता है और उन और अन्य फ़ाइलों में मुट्ठी भर लाइनें हटाता है। अगर मैं इन परिवर्तनों को किसी को बताना चाहता हूं, तो संभवतः जीसीसी में शामिल करने के लिए मेरे विकल्प हैं

  • संपूर्ण स्रोत वृक्ष की नकल करें
  • केवल उन फ़ाइलों की प्रतिलिपि बनाएँ जिन्हें बदला गया था
  • मेरे द्वारा किए गए परिवर्तनों की आपूर्ति करें

पूरे स्रोत के पेड़ की नकल करने का कोई मतलब नहीं है, लेकिन अन्य दो विकल्पों के बारे में क्या है, जो आपके प्रश्न के मूल में है। अब विचार करें कि किसी और ने भी उसी फ़ाइल पर काम किया है जैसा मैंने किया था और हम दोनों किसी को अपने परिवर्तन देते हैं। इस व्यक्ति को कैसे पता चलेगा कि हमने क्या किया है और यदि परिवर्तन संगत हैं (फ़ाइल के अलग-अलग हिस्से) या संघर्ष (फ़ाइल की समान लाइनें)? वह उन्हें अलग कर देगा! यह अंतर उसे बता सकता है कि फाइलें एक दूसरे से और अनमॉडिफाइड सोर्स फाइल से कैसे भिन्न हैं। यदि अंतर है कि क्या जरूरत है, यह सिर्फ पहली जगह में अंतर भेजने के लिए और अधिक समझ में आता है। एक अंतर में एक से अधिक फ़ाइल से परिवर्तन भी हो सकते हैं, इसलिए जब मैंने कुल 9 फ़ाइलों को संपादित किया, तो मैं उन परिवर्तनों का वर्णन करने के लिए एक एकल फ़ाइल प्रदान कर सकता हूं।

इतिहास प्रदान करने के लिए भी मुश्किलों का इस्तेमाल किया जा सकता है। क्या होगा अगर तीन महीने पहले एक बग के कारण मैंने केवल आज ही खोजा था। अगर बग को पेश किया गया था तो मैं इसे कम कर सकता हूं और इसे एक विशिष्ट बदलाव के लिए अलग कर सकता हूं, मैं "पूर्ववत" करने के लिए अंतर का उपयोग कर सकता हूं या परिवर्तन को वापस कर सकता हूं। यह कुछ ऐसा नहीं है जिसे मैं आसानी से कर सकता हूं अगर मैं केवल फाइलों की नकल कर रहा हूं।

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

संक्षेप में, हाँ, cpकी तुलना में आसान है diffऔर patchहै, लेकिन की उपयोगिता diffऔर patchसे बड़ा है cpस्थितियों में, जहां कैसे फ़ाइलों परिवर्तन ट्रैक करने के लिए महत्वपूर्ण है के लिए।


वास्तव में, गिट वास्तव में फ़ाइल इतिहास को संग्रहीत नहीं करता है क्योंकि बाद के कमिट्स के भिन्न होते हैं। प्रत्येक कमिट के लिए स्टोर है, प्रत्येक फ़ाइल की सामग्री ("git show -s --pretty = raw" और "git ls-tree HEAD" देखें)। फिर, इस परत के ऊपर, क्योंकि कई फाइलें अलग-अलग कमिट में समान होंगी, यह डेटा बीवी फ़ाइलों को साझा करने के लिए डेल्टा संपीड़न का उपयोग करती है (लेकिन यह इतिहास से बंधा नहीं है)।
ysdx

हालांकि इस इतिहास के लिए एक सुविधाजनक दृश्य उपकरण हैं।
ysdx

20

जब आपको एक पैच मिलता है, तो आप अक्सर (जब तक कि आपने उसी समान लाइनों में परिवर्तन नहीं किया है) पैच को फ़ाइलों के एक सेट पर लागू करते हैं जिसे आपने खुद भी बदल दिया है।

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

इससे पहले कि (संदर्भ / एकीकृत) भिन्न होता है यह अक्सर संपादकों के लिए निर्देशों के साथ किया गया था (एक्स के बाद एक पंक्ति डालें, लाइन वाई हटाएं), लेकिन यह केवल तभी काम करेगा जब आपको पता हो कि ये निर्देश किस राज्य से शुरू हुए थे। इस प्रकार आपके "समाधान" के रूप में एक ही समस्या है सिर्फ नकल के साथ।


2
एक पैच फाइलें आपको इसे पूर्ववत करने और एक बार में कई फाइलों पर लागू करने की सुविधा देती हैं
Gilsham

वास्तव में, एकीकृत diff -uअंतर ( diff -c) मनुष्यों के लिए बनाया गया एक सुधार है, वे नियमित संदर्भ अंतर ( ) से अधिक संघर्षों के खिलाफ मजबूती में मदद नहीं करते हैं , मुझे लगता है। यहां तक ​​कि सादा अंतर ( diff) अभी भी अक्सर "राज्य इन निर्देशों से शुरू हुआ" को जानने के बिना काम करता है। फिर भी, यह स्वीकार किए गए उत्तर से बेहतर है क्योंकि एक ही समय में कई स्रोत फ़ाइलों को पैच करने के बारे में बात करना वास्तव में एक लाल हेरिंग है।
सेलाडा

@ आप इस बारे में सही हैं कि संदर्भ भिन्न है, इसके बीच और सामान्य अंतर वह है जहां मुख्य अंतर निहित है। संदर्भ के बिना पैच बहुत मुश्किल से रिवर्स में लागू होते हैं, अगर बिल्कुल भी।
एंथन

12

यदि आप अंतर का उपयोग कर रहे हैं, तो आप देख सकते हैं कि वास्तव में क्या बदल गया है, इसलिए फ़ाइल में अवांछित परिवर्तनों को फिसलने से रोकने के लिए diff / पैच का उपयोग करना एक तरीका है।


11

फ़ाइलों में किए गए परिवर्तन आमतौर पर परिवर्तित की जा रही फ़ाइलों की तुलना में बहुत छोटे होते हैं।

इसका मतलब है कि एक स्टोर को स्टोर करने से आप बहुत सारे स्थान बचा सकते हैं। जब diffबनाया गया था, तो डिस्क स्थान महंगा था।

लेकिन इसका मतलब यह भी है कि आप किसी फाइल में तब भी अंतर कर सकते हैं, जब वह फाइल दूसरे तरीकों से बदल गई हो। पैच उपयोगिता आपके लिए क्या है कि और आपको बता जब वहाँ समस्याएं हैं जाएगा।

यह वास्तव में सॉफ्टवेयर विकास में भिन्नता के साथ काम करने का सबसे महत्वपूर्ण कारण है। जब एक बदलाव किया गया है (आमतौर पर एक से अधिक फ़ाइल में), तो इसे एक अंतर के रूप में सहेजा जा सकता है: परिणाम को परिवर्तन सेट या पैच कहा जाता है । यदि सब कुछ ठीक है, तो पैच केवल कुछ मनमाना परिवर्तन नहीं है, लेकिन यह कुछ प्रकार के कार्यात्मक परिवर्तन को लागू करता है - जैसे बग फिक्स या एक नई सुविधा।

इस बीच, एक अलग डेवलपर द्वारा, संभवतः एक अलग स्थान में भी एक अलग परिवर्तन किया जा सकता है। यदि परिवर्तन समान फ़ाइलों के समान भागों में नहीं किए गए थे, तो उन्हें फिर से स्वतंत्र रूप से लागू किया जा सकता है। इसलिए डेवलपर्स एक दूसरे को परीक्षण के लिए अपने पैच भेज सकते हैं। पैच का एक पूरा सेट निर्माण कर सकता है जो संभावित परिवर्तनों का प्रतिनिधित्व करता है; इनमें से कुछ को अंततः अस्वीकार कर दिया जा सकता है, बाकी को सिस्टम में एकीकृत किया जाएगा।

तो diffs के साथ काम करने से समवर्ती विकास की अनुमति मिलती है। अब आपको एक बार में एक बदलाव पर काम नहीं करना है।

आधुनिक वितरित संस्करण नियंत्रण प्रणाली काम करने के इस तरीके की निरंतरता है।


1

संक्षेप में यह कर सकते हैं। यदि आप YouTube पर कुछ थिंक बिग लॅरी वॉल वीडियो देखते हैं, तो वह इस बारे में बात करता है कि अंतर / पैच कैसे शुरू हुआ और उन्होंने क्या समस्याएं हल कीं, और संक्षेप में, यह पैच को लचीला और मानव-पठनीय रखते हुए इंटरनेट पर संचार के लिए आकार को कम करने के बारे में था। ।

यदि आप एक स्थानीय प्रणाली पर हैं और इनमें से किसी भी चीज़ की परवाह नहीं करते हैं, तो ठीक है cpया rsyncठीक है।


धन्यवाद PSKocik। क्या आप कृपया उस वीडियो का लिंक साझा कर सकते हैं?
टोडरमेनोट सेप

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

@reinierpost मेरी विकास प्रक्रिया को ट्रैक करने के लिए git का उपयोग करता है। मैं सीधे पैच-अलग नहीं करता।
PSkocik
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.