मैं किसी भी कार्यशील निर्देशिका से -p0 पैच कैसे लगा सकता हूं?


26

मेरे पास निरपेक्ष रास्तों के साथ एक पैच है जिसे मैं उपयोग करना चाहता हूं। अर्थात पहली कुछ पंक्तियाँ इस प्रकार हैं।

--- /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml  2014-10-10 18:47:23.000000000 +1100
+++ /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod  2014-11-11 09:44:17.786200477 +1100

हालाँकि, यह विफल रहता है जब तक कि मैं रूट डायरेक्टरी में नहीं हूँ।

~$ cd
~$ sudo patch -i /tmp/fix_kde_icons.patch -p0
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
...
~$ cd /tmp
/tmp$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/tmp$ cd /usr
/usr$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/usr$ cd /
/$ sudo patch -i /tmp/fix_kde_icons.patch -p0
patching file /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml

क्या patchकिसी कार्यशील निर्देशिका के साथ निरपेक्ष पथ का उपयोग करने का कोई तरीका है ?


मैं इसके बजाय पैच को स्वयं संपादित करूंगा।
Braiam

@Braiam मैं पैच पर क्या विशिष्ट संपादन करूंगा? मैं मूल रूप से सोच रहा हूं कि क्या मैं patchकमांड में किसी भी लक्ष्य पथ को निर्दिष्ट करने से बच सकता हूं ।
स्परहॉक

कुछ संदर्भ, कृपया। क्या आप इस पैच को रनिंग सिस्टम पर लागू करने का प्रयास कर रहे हैं? यदि हां, तो क्यों? आपका वितरण / OS क्या है? यह पैच क्या करता है? यह एक केडीई चीज़ के लिए एक पैच की तरह दिखता है। क्या घटक है? मैं सामान्य तौर पर, यदि आप वितरण आपके लिए पैच लागू नहीं कर रहे हैं, तो आपको संबंधित पैकेज को स्रोत से पैच के साथ फिर से बनाना चाहिए। और आप पथ के प्रमुख हिस्से को ट्रिम कर सकते हैं। यह एक समस्या नहीं होनी चाहिए। आप कितना ट्रिम करते हैं यह इस बात पर निर्भर करता है कि स्रोत कैसा दिखता है।
फहीम मीठा

1
@FaheemMitha हाँ, यह आर्क / केडीई के साथ चल रहा है। इस बग को ठीक करना है । यदि मैं मैन्युअल रूप से परिवर्तन लागू करता हूं तो फिक्स काम करता है। हालाँकि, मुझे नहीं लगता कि इस मामले में संदर्भ इतना मायने रखता है, क्योंकि मैं इस समस्या को एक परीक्षण फ़ाइल के साथ दोहरा सकता हूं /tmp/foo। मैं एक सामान्य उत्तर में दिलचस्पी लेता हूं जो लागू होता है patch
गौरव

जवाबों:


35

जीएनयू पैच के स्रोत कोड को देखते हुए, यह व्यवहार 2.7 संस्करण के बाद से बनाया गया है। जीएनयू पैच 2.7.1 के अनुसार, केवल संबंधित पथों ..को स्वीकार नहीं किया जाता है, जब तक कि वर्तमान निर्देशिका रूट डायरेक्टरी न हो।

पूर्ण पथ वाले पैच को लागू करने के लिए, आप उपयोग कर सकते हैं

(cd / && sudo patch -p0) <foo.patch

जीएनयू पैच के हाल के संस्करणों में, आप बस कर सकते हैं

sudo patch -d/ -p0 <foo.patch

ठीक है, यह वही है जो यह है। हालाँकि, यदि आप मेरे आदेशों की जाँच करते हैं, तो cd /usrइस निर्देशिका के अंतर्गत लक्ष्य फ़ाइलों के होने के बावजूद भी विफल रहे।
स्परहॉक

@Sparhawk क्षमा करें, मेरा वर्णन आंशिक रूप से गलत था। परीक्षण है: यदि वर्तमान निर्देशिका नहीं है /, तो किसी भी निरपेक्ष पथ या पथ को अस्वीकार करें जिसमें एक ..घटक है।
गिल्स एसओ- बुराई को रोकना '

7
या अधिक बस,sudo patch -d/ -p0 <foo.patch
Qian

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