PATCH(1) دستورات کاربر PATCH(1)

patch - اعمال تغییرات و تفاوتها (diff) بر روی فایلها

patch [گزینه‌ها] [فایل_اصلی [فایل_وصله]]

اما معمولاً فقط

patch -pnum <فایل_وصله

دستور patch پرونده تفاوتها (patch file حاوی خروجی diff) را خوانده و تغییرات را مستقیماً روی یک یا چند فایل مبدأ اعمال میکند. به طور معمول نسخه‌های وصله‌شده جایگزین فایل‌های اصلی می‌شوند. می‌توان از فایل‌ها نسخه پشتیبان تهیه کرد؛ به گزینه -b یا --backup مراجعه کنید. نام فایل‌هایی که باید وصله شوند معمولاً از درون فایل وصله استخراج می‌شود، اما اگر تنها یک فایل برای وصله‌زدن وجود داشته باشد، می‌توان نام آن را در خط فرمان با originalfile مشخص کرد.

هنگام اجرا، برنامه patch سعی می‌کند نوع فهرست diff را تشخیص دهد، مگر اینکه با گزینه‌های -c (--context)، -e (--ed)، -n (--normal) یا -u (--unified) به صورت صریح تعیین شده باشد. تفاوت‌های زمینه‌ای (سبک قدیم، سبک جدید و یکپارچه) و تفاوت‌های معمولی توسط خود برنامه patch اعمال می‌شوند، در حالی که تفاوت‌های ed تنها از طریق لوله به ویرایشگر ed(1) ارسال می‌گردند.

دستور patch سعی می‌کند متون اضافی ابتدایی را رد کند، diff را اعمال کند و سپس متون اضافی انتهایی را نیز نادیده بگیرد. بنابراین می‌توانید پیامی حاوی ایمیل که دربردارنده یک diff است را به patch ارسال کنید و به درستی عمل کند. اگر کل diff به اندازه یکسانی تورفتگی داشته باشد، خطوط با CRLF خاتمه یابند، یا diff طبق مشخصه RFC 934 اینترنت با افزودن "- " به خطوطی که با "-" شروع می‌شوند بسته‌بندی شده باشد، این موارد شناسایی و مدیریت می‌شوند. پس از حذف تورفتگی یا بسته‌بندی، خطوطی که با # شروع می‌شوند، چون به عنوان یادداشت در نظر گرفته می‌شوند نادیده گرفته خواهند شد.

در تفاوت‌های زمینه‌ای، و به میزان کمتری در تفاوت‌های معمولی، patch می‌تواند نادرست بودن شماره خطوط ذکرشده در وصله را تشخیص داده و سعی کند مکان صحیح را برای اعمال هر قطعه (hunk) از وصله بیابد. به عنوان حدس اول، شماره خط ذکرشده برای قطعه را به همراه یا منهای جابه‌جایی‌های قبلی در نظر می‌گیرد. اگر آن مکان درست نباشد، patch به جلو و عقب پیمایش می‌کند تا خطوط منطبق با زمینه داده‌شده در قطعه را بیابد. ابتدا patch به دنبال مکانی می‌گردد که تمام خطوط زمینه مطابقت داشته باشند. اگر مکانی پیدا نشود، و ساختار diff زمینه‌ای باشد، و ضریب تطابق تقریبی (fuzz factor) برابر ۱ یا بیشتر باشد، پیمایش دیگری با نادیده گرفتن خط اول و آخر زمینه صورت می‌گیرد. اگر باز هم ناموفق بود و ضریب تقریبی ۲ یا بیشتر باشد، دو خط اول و دو خط آخر زمینه نادیده گرفته شده و پیمایش تکرار می‌شود. (حداکثر ضریب تقریبی پیش‌فرض برابر ۲ است.)

قطعه‌هایی که زمینه پیشوندی کمتری نسبت به پسوندی دارند (پس از اعمال تقریب)، اگر شماره خط اول آن‌ها ۱ باشد باید در ابتدای فایل اعمال شوند. قطعه‌هایی که زمینه پیشوندی بیشتری نسبت به پسوندی دارند باید در انتهای فایل اعمال گردند.

