git: पैच लागू नहीं होता है


289

मेरे पास एक निश्चित पैच है जिसे my_pcc_branch.patch कहा जाता है।

जब मैं इसे लागू करने की कोशिश करता हूं, तो मुझे निम्नलिखित संदेश मिलता है:

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply

इसका क्या मतलब है?

मैं इस समस्या को कैसे ठीक करुं?


क्या कोई AbstractedPanel.java.rej फाइलें आसपास पड़ी हैं? विशिष्ट इसका मतलब है कि स्रोत में और साथ ही पैच में एक रेखा बॉट बदल गई (यहां लाइन 13 प्रभावित होती है)।
रूडी

नहीं, मुझे कोई भी * .rej फाइलें नहीं मिलीं।
दिमित्री पिसारेंको

निश्चित नहीं है कि स्वीकार किए गए उत्तर इसे ठीक क्यों करेंगे (इसलिए मुझे संदेह है कि यह एक लाल हेरिंग है), लेकिन इसका has type 100644, expected 100755मतलब यह नहीं है कि कहीं चामोद की अनुमति नहीं है?
रफिन

जवाबों:


325

git apply --reject --whitespace=fix mychanges.patch मेरे लिए काम किया।

व्याख्या

--rejectविकल्प Git निर्देश देगा असफल नहीं करने के लिए अगर यह तय कर सकते हैं कि कैसे एक पैच लागू करने के लिए, लेकिन इसके बजाय indivdual जिसे यह लागू करते हैं और फ़ाइलें (अस्वीकार बना सकते हैं लागू करने के लिए .rej) जिसे यह लागू नहीं कर सकते के लिए। विगेल "इन []] अस्वीकृत पैचों को लागू कर सकता है और शब्द-वार भिन्नता कर सकता है"।

इसके अतिरिक्त, --whitespace=fixव्हाट्सएप त्रुटियों के बारे में चेतावनी देगा और अन्यथा लागू हंक लगाने से इनकार करने के बजाय उन्हें ठीक करने का प्रयास करेगा।

दोनों विकल्प एक साथ पैच के आवेदन को विफलता के खिलाफ अधिक मजबूत बनाते हैं, लेकिन उन्हें परिणाम के संबंध में अतिरिक्त ध्यान देने की आवश्यकता होती है।

पूरे दस्तावेज के लिए, https://git-scm.com/docs/git-apply देखें


8
यह वास्तव में मेरे लिए बेहतर काम हुआ क्योंकि इसने मेरी फाइल को पूरी तरह से संशोधित नहीं किया
वेन वर्नर

10
यह भी खूब रही। बस इसे अस्वीकार कर देता है जो इसे स्वयं हल नहीं कर सकता है और आप केवल अस्वीकृत फ़ाइलों को मैन्युअल रूप से संशोधित कर सकते हैं।
डेनिस

1
पैच -p1 <mychanges.patch # चंक द्वारा परिवर्तन लागू करता है। यदि परिवर्तन विफल होते हैं तो <sourcefile> .orig और <sourcefile> .rej पैच बनाए जाते हैं और आप मैन्युअल रूप से परिवर्तन लागू कर सकते हैं। मैं अनुमान लगा रहा हूँ git लागू --reject एक ही है और --whitespace = fix जादुई रूप से बेहतर है।
गॉथे

7
यह आदेश .rejफ़ाइलों को बनाता है जब स्वचालित रूप से पता नहीं लगा सकते कि पैच कैसे लगाया जाए। आप ऐसे मुद्दों को हल करने के लिए विगले का उपयोग कर सकते हैं।
11:20 पर goodniceweb

14
यह उत्तर कुछ भी स्पष्ट नहीं करता है, विशेष रूप से किन मामलों में यह काम करेगा। लोग, आपको वास्तव में उत्तर गुणवत्ता की अधिक मांग करनी होगी, यह एसओ एक मंच नहीं है।
ओलिवर

319

जोहान्स ने msysgit@googlegroups.com मेलिंग सूची से छठी कमांड लाइन तर्कों का उपयोग करके सुझाव दिया:

git apply --ignore-space-change --ignore-whitespace mychanges.patch

इससे मेरी समस्या हल हो गई।


25
क्या कोई मेरी मदद कर सकता है और समझा सकता है कि यह क्यों काम करता है? दूसरे उत्तर ने मेरे लिए काम नहीं किया, और मुझे वही समस्या थी जो प्रश्न पूछने वाले का वर्णन है। व्हॉट्सएप को नजरअंदाज करने के लिए फाइल विशेषताओं का क्या करना है?
स्क्रेबेल

1
विंडोज़ के पॉवरशेल का उपयोग करते हुए git diff के साथ बनाया गया एक पैच सफलतापूर्वक निम्नानुसार लागू किया गया था: git diff HEAD..613fee - myfile.xml | git apply-ignore-space-change -ignore-whitespace, जबकि पहली आउटपुट
डिफेंस

