2012-12-01 27 views
34

जब Windows में Git शैल (जब GitHub for Windows का प्रयोग करके) के साथ एक diff पैच बनाने, चरित्र पैच की एन्कोडिंग हो जाएगा यूसीएस -2 लिटल एन्डियन नोटपैड के अनुसार ++ (नीचे स्क्रीनशॉट देखें)।विंडोज में गिट शैल: पैच का डिफ़ॉल्ट वर्ण एन्कोडिंग यूसीएस -2 लिटिल एंडियन है - इसे बिना बीओएम के एएनएसआई या यूटीएफ -8 में कैसे बदला जाए?

मैं इस व्यवहार को कैसे बदल सकता हूं, और बीओएम चरित्र एन्कोडिंग के बिना एएनएसआई या यूटीएफ -8 के साथ पैच बनाने के लिए गिट को मजबूर कर सकता हूं?

यह समस्या का कारण बनता है क्योंकि यूसीएस -2 लिटिल एंडियन एन्कोडेड पैच लागू नहीं किए जा सकते हैं, मुझे इसे मैन्युअल रूप से एएनएसआई में परिवर्तित करना होगा। यदि मैं नहीं करता, तो मुझे "घातक: अपरिचित इनपुट" त्रुटि मिलती है।

Creating git patch

Notepad++ screenshot of the character encoding


तब से, मैं यह भी महसूस किया कि मैं मैन्युअल नोटपैड में यूनिक्स (\n) करने के लिए Windows प्रारूप (\r\n) से EOL कन्वर्ट करने के लिए है कि ++ (संपादित करें> EOL रूपांतरण> यूनिक्स)। अगर मैं ऐसा नहीं करता, तो मुझे "पिछला सफेद स्थान" त्रुटि मिलती है (भले ही सभी सफेद जगहों को छंटनी की जा सके: "टेक्स्टएफएक्स"> "टेक्स्टएफएक्स संपादित करें"> "ट्रिम ट्रेलिंग स्पेस")।

तो, चरणों मैं लागू करने के लिए पैच के लिए क्या करने की जरूरत:

  1. पैच बनाने (here is the result)
  2. convert character encoding to ANSI
  3. EOL conversion to UNIX format
  4. लागू पैच

कृपया , इस स्क्रीनशॉट पर एक नज़र डालें:

Applying a patch in Windows Powershell with Git is problematic

+1

यह विहित रास्ता आवेदन के लिए पैच बनाने के लिए इस सवाल का सीधा जवाब तथापि, नहीं है, न केवल मानव उपभोग नहीं 'Git diff', लेकिन' Git प्रारूप-patch' है - यह नहीं है के रूप में डिफ़ॉल्ट रूप से stdout आउटपुट, मुझे लगता है कि आप उलझन चरित्र एन्कोडिंग के साथ कोई समस्या नहीं होगी। –

+0

@cebewee: धन्यवाद, और इस मामले में मैं इसका उपयोग कैसे करूँ? तो मुझे आउटपुट फ़ाइल के नाम को कैसे परिभाषित करना चाहिए? – Sk8erPeter

+0

'गिट प्रारूप-पैच' को एक सिंगल प्रतिबद्ध एक्स (अर्थात् हेड..एक्स) या एक प्रतिबद्धता सीमा मिलती है और इनमें से प्रत्येक के लिए एनएनएनएन-सबजेक्ट नामक फाइलें उत्पन्न होती हैं।पैच, जहां एनएनएनएन एक बढ़ती संख्या है और SUBJECt प्रतिबद्धता के विषय का एक उलझन वाला संस्करण है। –

उत्तर

16

मैं एक विंडोज उपयोगकर्ता नहीं हूं, इसलिए नमक के अनाज के साथ मेरा जवाब लें। Windows PowerShell Cookbook के अनुसार, पावरशेल git diff के आउटपुट को पूर्व-प्रोसेस करता है, इसे लाइनों में विभाजित करता है। Out-File सीएमडीलेट का दस्तावेज़ीकरण बताता है कि > पैरामीटर के बिना | Out-File जैसा ही है।