اگر patch نتواند جایی برای اعمال آن قطعه بیابد، آن قطعه را در یک فایل پس‌زده (reject file) ذخیره می‌کند که معمولاً نام آن برابر نام فایل خروجی به همراه پسوند .rej یا # است؛ در صورتی که .rej نام فایلی بیش از حد طولانی بسازد (اگر حتی افزودن یک نویسه # نام فایل را بیش از حد طولانی کند، کاراکتر # جایگزین آخرین نویسه نام فایل می‌شود).

قطعه ردشده با قالب diff یکپارچه (unified) یا زمینه‌ای (context) ذخیره می‌شود. اگر ورودی diff معمولی بوده باشد، بسیاری از زمینه‌ها خالی خواهند بود. شماره خطوط روی قطعات موجود در فایل پس‌زده ممکن است با فایل وصله متفاوت باشند: آن‌ها بازتاب‌دهنده مکان تقریبی هستند که patch تصور می‌کند قطعات باید در فایل جدید (و نه قدیمی) قرار می‌گرفتند.

با تکمیل هر قطعه، در صورت شکست قطعه به شما اطلاع داده می‌شود و مشخص می‌شود که patch تصور می‌کرده قطعه در کدام خط (از فایل جدید) باید قرار بگیرد. اگر قطعه در خطی متفاوت از شماره خط موجود در diff اعمال شود، میزان جابه‌جایی (offset) گزارش داده می‌شود. یک جابه‌جایی بزرگ ممکن است نشان دهد که قطعه در جای اشتباهی اعمال شده است. همچنین اگر از ضریب تقریب (fuzz) استفاده شده باشد گزارش می‌شود که در این صورت باید دقت بیشتری به خرج دهید. اگر گزینه --verbose مشخص شده باشد، قطعاتی که تطابق کامل دارند نیز گزارش می‌شوند.

اگر هیچ فایل اصلی origfile در خط فرمان مشخص نشده باشد، patch تلاش می‌کند با قوانین زیر نام فایلی که باید ویرایش شود را از متن‌های ابتدایی تشخیص دهد.

ابتدا patch فهرستی مرتب از نام‌های پیشنهادی به شرح زیر تشکیل می‌دهد:

  • اگر هدر از نوع diff زمینه‌ای باشد، patch نام فایل قدیمی و جدید را از هدر برمی‌دارد. اگر نام فایلی تعداد اسلش کافی برای ارضای گزینه -pnum یا --strip=num نداشته باشد نادیده گرفته می‌شود. نام /dev/null نیز نادیده گرفته می‌شود.
  • اگر خط Index: در متن‌های ابتدایی وجود داشته باشد و هر دو نام قدیم و جدید غایب باشند یا اگر patch منطبق بر استاندارد POSIX باشد، patch نام موجود در خط Index: را انتخاب می‌کند.
  • برای قوانین بعدی، نام‌های پیشنهادی به ترتیب (قدیم، جدید، ایندکس) در نظر گرفته می‌شوند، صرف‌نظر از ترتیبی که در هدر آمده است.

سپس patch یک نام فایل را از فهرست پیشنهادی به شرح زیر انتخاب می‌کند:

  • اگر برخی از فایل‌های نام‌برده وجود داشته باشند، در صورت انطباق با POSIX اولین نام، و در غیر این صورت بهترین نام را انتخاب می‌کند.
  • اگر patch سیستم‌های کنترلی RCS، ClearCase، Perforce و SCCS را نادیده نگیرد (به گزینه -g num یا --get=num مراجعه کنید)، و هیچ فایلی وجود نداشته باشد اما یک نسخه اصلی در این سیستم‌ها پیدا شود، patch اولین فایل دارای نسخه اصلی را انتخاب می‌کند.
  • اگر هیچ فایل نام‌برده‌ای وجود نداشته باشد، نسخه اصلی در سیستم‌های کنترلی پیدا نشود، نام‌هایی ذکر شده باشد، patch با POSIX منطبق نباشد و به نظر برسد که وصله قصد ایجاد فایل دارد، patch بهترین نامی که نیاز به ساخت کمترین دایرکتوری دارد را برمی‌گزیند.
  • اگر هیچ نام فایلی از روش‌های بالا حاصل نشود، از شما نام فایل پرسیده می‌شود و patch آن نام را انتخاب می‌کند.

برای تعیین بهترین نام از یک فهرست غیرخالی، patch ابتدا تمام نام‌هایی را برمی‌دارد که کمترین بخش‌های مسیر را دارند؛ از میان آن‌ها کوتاه‌ترین نام پایه (basename)؛ سپس کوتاه‌ترین نام کلی؛ و در نهایت اولین نام باقی‌مانده را انتخاب می‌کند.