2
-C1लागू करने के लिए भी स्विच का प्रयास करें, यह उन परिवर्धन के आसपास के संदर्भ को कम करता है जिन्हें महत्वपूर्ण माना जाता है।
अमीर अली अकबरी

2
@ EricWalker, CR / LF के साथ git मैजिक जरूरी बुरी चीज नहीं है। विकल्प यह हो सकता है कि आपके सभी परिवर्तनों में से आधे में हर एक फ़ाइल में हर एक पंक्ति शामिल हो, जिसे एक पंक्ति से दूसरी पंक्ति में परिवर्तित किया जा रहा था, जिसमें वास्तविक परिवर्तन बीच में कहीं दबे हुए थे।
jwg

3
यह कभी-कभी मदद करता है। लेकिन दूसरी बार, मुझे अभी भी "पैच लागू नहीं होता है", भले ही पैच बिना मुद्दों के लागू होना चाहिए।
थॉमस लेवेस्क

118

सब कुछ विफल हो, कोशिश git applyकी --3wayविकल्प

git apply --3way patchFile.patch

-3way
जब पैच साफ-सुथरा लागू नहीं होता है, तो 3-वे मर्ज पर वापस गिरें यदि पैच उन ब्लब्स की पहचान को रिकॉर्ड करता है जो इसे लागू करना है, और हमारे पास स्थानीय रूप से उपलब्ध ब्लब उपलब्ध हैं, संभवतः फाइलों में संघर्ष मार्करों को छोड़ दें उपयोगकर्ता को हल करने के लिए काम कर रहे पेड़। यह विकल्प --index विकल्प से तात्पर्य है, और --reject और --cached विकल्पों के साथ असंगत है।

आमतौर पर विफल मामला पैच के जितना हो सकता है, उतना ही लागू होता है, और आपको संघर्ष के साथ बाहर निकलने के लिए छोड़ देता है, हालांकि आप सामान्य रूप से ऐसा करते हैं। संभवतः rejectविकल्प की तुलना में एक कदम आसान है ।


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

3
अच्छा सामान्य समाधान। 3 वे अंतर ऐसा नहीं लगता था कि यह सामान्य रूप से इतना थोड़ा भ्रमित होता है, लेकिन कभी भी इसने मुझे संघर्ष को सुलझाने और लागू करने के लिए पैच प्राप्त करने की क्षमता नहीं दी।
स्टीवनबोट

8
मुझे लगता है कि यह --3wayडिफ़ॉल्ट व्यवहार होना चाहिए। जब पैचिंग विफल हो जाती है, तो कम से कम मुझे बताएं कि क्या विफल हुआ ताकि मैं इसे मैन्युअल रूप से ठीक कर सकूं। git applyबस विफल रहता है और रिपोर्ट नहीं करता है कि कुछ विफल क्यों है। मुझे *.rejफाइलें भी नहीं मिल रही हैं जैसे कि hgजनरेट करता है।
पवन मंजूनाथ

4
निश्चित रूप से, सबसे अच्छा समाधान। उपयोगकर्ता को अपने स्वयं के संघर्ष को हल करने दें!
मोश फ़ू

56

यह आदेश पैच को लागू करेगा जो इसे खराब फ़ाइलों को छोड़ने के रूप में हल नहीं करेगा *.rej:

git apply --reject --whitespace=fix mypath.patch

आपको बस उन्हें हल करना है। एक बार हल चलाने के बाद:

git -am resolved

7
कैसे हल करें *.rej- सभी मैं पा सकता हूं कि स्रोत फ़ाइल में मैन्युअल रूप से परिवर्तन करना है और इन .rejफ़ाइलों को हटाना है। कोई अन्य तरीका ?
कोडिंग_डॉट

1
@coding_idiot हमेशा की तरह, .rej फ़ाइलों की जांच करें, उनकी तुलना परस्पर विरोधी फ़ाइलों से करें और अंत में निश्चित फ़ाइलों को अनुक्रमणिका में जोड़ें ("git add FIXED_FILES") के साथ
इवान

2
@ कोडिंग_डॉट आप इसे हल करने के लिए विगले का उपयोग कर सकते हैं । उदाहरण के लिए wiggle --replace path/to/file path/to/file.rej:। यह कमांड .rejफ़ाइल से मूल फ़ाइल में परिवर्तन लागू करेगी । इसके अलावा, यह मूल फ़ाइल की एक प्रति बनाता है, जैसे path/to/file.porig। कृपया,
goodniceweb

22

यहां दिए गए समाधान का उपयोग करने का प्रयास करें: https://www.drupal.org/node/1129120

patch -p1 < example.patch

इससे मुझे मदद मिली।


