"हंक # 1 को 1 (अलग लाइन अंत) में विफल" संदेश कैसे ठीक करें?


22

मैं कमांड के साथ एक पैच बनाने की कोशिश कर रहा हूं

git diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch

जब मैं पैच लगाता हूं, तो यह मुझे देता है

$ patch -v
GNU patch 2.7.5

$ /usr/bin/patch -p1 </var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
patching file sourcefile
Hunk #1 FAILED at 1 (different line endings).
Hunk #2 FAILED at 23 (different line endings).
Hunk #3 FAILED at 47 (different line endings).
Hunk #4 FAILED at 65 (different line endings).
Hunk #5 FAILED at 361 (different line endings).
5 out of 5 hunks FAILED -- saving rejects to file sourcefile.rej

मैंने dos2unix को src फ़ाइल और पैच फ़ाइल दोनों में लागू करने की कोशिश की, लेकिन संदेश नहीं गया ...

UPD: --ignore-whitespace भी मदद नहीं करता है

PATCH COMMAND:  patch -p1 -g0 -E --no-backup-if-mismatch --ignore-whitespace --dry-run -f < '/var/lib/layman/dotnet/dev-dotnet/slntools/files/remove-wix-project-from-sln-file-v2.patch'

=====================================================
checking file Main/SLNTools.sln
Hunk #1 FAILED at 14 (different line endings).
Hunk #2 FAILED at 49 (different line endings).
Hunk #3 FAILED at 69 (different line endings).
Hunk #4 FAILED at 102 (different line endings).
4 out of 4 hunks FAILED

UPD: एक बहुत अच्छा लेख मिला: /programming//a/4425433/1709408


कोशिश करो sed -i.bak -e 's/\r$//g' something। मुझे नहीं लगता कि dos2unix आक्रामक रूप से मिश्रित अंत-रेखाओं को संभालता है जैसा आप चाहते हैं।
आर्थर

बाहरी बुराई; यदि आपके पास सीएफ-एलएफ लाइन के साथ अपना पैच है, तो फाइलों के समान, यह पहले आपके पैच से सीआर को खुशी से छीन लेगा, फिर एक फिट उस लाइन के अंत को फेंक दें (जो कि बस टूट गया) मेल नहीं खाता।
एसएफ।

जवाबों:


5

मुझे patchविंडोज पर MSYS2 के साथ आने वाली कमांड का उपयोग करने में एक ही समस्या थी । मेरे मामले में स्रोत फ़ाइल और पैच दोनों में CRLF लाइन-एंडिंग थी, और दोनों को LF में परिवर्तित करना या तो काम नहीं करता था। क्या काम किया गया था:

$ dos2unix patch-file.patch
$ patch -p1 < patch-file.patch
$ unix2dos modified-files...

patch सभी पैच की गई फ़ाइलों पर लाइन-एंडिंग को LF में बदल देगा, इसलिए उन्हें CRLF में वापस परिवर्तित करना आवश्यक है।

अवलोकन: patchमेरे द्वारा उपयोग किया जा रहा संस्करण 2.7.5 है


5

आप आमतौर पर -lविकल्प का उपयोग करके इसके आसपास काम कर सकते हैं :

-l या --ignore- व्हाट्सएप विकल्प का उपयोग करें, जो पैच की तुलना रिक्त वर्णों (यानी रिक्त स्थान और टैब) से करता है, ताकि पैच फाइल में कोई भी गैर-रिक्त अनुक्रम इनपुट फ़ाइलों में रिक्त के किसी भी गैर-रिक्त अनुक्रम से मेल खाता हो।

यह एक मानक विशेषता है ( POSIX पैच विवरण देखें )।

हालांकि, ओपी ने इस सवाल पर टिप्पणी करने के लिए संशोधन किया कि कैसे अलग-अलग ऑपरेटिंग सिस्टम के बीच git core.autocrlf के साथ काम करने वाली रूपांतरण रेखा समाप्त होती है , और एक उदाहरण जोड़ते हुए कहा कि समस्या विंडोज पर फ़ाइलों के साथ देखी गई है (यूनिक्स-शैली उदाहरण के विपरीत)। हालांकि patchCRLF और LF लाइन-एंडिंग के बीच बेमेल को समायोजित करने की कोशिश करता है, लेकिन बाद वाले का उपयोग करने के लिए पूर्वाग्रह है। यदि पैच फ़ाइल में CRLF की समाप्ति थी, जबकि पैच की जाने वाली फ़ाइलें नहीं थीं, तो यह इस उदाहरण लॉग में पुनर्प्राप्त हो जाएगी:

(Stripping trailing CRs from patch.)
patching file xterm.log.html
(Stripping trailing CRs from patch.)
patching file xterm.man
(Stripping trailing CRs from patch.)
patching file xtermcfg.hin

स्रोत कोड की जाँच करते हुए, similarफ़ंक्शन में, जीएनयू patchव्हाट्सएप के रूप में व्यवहार करता है spaceऔर Tabकुछ विशेष हैंडलिंग के साथ कि क्या लाइनों का अनुगामी एलएफ है। सीआर का उल्लेख नहीं है। यह ध्यान देता है check_line_endings, लेकिन एक अस्वीकृति का निदान करने में मदद करने के लिए एक संदेश के हिस्से के रूप में उस जानकारी का उपयोग करता है। यह pget_line में अनुगामी CRs को स्ट्रिप्स करता है जब तक कि --binaryविकल्प नहीं दिया जाता है।

GNU पैच के पास यह बताने का विकल्प नहीं है कि LF एंडिंग के साथ पैच को CRLF में बदलकर उन फाइलों पर लागू किया जाए जिनकी लाइन-एंडिंग CRLF हैं। इस मामले के लिए मज़बूती से उपयोग करने के लिए, विकल्प हैं

  • LF एंडिंग्स का उपयोग करने के लिए सभी फ़ाइलों को परिवर्तित करें, या
  • CRLF समाप्ति का उपयोग करने और --binaryविकल्प जोड़ने के लिए सभी फ़ाइलों को परिवर्तित करें ।


0

मुझे Cygwin पर इसी तरह की समस्या थी। मेरे मामले -iमें स्टड से पढ़ने के बजाय झंडे का उपयोग करने के लिए फिक्स था ।

निम्नलिखित अलग-अलग पंक्ति समाप्ति त्रुटि के साथ विफल हुआ :

patch -t -N -r - -p0 < patchfile

लेकिन निम्नलिखित सफल रहा:

patch -t -N -r - -p0 -i patchfile

मैं कारण के बारे में अनिश्चित हूं, लेकिन किसी के पास एक ही मुद्दा होने पर इसे यहां छोड़ देना चाहिए।

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