علاوه بر این، اگر متن ابتدایی حاوی یک خط Prereq: باشد، patch اولین کلمه خط پیش‌نیازها (معمولاً شماره نسخه) را برمی‌دارد و فایل اصلی را بررسی می‌کند تا ببیند آیا آن کلمه در آن یافت می‌شود یا خیر. اگر یافت نشود، patch پیش از ادامه کار از کاربر تایید می‌خواهد.

نتیجه تمام این موارد این است که شما باید بتوانید دستوری مانند زیر را در پوسته اجرا کنید:

patch -d /usr/src/local/blurfl

و فایلی را در دایرکتوری blurfl مستقیماً از روی وصله‌ای که از ورودی استاندارد خوانده می‌شود وصله بزنید.

اگر فایل وصله شامل بیش از یک وصله باشد، patch تلاش می‌کند هر یک از آن‌ها را طوری اعمال کند که گویی از فایل‌های وصله جداگانه آمده‌اند. این بدین معنی است که نام فایل برای هر فهرست diff باید جداگانه تعیین شود و متون پیش از هر diff حاوی اطلاعات مفیدی چون نام فایل و شماره بازبینی است.

تهیه نسخه پشتیبان از فایل‌ها. بدین معنا که هنگام وصله‌زدن یک فایل، فایل اصلی به جای حذف‌شدن، تغییر نام می‌یابد یا کپی می‌شود. برای جزئیات نحوه تعیین نام فایل‌های پشتیبان به گزینه -V یا --version-control مراجعه کنید.
تهیه نسخه پشتیبان از فایل در صورتی که وصله دقیقاً با فایل مطابقت نداشته باشد و پشتیبان‌گیری به شکل دیگری درخواست نشده باشد. این حالت پیش‌فرض است مگر اینکه patch با استاندارد POSIX مطابقت داشته باشد.
عدم تهیه نسخه پشتیبان از فایل در صورت عدم تطابق دقیق، در صورتی که پشتیبان‌گیری صریحاً درخواست نشده باشد. این حالت پیش‌فرض در صورت سازگاری با POSIX است.
استفاده از روش ساده (simple) برای تعیین نام فایل‌های پشتیبان (گزینه -V method یا --version-control method را ببینید)، و الحاق pref به نام فایل هنگام تولید نام پشتیبان. برای مثال، با -B /junk/ نام فایل پشتیبان ساده برای src/patch/util.c برابر /junk/src/patch/util.c خواهد بود.
نوشتن تمام فایل‌ها در حالت باینری، به جز خروجی استاندارد و /dev/tty. هنگام خواندن، سازوکار تبدیل پایان‌خط‌های CRLF به LF غیرفعال می‌شود. این گزینه در سیستم‌های POSIX هنگام اعمال وصله‌های تولیدشده در سیستم‌های غیرپازیکس بر روی فایل‌های غیرپازیکس مورد نیاز است. (در سیستم‌های POSIX، خواندن و نوشتن فایل هرگز پایان‌خط‌ها را تغییر نمی‌دهد. در ویندوز، پایان‌خط‌ها به صورت پیش‌فرض تغییر می‌کنند و هنگامی که پایان خط اهمیت دارد باید وصله‌ها با diff --binary تولید شوند.)
-c یا --context
تفسیر فایل وصله به عنوان یک diff زمینه‌ای (context) معمولی.
تغییر مسیر به دایرکتوری dir بلافاصله و پیش از انجام هر کار دیگری.
استفاده از ساختار #ifdef ... #endif برای مشخص‌کردن تغییرات، با استفاده از define به عنوان نماد متمایزکننده.
چاپ نتایج اعمال وصله‌ها بدون ایجاد تغییر واقعی در هیچ فایلی.
تفسیر فایل وصله به عنوان یک اسکریپت ed.
حذف فایل‌های خروجی که پس از اعمال وصله‌ها خالی می‌شوند. معمولاً این گزینه غیرضروری است چرا که patch می‌تواند زمان‌بندی‌های هدر را برای تعیین وجود یا عدم وجود فایل پس از وصله بررسی کند. با این حال اگر ورودی یک diff زمینه‌ای نباشد یا patch منطبق بر POSIX باشد، فایل‌های خالی را حذف نمی‌کند مگر اینکه این گزینه تعیین شده باشد. وقتی patch فایلی را حذف می‌کند، سعی می‌کند دایرکتوری‌های والد خالی آن را نیز حذف نماید.
فرض این که کاربر دقیقاً می‌داند چه می‌کند و هیچ سوالی نپرسد. رد کردن وصله‌هایی که هدر آن‌ها مشخص نمی‌کند کدام فایل باید وصله شود؛ وصله‌زدن فایل‌ها حتی اگر نسخه نادرستی برای خط Prereq: داشته باشند؛ و فرض این که وصله‌ها معکوس نیستند حتی اگر معکوس به نظر برسند. این گزینه توضیحات خروجی را متوقف نمی‌کند؛ برای آن از -s استفاده کنید.
تنظیم حداکثر ضریب تطابق تقریبی (fuzz factor). این گزینه فقط برای تفاوت‌های دارای زمینه کاربرد دارد و باعث می‌شود patch تا حداکثر این تعداد خط از زمینه را در جستجوی مکان مناسب برای اعمال قطعه نادیده بگیرد. توجه داشته باشید که ضریب تقریب بزرگ‌تر خطر اعمال نادرست وصله را افزایش می‌دهد. مقدار پیش‌فرض برابر ۲ است. ضریب تقریب بزرگ‌تر یا مساوی تعداد خطوط زمینه (معمولاً ۳)، کل زمینه را نادیده می‌گیرد.
کنترل رفتار patch هنگامی که فایلی تحت کنترل RCS یا SCCS است و وجود ندارد یا فقط‌خواندنی است، یا زمانی که تحت کنترل ClearCase یا Perforce است و وجود ندارد. اگر num عددی مثبت باشد، patch فایل را از سیستم کنترل نسخه دریافت (checkout) می‌کند؛ اگر صفر باشد سیستم‌های کنترلی را نادیده می‌گیرد و فایل را دریافت نمی‌کند؛ و اگر منفی باشد از کاربر درباره دریافت فایل سوال می‌پرسد. مقدار پیش‌فرض از متغیر محیطی PATCH_GET گرفته می‌شود؛ اگر تنظیم نشده باشد مقدار پیش‌فرض صفر است.
نمایش خلاصه گزینه‌ها و خروج.
خواندن وصله از patchfile. اگر patchfile برابر - باشد، ورودی از ورودی استاندارد خوانده می‌شود که حالت پیش‌فرض است.
تطبیق تقریبی الگوها در صورتی که فاصله‌ها یا تب‌ها دستخوش تغییر شده باشند. هر دنباله‌ای از فاصله‌ها در فایل وصله با هر دنباله‌ای در فایل اصلی مطابقت داده می‌شود و فاصله‌های انتهای خطوط نادیده گرفته می‌شوند. کاراکترهای عادی همچنان باید دقیقاً مطابقت داشته باشند. هر خط زمینه همچنان باید با خطی در فایل اصلی بخواند.
ادغام فایل وصله با فایل‌های اصلی، مشابه diff3(1) یا merge(1). در صورت بروز تداخل، patch هشدار داده و بخش تداخل را بین خطوط <<<<<<< و >>>>>>> قرار می‌دهد. یک تداخل معمولی شبیه به زیر خواهد بود:
<<<<<<<
خطوط از فایل اصلی
|||||||
خطوط اصلی از فایل وصله
=======
خطوط جدید از فایل وصله
>>>>>>>
آرگومان اختیاری --merge قالب خروجی تداخل‌ها را تعیین می‌کند: قالب diff3 بخش حاوی ||||||| به همراه خطوط اصلی از وصله را نمایش می‌دهد؛ در قالب merge این بخش وجود ندارد. قالب merge پیش‌فرض است.