3
मुझे पता है कि आप ऐसा करने वाले नहीं हैं, लेकिन आपको बहुत धन्यवाद! मुझे घंटों बचाया। मुझे "पैच लागू नहीं होता" और सभी प्रकार की त्रुटियां हो रही थीं।
सुडो rm -rf स्लैश

@ sudorm-rfslash, हम ऐसा क्यों नहीं कर रहे हैं और आप इसे फिर भी क्यों कर रहे हैं?
काला

git: 'patch' is not a git command.ongit version 2.21.1 (Apple Git-122.3)
श्रीधर सरनोबत

16

यह तब होता है जब आप UNIX और Windows git क्लाइंट्स को मिलाते हैं क्योंकि विंडोज में वास्तव में "x" बिट का कॉन्सेप्ट नहीं होता है, इसलिए विंडोज के rw-r--r--तहत आपकी (0644) फाइल का चेकआउट msys POSIX लेयर द्वारा rwx-r-xr-x(0755) होने के लिए "प्रमोट" किया जाता है। । git उस मोड अंतर को मूल रूप से फ़ाइल में एक शाब्दिक अंतर के समान मानता है, इसलिए आपका पैच सीधे लागू नहीं होता है। मुझे लगता है कि आपका एकमात्र अच्छा विकल्प यहां (उपयोग करना ) सेट core.filemodeकरना है ।falsegit-config

यहाँ कुछ संबंधित जानकारी के साथ एक msysgit मुद्दा है: http://code.google.com/p/msysgit/issues/detail?id=164 ( आर्काइव. org के 3 दिसंबर 2013 की प्रतिलिपि के लिए पुन : प्रेषित )


2
मैंने कमांड "git config core.filemode false" चलाने की कोशिश की, लेकिन इससे मदद नहीं मिली - मुझे अब भी वही संदेश मिल रहा है।
दिमित्री पिसारेंको

यह मानते हुए कि आपके पेड़ में कोई अन-प्रतिबद्ध परिवर्तन नहीं हुए हैं, git reset --hard HEADप्रभाव में नए विकल्प के साथ अपनी फ़ाइलों को फिर से जाँचने के लिए बाध्य करने का प्रयास करें।
बेन जैक्सन

बस इसे "जीआईटी रीसेट - भार हेड" निष्पादित करने की कोशिश की। यह सफल था (मैंने संदेश देखा "HEAD is at ..."), लेकिन "गिट लागू" के साथ समस्या बनी रहती है।
दिमित्री पिसारेंको

7

मेरे मामले में मैं पहली बार में गलत तरीके से पैच फ़ाइल बनाने के लिए काफी बेवकूफ था, वास्तव में गलत तरीके से अलग-थलग । मैं उसी त्रुटि संदेशों के साथ समाप्त हुआ।

यदि आप मास्टर हैं और करते हैं git diff branch-name > branch-name.patch, तो यह आपके द्वारा किए जाने वाले सभी अतिरिक्त को हटाने की कोशिश करता है और इसके विपरीत (जो कि के बाद से पूरा करने के लिए असंभव था, जाहिर है, कभी भी किए गए परिवर्धन को हटाया नहीं जा सकता है)।

इसलिए सुनिश्चित करें कि आप अपनी शाखा को चेकआउट करें और निष्पादित करें git diff master > branch-name.patch


3

चेतावनी: यह आदेश पुराने खोए हुए कमियों को स्थायी रूप से हटा सकता है। यह प्रयास करने से पहले अपने पूरे भंडार की एक प्रति बनाएँ।

मुझे यह लिंक मिल गया है

मुझे नहीं पता कि यह क्यों काम करता है लेकिन मैंने कई कामों की कोशिश की और यह एकमात्र ऐसा काम है जिसने मेरे लिए काम किया। संक्षेप में, नीचे तीन आदेश चलाएं:

git fsck --full
git reflog expire --expire=now --all
git gc --prune=now

3
यह एक बहुत ही खतरनाक कमांड है जो पुराने खोए हुए कमानों को हमेशा के लिए हटा सकता है। यदि आपका रेपो एक अस्थिर स्थिति में है, तो यह लागू न करें।
ईटी

0

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


0

मेरा मुद्दा यह है कि मैं भागा git diff, फिर भागा git reset --hard HEAD, फिर महसूस किया कि मैं पूर्ववत करना चाहता हूं, इसलिए मैंने आउटपुट git diffको एक फ़ाइल से कॉपी करने और उपयोग करने की कोशिश की git apply, लेकिन मुझे एक त्रुटि मिली कि "पैच लागू नहीं होता है"। स्विच करने patchऔर इसका उपयोग करने की कोशिश करने के बाद , मुझे एहसास हुआ कि किसी कारण के लिए अलग-अलग का एक हिस्सा दोहराया गया था, और डुप्लिकेट को हटाने के बाद , patch(और संभवतः भी git apply) काम किया।

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