কোনও ফাইল বা ফোল্ডার ইতিমধ্যে প্যাচ করা হয়েছে কিনা তা পরীক্ষা করে দেখুন


22

প্যাচ প্রয়োগের আগে কোনও ফাইল ইতিমধ্যে প্যাচ করা হয়েছে কিনা তা জানা সম্ভব?

আমার কোনও স্ক্রিপ্টে এটি করা দরকার, কোন চিন্তা?


1
আপনি তাদের প্যাচ করতে কোন প্রোগ্রাম ব্যবহার করছেন? কী ধরণের প্যাচ?
সর্বময়

1
কীটি হ'ল "-আর" - unix.stackexchange.com/a/86872/6622
পোজ

উত্তর:


20

হ্যাঁ, কেবল বিকল্প patchদিয়ে চালান --dry-run, এটি হয় ব্যর্থ হয় বা সফল হয় যা এর প্রস্থান স্থিতি দিয়ে খুঁজে পাওয়া যাবে।

তবে আরও সাধারণ (এবং ত্রুটির প্রবণ) উপায়ে আপনাকে সম্ভবত এটি -Rবিকল্প দিয়ে চালাতে হবে যার অর্থ "বিপরীত" কেবলমাত্র যদি এটি পুরো প্যাচটি ফিরিয়ে দিতে সক্ষম হয় তবে এটি "প্রয়োগকৃত" হিসাবে বিবেচিত হতে পারে। অন্যথায় ('-আর' ছাড়া) মূল ফাইলের কিছু অংশ পরিবর্তিত হওয়ার কারণে এটি ব্যর্থ হতে পারে। নীচে একটি সাধারণ উদাহরণ দেওয়া হল:

if ! patch -R -p0 -s -f --dry-run <patchfile; then
  patch -p0 <patchfile
fi

(এমনকি, উপরের স্নিপেটে আপনি এমনকি patchতার স্টাডাউট এবং স্টাডারকে সম্পূর্ণরূপে পুনর্নির্দেশ করে চুপ করে থাকতে পছন্দ করতে পারেন /dev/null)


1
এটি আমার পক্ষে কাজ করে না। যখন আমি এই কমান্ডটি চালিত করি, যদি প্যাচটি প্রয়োগ না করা থাকে, তবে প্যাচটিকে ইন্টারেক্টিভ মোডে '' রিভার্স '' করা উচিত কিনা এবং যদি আমি ব্যাচ মোড ব্যবহার করি তবে এটি বিপরীত ক্রিয়াকলাপটি উপেক্ষা করবে এবং প্যাচটি প্রয়োগ করবে, 0 এ ফিরে আসবে।
Synack

1
আরে, এ হিসাবে যুক্ত -sfকরার চেষ্টা করুন patch(হিসাবে এটি লিখিত হতে পারে patch -Rsfp0 --dry-run)
কুইজ

1
@ সিন্যাক ঠিক আছে?
পোজ

16

এটি যদি কাউকে সহায়তা করে তবে আপনি যদি ব্যাশ স্ক্রিপ্ট ব্যবহার করেন তবে সর্বজ্ঞানী দ্বারা প্রদত্ত উদাহরণটি কার্যকর হবে না। ব্যাশে সফল কমান্ডের প্রস্থান স্থিতি 0 হয়

সুতরাং নিম্নলিখিত কাজ করবে:

patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status 
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
    #apply the patch
    patch -p0 -N < patchfile
fi

1পরিবর্তে 0if [ $? -eq 1 ]
চেকিংটি

2
না, 0 সঠিক। শুকনো রান যদি কোনও কারণে ব্যর্থ হয় তবে প্যাচটি প্রয়োগ করা উচিত নয়, যদি প্যাচটি শূন্য-শূন্যের সাথে প্রস্থান করে।
ফ্লাস'জেন

আমার স্ক্রিপ্টটি ব্যাশে সঠিক ছিল। বাশ 0 এর একটি প্রস্থান কোডটিকে trueif এর উদ্দেশ্যে বিবেচনা করে। অবশ্যই কারণ বেশিরভাগ কমান্ড সাফল্য নির্দেশ করতে 0 এর একটি প্রস্থান কোড ব্যবহার করে।
সর্বশক্তিমান

2

এখানে অনুমান করে ধরে নেওয়া যায় যে আপনি patchইউটিলিটিটি ব্যবহার করছেন এবং প্যাচ করার জন্য প্রতিটি ফাইলের নিজস্ব প্যাচ রয়েছে:

if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
    echo The file has not had the patch applied,
    echo and the patch will apply cleanly.
else
    echo The file may not have had the patch applied.
    echo Or maybe the patch doesn't apply to the file.
fi

অথবা, আপনি যদি ফাইলগুলি আগে প্যাচ করেছিলেন এবং জানতে চান, এটি কোনও নির্দিষ্ট ফাইলকে স্পর্শ করেছে কিনা, আপনি -Bবিকল্পটি সহ প্রথম প্যাচটি চালাতে পারবেন , যার ফলে ব্যাকআপ তৈরি হতে পারে। তারপরে আপনি ব্যাকআপটির অস্তিত্ব পরীক্ষা করে দেখুন।
পিটার্ফ

8
আপনি কেন nohupসেই ifক্ষেত্রে ব্যবহার করতে বেছে নিয়েছেন তার বিষয়ে আপনি কিছুটা প্রসারিত করতে পারেন ?
zrajm

@ জরাজম - কেন আমি এটি করেছি তা মনে করতে পারছি না। এবং যখন আমি লক্ষ্য করেছি (কোনও সম্পাদনার অনুমোদনের অনুরোধের কারণে) এটি সেখানে ছিল, এটি এত দিন আগে ছিল কারণ আমি কখনই কারণটি পুনরুদ্ধার করব না। এটি এখন এটি তাকানো আমার কাছে অর্থহীন বলে মনে হচ্ছে।
সর্বজনীন

0

আমার ক্ষেত্রে আমি এই চেকটি তৈরি করতে চেয়েছিলাম যাতে প্যাচ কমান্ড চালানো কোনও ইন্টারেক্টিভ টার্মিনালটি দিয়ে কী করা উচিত (বিশেষত সিআইয়ের জন্য) জিজ্ঞাসা না করে।

দেখা যাচ্ছে যে আপনার যদি কেবল প্রয়োজন হয় আপনি --forwardআর্গুমেন্টটিও ব্যবহার করতে পারেন এবং এটি ইতিমধ্যে প্রয়োগ করা থাকলে প্যাচটি এড়িয়ে যাবেন!


0

এটি আমার সাথে কাজ করেছে।

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.