این گزینه متضمن --forward است و گزینه --fuzz=num را در نظر نمی‌گیرد.

تفسیر فایل وصله به عنوان diff معمولی.
هنگامی که وصله اعمال نمی‌شود، معمولاً patch بررسی می‌کند که آیا وصله قبلاً اعمال شده است یا خیر (با تلاش برای اعمال معکوس اولین قطعه). گزینه --forward از این بررسی جلوگیری می‌کند. همچنین به -R مراجعه کنید.
ارسال خروجی به outfile به جای اعمال تغییرات در جای خود فایل‌ها. اگر outfile یکی از فایل‌های در حال وصله‌شدن باشد نباید از این گزینه استفاده کنید. هنگامی که outfile برابر - باشد، خروجی به خروجی استاندارد ارسال شده و پیام‌ها به خطای استاندارد فرستاده می‌شوند.
حذف کوتاه‌ترین پیشوند شامل num اسلش ابتدایی از هر نام فایل موجود در فایل وصله. یک دنباله از چند اسلش متوالی به عنوان یک اسلش محاسبه می‌شود. این گزینه تعیین می‌کند نام فایل‌ها چگونه بررسی شوند، در صورتی که فایل‌های خود را در دایرکتوری متفاوتی نسبت به ارسال‌کننده وصله نگه می‌دارید. برای مثال اگر نام فایل در وصله
/u/howard/src/blurfl/blurfl.c