बाहर फ़ाइल cmdlet का उपयोग नहीं किया जा सकता यदि आप पारंपरिक उत्पादन पुनर्निर्देशन करने के लिए उपयोग किया जाता है कि आप क्या उम्मीद के परिणाम: हम भी PowerShell documentation में इस टिप्पणी को पाते हैं। अपने व्यवहार को समझने के लिए, आपको उस संदर्भ के बारे में अवगत होना चाहिए जिसमें आउट-फाइल cmdlet संचालित होता है।

डिफ़ॉल्ट रूप से, आउट-फ़ाइल cmdlet एक यूनिकोड फ़ाइल बनाता है।यह लंबे समय तक सबसे अच्छा डिफ़ॉल्ट है, लेकिन इसका मतलब यह है कि एएससीआईआई फाइलों की अपेक्षा करने वाले टूल्स डिफ़ॉल्ट आउटपुट प्रारूप के साथ सही तरीके से काम नहीं करेंगे। आप एन्कोडिंग पैरामीटर का उपयोग करके ASCII करने के लिए डिफ़ॉल्ट उत्पादन प्रारूप बदल सकते हैं:

[...]

बाहर फ़ाइल स्वरूपों सामग्री फ़ाइल कंसोल आउटपुट तरह देखने के लिए। इससे अधिकांश परिस्थितियों में कंसोल विंडो में आउटपुट को छोटा कर दिया जाता है। [...]

आउटपुट प्राप्त करने के लिए जो स्क्रीन चौड़ाई से मेल खाने के लिए लाइन रैप को मजबूर नहीं करता है, आप लाइन चौड़ाई निर्दिष्ट करने के लिए चौड़ाई पैरामीटर का उपयोग कर सकते हैं।

तो जाहिर है, यह गिट नहीं है जो चरित्र एन्कोडिंग चुनता है, लेकिन Out-File। यह पता चलता है क) PowerShell पुनर्निर्देशन वास्तव में केवल पाठ के लिए इस्तेमाल किया जाना चाहिए कि और ख) कि

| Out-File -encoding ASCII -Width 2147483647 my.patch 

एन्कोडिंग समस्याओं से बचने होगा। हालांकि, यह अभी भी विंडोज बनाम यूनिक्स लाइन-एंडिंग के साथ समस्या का समाधान नहीं करता है। लाइन-एंडिंग के रूपांतरण के लिए सीएमडीलेट्स (PowerShell Community Extensions देखें) हैं।

हालांकि, यह सब रिकोडिंग पैच में मेरा विश्वास नहीं बढ़ाती है (जिसमें कोई एन्कोडिंग नहीं है, लेकिन केवल बाइट्स की एक स्ट्रिंग है)। उपरोक्त Cookbook में एक स्क्रिप्ट Invoke-BinaryProcess शामिल है, जिसका उपयोग बिना किसी आदेश के आउटपुट के आउटपुट को रीडायरेक्ट किया जा सकता है।

इस पूरे मुद्दे को दूर करने के लिए, git diff के बजाय git format-patch का उपयोग करने का विकल्प होगा। format-patch सीधे एक फ़ाइल (और stdout नहीं) लिखता है, इसलिए इसका आउटपुट रिकोड नहीं किया जाता है। हालांकि, यह केवल मनमाने ढंग से भिन्नता से पैच बना सकता है। एक बढ़ती हुई

format-patch एक प्रतिबद्ध रेंज (जैसे master^10..master^5) लेता है या एक ही प्रतिबद्ध (जैसे एक्स, जिसका अर्थ है X..HEAD) और फार्म NNNN-SUBJECT.patch, जहां NNNN है की पैच फ़ाइलें बनाता है 4 अंकों की संख्या और विषय पैच के (उलझन) विषय है। एक आउटपुट निर्देशिका -o के साथ निर्दिष्ट की जा सकती है।

+0