باشد، گزینه -p0 کل مسیر را دست‌نخورده نگه می‌دارد، -p1 مسیر

u/howard/src/blurfl/blurfl.c

را بدون اسلش ابتدایی تولید می‌کند، -p4 مسیر

blurfl/blurfl.c

را می‌دهد، و عدم تعیین -p تنها نام blurfl.c را نتیجه می‌دهد. نام نهایی حاصل در دایرکتوری جاری یا دایرکتوری مشخص‌شده با گزینه -d جستجو خواهد شد.

انطباق دقیق‌تر با استاندارد POSIX به شرح زیر:
  • انتخاب اولین فایل موجود از فهرست (قدیم، جدید، ایندکس) هنگام استخراج نام فایل از هدرهای diff.
  • عدم حذف فایل‌هایی که پس از اعمال وصله خالی می‌شوند.
  • عدم پرسش درباره دریافت فایل از RCS، ClearCase، Perforce یا SCCS.
  • الزام به قرارگیری همه گزینه‌ها پیش از نام فایل‌ها در خط فرمان.
  • عدم ایجاد نسخه پشتیبان هنگام عدم تطابق.
استفاده از سبک word برای نقل‌قول نام‌ها در خروجی. مقدار word می‌تواند یکی از موارد زیر باشد:
چاپ نام‌ها بدون تغییر.
نقل‌قول نام‌ها برای شل در صورتی که حاوی نویسه‌های خاص شل باشند یا باعث ابهام در خروجی گردند.
همواره نقل‌قول نام‌ها برای شل، حتی اگر نیاز به نقل‌قول نداشته باشند.
نقل‌قول نام‌ها همانند رشته‌های زبان C.
همانند حالت c با این تفاوت که علامت‌های نقل‌قول دوتایی اطراف حذف می‌شوند.

می‌توانید مقدار پیش‌فرض گزینه --quoting-style را با متغیر محیطی QUOTING_STYLE تعیین کنید. اگر این متغیر تنظیم نشده باشد، مقدار پیش‌فرض shell خواهد بود.

قرار دادن قطعات ردشده در rejectfile به جای فایل پیش‌فرض .rej. اگر rejectfile برابر - باشد، قطعات ردشده دور ریخته می‌شوند.
فرض این که وصله با جابه‌جا شدن فایل‌های قدیم و جدید تولید شده است (به اصطلاح وصله وارونه). برنامه patch سعی می‌کند هر قطعه را پیش از اعمال معکوس کند. قطعات ردشده نیز در قالب معکوس ذخیره می‌شوند. گزینه -R با اسکریپت‌های ed کار نمی‌کند زیرا اطلاعات کافی برای بازسازی عملیات معکوس وجود ندارد.

اگر اولین قطعه یک وصله شکست بخورد، patch قطعه را معکوس می‌کند تا ببیند آیا به این شکل قابل اعمال است یا خیر. اگر اعمال شد، از شما پرسیده می‌شود که آیا مایل به فعال‌سازی گزینه -R هستید یا خیر. اگر نشد، اعمال وصله به صورت عادی ادامه می‌یابد.

رفتار در هنگام تلاش برای تغییر یک فایل فقط‌خواندنی: نادیده‌گرفتن مشکل احتمالی (ignore)، هشدار دادن (warn که پیش‌فرض است)، یا شکست عملیات (fail).
تولید فایل‌های ردشده در قالب تعیین‌شده (context یا unified). بدون این گزینه، قطعات ردشده در قالب ورودی وصله ایجاد خواهند شد.
انجام کار در سکوت، مگر اینکه خطایی رخ دهد.
پیروی از پیوندهای نمادین هنگام جستجوی فایل‌های ورودی. به جای تغییر فایل‌های مقصد، پیوندهای نمادین را جایگزین می‌کند. وصله‌های سبک گیت روی پیوندهای نمادین دیگر کار نخواهند کرد. این گزینه برای سازگاری با نسخه‌های پیشین است و استفاده از آن توصیه نمی‌شود.
متوقف‌کردن سوالات همانند -f، اما با فرض‌های متفاوت: رد کردن وصله‌هایی که هدر آن‌ها نام فایل ندارد؛ رد کردن وصله‌هایی که فایل اصلی با نسخه خط Prereq: تطابق ندارد؛ و فرض بر معکوس‌بودن وصله‌ها در صورت ظاهر معکوس.
تنظیم زمان دسترسی و اصلاح فایل‌های وصله‌شده از روی برچسب‌های زمانی موجود در هدرهای زمینه. مگر اینکه صریحاً مشخص شده باشد، فرض می‌شود برچسب‌های زمانی از زمان محلی استفاده می‌کنند.

استفاده از این گزینه با برچسب‌های زمانی بدون منطقه زمانی توصیه نمی‌شود، زیرا وصله‌ها در سایر مناطق زمانی به درستی اعمال نمی‌شوند و زمان محلی در تغییر ساعت تابستانی ابهام‌آور است. اطمینان حاصل کنید که برچسب‌ها دارای منطقه زمانی هستند، یا با UTC وصله‌ها را ایجاد کرده و از گزینه -Z یا --set-utc استفاده کنید.

تفسیر فایل وصله به عنوان یک diff یکپارچه (unified context diff).
نمایش نسخه و سطح وصله برنامه patch و خروج.
استفاده از روش method برای تعیین نام فایل‌های پشتیبان. روش را می‌توان با متغیر محیطی PATCH_VERSION_CONTROL (یا در صورت عدم تنظیم، VERSION_CONTROL) نیز مشخص کرد که توسط این گزینه بازنویسی می‌شود. این گزینه تأثیری در اصل پشتیبان‌گیری ندارد و فقط نام فایل‌های پشتیبان را مشخص می‌کند.

مقادیر مجاز برای method عبارتند از:

تهیه نسخه پشتیبان شماره‌دار از فایل‌هایی که از قبل نسخه شماره‌دار دارند، و در غیر این صورت پشتیبان ساده. این حالت پیش‌فرض است.
تهیه نسخه پشتیبان شماره‌دار. نام فایل پشتیبان برای F به صورت F.~N~ خواهد بود که N شماره نسخه است.
تهیه نسخه پشتیبان ساده. گزینه‌های -B یا --prefix، -Y یا --basename-prefix، و -z یا --suffix نام پشتیبان ساده را تعیین می‌کنند. در صورت عدم تعیین هیچ‌یک، پسوند پیش‌فرض از متغیر محیطی SIMPLE_BACKUP_SUFFIX یا در غیر این صورت .orig خواهد بود.

در پشتیبان‌های شماره‌دار یا ساده، اگر نام فایل بیش از حد طولانی شود، از پسوند ~ استفاده می‌شود؛ و اگر باز هم طولانی باشد، ~ جایگزین آخرین کاراکتر نام می‌شود.

نمایش اطلاعات اضافی و مشروح درباره کار در حال انجام.
تنظیم پرچم‌های اشکال‌زدایی داخلی برنامه.
استفاده از روش ساده برای نام‌گذاری پشتیبان و افزودن پیشوند pref به نام پایه (basename) فایل. برای مثال با -Y .del/ نام پشتیبان برای src/patch/util.c برابر src/patch/.del/util.c خواهد بود.
استفاده از روش ساده برای نام‌گذاری پشتیبان و استفاده از suffix به عنوان پسوند. برای مثال با -z - نام فایل پشتیبان برای src/patch/util.c برابر src/patch/util.c- خواهد بود.
تنظیم زمان دسترسی و تغییر فایل‌ها از روی برچسب‌های زمانی هدر بر مبنای ساعت هماهنگ جهانی (UTC یا GMT). همچنین به گزینه -T یا --set-time مراجعه کنید.

گزینه‌های -Z و -T معمولاً اگر زمان اصلی فایل با زمان هدر مطابقت نداشته باشد، یا محتوا دقیقاً همخوانی نداشته باشد، از تنظیم زمان خودداری می‌کنند، مگر اینکه گزینه -f داده شده باشد.