मैंने पाया कि एक अधिकृत उत्तर [विंडोज पावरशेल कुकबुक] में दिया गया है (http://www.pavleck.net/powershell-cookbook/ch02 .html # पाइप बाइनरी डेटा)। –

+0

Invoke-BinaryProcess का उपयोग करने के लिए कॉल के साथ होना चाहिए: 'Invoke-BinaryProcess git -RedirectOutput diff | आउट-फाइल -कोडिंग OEM my.patch' –

+1

इस अच्छी तरह से विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। _ "हालांकि, यह केवल काम से पैच बना सकता है, मनमाने ढंग से भिन्न नहीं है।" _ हां, दुर्भाग्य से इसका मतलब है कि प्रतिबद्ध होने के सुझाव के रूप में ड्रूपल पैच बनाने की कोशिश करते समय यह समस्या है। जैसा कि आपने सुझाव दिया था, मैंने एएससीआईआईआई के रूप में एन्कोडिंग को परिभाषित करने के साथ आउट-फाइल पाइप की कोशिश की: http://i.imgur.com/2Nx9Z.png; यहां डिफ़ॉल्ट वर्ण एन्कोडिंग वाला एक है (आउटपुट रीडायरेक्शन के लिए '>' का उपयोग करके): http://i.imgur.com/QdyAN.png, और यहां आपके समाधान के साथ एक है: http://i.imgur.com/ 7Fpz0.png, और हाँ, एन्कोडिंग अब एएनएसआई है। :) – Sk8erPeter

1
  1. iconv diffs के उत्पादन
  2. सादे 7bit पैच (शुद्ध अंग्रेजी) आप अनदेखा कर सकते हैं पागल नोटपैड ++ खोज के लिए: पैच-सामग्री किसी भी चारसेट परिभाषा शामिल नहीं है
+0

आपके उत्तर के लिए धन्यवाद, लेकिन 1.) नोटपैड ++ में मैन्युअल रूप से वर्ण एन्कोडिंग को परिवर्तित करने से 'iconv'-ing अलग क्यों होगा? 2.) चरित्र एन्कोडिंग को अनदेखा करने से समस्या हल हो जाएगी कि * इन यूसीएस 2 लिटिल एंडियन-एन्कोडेड पैच लागू नहीं किए जा सकते हैं? * कृपया, इस स्क्रीनशॉट पर एक नज़र डालें: http://i.imgur.com/2698k.png। जैसा कि आप देख सकते हैं, मुझे त्रुटि संदेश _ "घातक: अपरिचित इनपुट" _ मिलता है। मैंने यह भी पहचाना कि मुझे विंडोज़ प्रकार से ईओएल को मैन्युअल रूप से नोटपैड ++ में यूनिक्स में परिवर्तित करना होगा। जैसे ही मैं पैच को एएनएसआई में परिवर्तित करता हूं और ईओएल को यूनिक्स में परिवर्तित करता हूं, समस्या दूर हो जाती है ... दिलचस्प। – Sk8erPeter

+0

कृपया मेरे संपादित प्रश्न पर एक नज़र डालें, मैंने कुछ और स्क्रीनशॉट लगाए हैं! धन्यवाद! – Sk8erPeter

+0

ठीक है, मुझे त्रिशूल मामले में नहीं पता है, आप स्थानीय गिट-फैनबॉय से पूछ सकते हैं। आप एक ही गिट-क्लाइंट के साथ एक ही ऑपरेशन का प्रयास करते हैं (वे * अलग * संचालित कर सकते हैं) –

3

यदि यह किसी को भी मदद करता है, तो PowerShell के बजाय अच्छे पुराने कमांड प्रॉम्प्ट का उपयोग करके बेकार ढंग से काम करता है; यह चरित्र एन्कोडिंग और ईओएल के संबंध में PowerShell में मौजूद किसी भी मुद्दे से पीड़ित प्रतीत नहीं होता है।

enter image description here

3

आप powershell का उपयोग करते हैं तो आप भी सिर्फ कर सकते हैं:

cmd /c "git diff > patch.diff" 

यह आदेश सीएमडी जो आउटपुट फ़ाइल के लिए लिखता है के रूप में के माध्यम से चलाने के लिए बनाता है।

1

शक्तियों पर उत्पन्न diff पर dos2unix करना मेरे लिए चाल करना प्रतीत होता है। मैं फिर apply सफलतापूर्वक diff करने में सक्षम था।

dos2unix.exe diff_file 
git apply diff_file