تعیین این که آیا patch به صورت پیش‌فرض فایل‌های ناموجود یا فقط‌خواندنی را از سیستم‌های کنترلی دریافت کند یا خیر؛ به گزینه -g یا --get مراجعه کنید.
در صورت تنظیم، patch به طور پیش‌فرض دقیق‌تر با استاندارد POSIX مطابقت خواهد کرد؛ به گزینه --posix مراجعه کنید.
مقدار پیش‌فرض برای گزینه --quoting-style.
پسوند مورد استفاده برای نام فایل‌های پشتیبان ساده به جای .orig.
دایرکتوری برای ذخیره فایل‌های موقت. patch اولین متغیر تنظیم‌شده در این فهرست را استفاده می‌کند. در صورت عدم تنظیم، به طور پیش‌فرض /tmp است.
انتخاب شیوه کنترل نسخه پشتیبان؛ به گزینه -V یا --version-control مراجعه کنید.

$TMPDIR/p*
فایل‌های موقت
/dev/tty
ترمینال کنترل‌کننده؛ برای دریافت پاسخ سوالات پرسیده‌شده از کاربر استفاده می‌شود

diff(1), ed(1), merge(1).

مارشال تی. رز و اینار ای. استفرود، استاندارد پیشنهادی برای بسته‌بندی پیام‌ها، Internet RFC 934 https://datatracker.ietf.org/doc/html/rfc934 (1985-01).

چند نکته وجود دارد که در صورت تمایل به ارسال وصله باید در نظر داشته باشید:

برنامه cd را به همراه گزینه‌های توصیه‌شده برای patch مشخص کنید. رشته گزینه -Np1 توصیه می‌شود. روند خود را با اعمال وصله بر روی نسخه‌ای از فایل‌های اصلی امتحان کنید.

می‌توانید با نگهداری یک فایل patchlevel.h که به عنوان اولین diff سطح وصله را افزایش می‌دهد، کار دریافت‌کنندگان را بسیار ساده‌تر کنید. اگر یک خط Prereq: در وصله قرار دهید، مانع اعمال نامرتب وصله‌ها بدون هشدار خواهد شد.

می‌توانید با مقایسه /dev/null یا یک فایل خالی با تاریخ مبدا (1970-01-01 00:00:00 UTC) با فایل جدید، یک فایل ایجاد کنید. این کار در صورتی کار می‌کند که فایل در دایرکتوری مقصد وجود نداشته باشد. به طور مشابه می‌توانید با مقایسه فایل حذفی با یک فایل خالی با تاریخ مبدا، فایلی را حذف کنید. فایل حذف خواهد شد مگر اینکه patch مطابق با POSIX باشد و گزینه -E یا --remove-empty-files داده نشده باشد. یک روش ساده برای تولید چنین وصله‌هایی استفاده از گزینه -N یا --new-file در diff است.

اگر دریافت‌کننده قرار است از گزینه -pN استفاده کند، خروجی‌هایی که تعداد اسلش‌های نامتعادل دارند ارسال نکنید تا ابهامی ایجاد نشود. همچنین از ارسال وصله‌هایی که نام‌های فایل پشتیبان مانند README.orig را مقایسه می‌کنند خودداری کنید. به جای آن فایل‌های یکسان در دایرکتوری‌های متفاوت مانند old/README و new/README را مقایسه کنید.

دقت کنید وصله‌های معکوس ارسال نکنید. همچنین سعی کنید وصله شما فایل‌های اشتقاقی و تولیدشده (مانند فایلی که توسط makefile ساخته می‌شود) را تغییر ندهد، زیرا دریافت‌کننده باید بتواند آن‌ها را بازتولید کند. اگر ناچار به ارسال diff فایل‌های اشتقاقی شدید، آن‌ها را با زمان‌بندی UTC تولید کرده و از دریافت‌کننده بخواهید با گزینه -Z یا --set-utc وصله را اعمال کند.

اگرچه می‌توانید ۵۸۲ فهرست diff را در یک فایل قرار دهید، اما دسته‌بندی وصله‌های مرتبط در فایل‌های جداگانه معقول‌تر است.

پیام‌های تشخیصی معمولاً نشان می‌دهند که patch نتوانسته فایل وصله شما را تجزیه کند.

اگر گزینه --verbose داده شده باشد، پیام Hmm... نشان می‌دهد که متنی پردازش‌نشده در فایل وصله وجود دارد و patch تلاش می‌کند بفهمد آیا وصله‌ای در آن متن هست و از چه نوعی است.

وضعیت خروج patch: مقدار 0 اگر تمام قطعات با موفقیت اعمال شوند، مقدار 1 اگر برخی قطعات اعمال نشوند یا تداخل ادغام رخ دهد، و مقدار 2 در صورت بروز خطاهای جدی‌تر. هنگام اعمال دسته‌ای وصله‌ها در یک حلقه، بررسی این وضعیت خروج الزامی است تا وصله بعدی روی فایلی نیمه‌وصله‌شده اعمال نشود.

تفاوت‌های زمینه‌ای نمی‌توانند ایجاد یا حذف فایل‌های خالی، دایرکتوری‌های خالی یا فایل‌های ویژه مانند پیوندهای نمادین را به صورت مطمئن نشان دهند. همچنین تغییرات متادیتای فایل مانند مالکیت، مجوزها یا پیوندهای سخت را نمایش نمی‌دهند. در صورت نیاز به این تغییرات، باید دستورالعمل‌های جداگانه (مانند یک اسکریپت پوسته) همراه وصله باشد.

برنامه patch نمی‌تواند نادرست بودن شماره خطوط در اسکریپت ed را تشخیص دهد و خطوط نادرست در diff معمولی را نیز تنها هنگام تغییر یا حذف می‌فهمد.

برنامه patch معمولاً نتایج صحیحی تولید می‌کند، حتی زمانی که حدس‌های زیادی می‌زند. با این حال تضمین صحت نتایج فقط زمانی وجود دارد که وصله دقیقاً روی همان نسخه‌ای اعمال شود که وصله از آن تولید شده است.

استاندارد POSIX رفتارهایی تعیین می‌کند که با نسخه GNU برنامه patch تفاوت دارد:

  • در POSIX اگر -b استفاده نشود، حتی در صورت عدم تطابق نسخه پشتیبان تهیه نمی‌شود. در GNU با گزینه --no-backup-if-mismatch یا متغیر POSIXLY_CORRECT می‌توان این رفتار را فعال کرد.
  • هنگام استخراج نام فایل از هدر، روش استانداردی وجود دارد که در صورت برابری تعداد اسلش‌ها مشکلی نخواهد داشت.
  • هنگام ارسال دستورالعمل برای اجرا توسط هر دو نسخه پازیکس و گنو، تنها از این گزینه‌ها استفاده کنید:
    -b
    -c
    -d dir
    -D define
    -e
    -i patchfile
    -l
    -n
    -N
    -o outfile
    -p num
    -R
    -r rejectfile
    -u

گزارش اشکالات را از طریق ایمیل به نشانی <bug-patch@gnu.org> ارسال فرمایید.

اگر کد تکرار شده باشد (برای نمونه با #ifdef OLDCODE ... #else ... #endif)، برنامه patch قادر به وصله‌زدن هر دو نسخه نیست و احتمالاً نسخه اشتباه را وصله زده و اعلام موفقیت نیز می‌کند.

اگر وصله‌ای را که قبلاً اعمال کرده‌اید دوباره اعمال کنید، patch تصور می‌کند وصله معکوس است و پیشنهاد معکوس‌کردن آن را می‌دهد.

محاسبه نحوه ادغام یک قطعه به طور چشمگیری دشوارتر از الگوریتم فازی استاندارد است و قطعات بزرگ‌تر کار را کندتر می‌کنند.

کپی‌رایت © 1989–2025 بنیاد نرم‌افزارهای آزاد (FSF).
کپی‌رایت © 1984–1986, 1988 لری وال (Larry Wall).

مجوز تکثیر و توزیع نسخه‌های عین متن این راهنما با حفظ این یادداشت حق نشر اعطا می‌شود.

لری وال نسخه اولیه patch را نوشت. پاول اگِرت محدودیت‌های برنامه را برطرف کرده، پشتیبانی از فایل‌های باینری و تنظیم زمان را افزود و آن را با POSIX سازگارتر کرد. از دیگر مشارکت‌کنندگان می‌توان به وین دیویسون (پشتیبانی unidiff)، دیوید مکنزی (پیکربندی و پشتیبان‌گیری) و اندریاس گرونباخر (پشتیبانی از merge) اشاره کرد.

مه ۲۰۲۵ patch