کوچکترین ویرایشهای خطی را ببینید، سپس پچ را با خود ببرید
دو متن کوتاه را خطبهخط مقایسه کنید، یک کمینهاسکریپت ویرایش قطعی را بررسی کنید و یک پچ یکپارچه با محدودههای دقیق، زمینهٔ انتخابشده و نشانگرهای صریح نبودِ خطنوی پایانی دانلود کنید.
پچ دیف یکپارچه
یک پچ استاندارد --- / +++ با محدودههای @@، زمینهٔ انتخابشده و نشانگرهای صریح نبودِ خطنوی پایانی.
اسکریپت کامل ویرایش خطی
| بدون تغییر | 1 | 1 | alpha |
| حذفشده | 2 | beta | |
| اضافهشده | 2 | beta revised | |
| بدون تغییر | 3 | 3 | line 03 |
| بدون تغییر | 4 | 4 | line 04 |
| بدون تغییر | 5 | 5 | line 05 |
| بدون تغییر | 6 | 6 | line 06 |
| بدون تغییر | 7 | 7 | line 07 |
| بدون تغییر | 8 | 8 | line 08 |
| بدون تغییر | 9 | 9 | line 09 |
| بدون تغییر | 10 | 10 | line 10 |
| بدون تغییر | 11 | 11 | line 11 |
| حذفشده | 12 | delta | |
| اضافهشده | 12 | epsilon |
چگونگی کار
مدل ویرایش
هر سند به دنبالهای مرتب از خطوط منطقی تبدیل میشود. جداکنندههای CRLF، CR قدیمی و LF یک مرز واحد در نظر گرفته میشوند، اما وجود آخرین خطنو حفظ میشود. همین تمایز است که اجازه میدهد افزودن یک خطنوی پایانی نمایش داده شود، حتی وقتی نویسههای قابلمشاهدهٔ آن خط تغییر نمیکنند.
ماتریس طولانیترین زیردنبالهٔ مشترک، بزرگترین مجموعهٔ مرتب از خطوط کاملی را پیدا میکند که بین هر دو طرف مشترک است. هرچه بیرون از آن دنبالهٔ مشترک باشد، یا حذفی از متن اصلی است یا درجی در متن اصلاحشده. انتخاب طولانیترین زیردنبالهٔ مشترک، تعداد کل این عملیات ویرایش را به کمینه میرساند.
تکرار خطوط یکسان میتواند چند پاسخ به یک اندازه کوتاه پدید آورد. این ابزار چنین برابریهایی را در یک جهت مستند میشکند — حذف پیش از درج — بنابراین ورودیهای یکسان همیشه همان پچ را تولید میکنند.
مقایسهٔ کارشده
متن اصلی:
alpha
beta
gamma
delta
متن اصلاحشده:
alpha
beta revised
gamma
epsilon
alpha و gamma دو خط بدون تغییر هستند. دو خط دیگر متن اصلی حذف میشوند و نسخهٔ اصلاحشدهٔ آنها اضافه میشود، که ۲ خط اضافهشده، ۲ خط حذفشده، ۲ خط بدون تغییر و — با سه خط زمینه — ۱ قطعه به دست میدهد:
--- a/document.txt
+++ b/document.txt
@@ -1,4 +1,4 @@
alpha
-beta
+beta revised
gamma
-delta
+epsilon
بلوک کد بالا عمداً از همان سرآیند دو خطی و دستور زبان محدودهای استفاده میکند که فایل خروجی به کار میبرد. تعداد یک فقط با نقطهٔ شروعش نوشته میشود؛ تعدادهای دیگر بهصورت start,count میآیند. بنابراین درج در یک فایل خالی با محدودهٔ قدیمی 0,0 شروع میشود.
زمینه بستهبندی را تغییر میدهد، نه پاسخ را
با سه خط زمینه، خط بدون تغییر gamma بین هر دو جایگزینی قرار میگیرد و آنها در یک قطعه شریک میشوند. با زمینهٔ صفر، آن خط بدون تغییر حذف میشود و دو ناحیهٔ جایگزینی به دو قطعهٔ فشرده تبدیل میشوند. جدول ویرایش در هر دو حالت همچنان دنبالهٔ کامل را فهرست میکند.
پیشفرض GNU Diffutils سه خط است، چون زمینه به برنامهٔ پچ کمک میکند پس از جابهجایی خطوط نزدیک، محل ویرایش را پیدا کند. خروجی با زمینهٔ صفر برای یک بازبینی فشرده معتبر و مفید است، اما شواهد کمتری دربارهٔ جایی که مصرفکنندهٔ بعدی باید آن را اعمال کند به همراه دارد.
این یک مقایسهٔ متنی دوطرفه است، نه یک ادغام معنایی. از سازندهٔ فهرست مطالب مارکداون برای تولید یک سند استفاده کنید، سپس وقتی میخواهید هر لنگر و خط ناوبری درجشده را بررسی کنید، آن نتیجه را در اینجا مقایسه کنید.
مراحل انجام کار
- خطنوهای CRLF و CR تنها را به LF یکسانسازی کنید و ثبت کنید که آیا آخرین خط منطقی هر سند خطنوی پایانی دارد یا نه.
- یک ماتریس طولانیترین زیردنبالهٔ مشترک را روی متن کامل هر خط بهعلاوهٔ وضعیت پایان آن بسازید و هرگاه چند اسکریپت کمینه برابر باشند، حذف را بر درج مقدم بدارید.
- هر ویرایش را به اندازهٔ تعداد درخواستی خطوط زمینهٔ بدون تغییر گسترش دهید و محدودههایی را که به هم میرسند یا همپوشانی دارند در قطعههای دیف یکپارچه ادغام کنید.
- برچسبهای پاکسازیشدهٔ --- و +++، محدودههای دقیق @@ بهصورت شروع,تعداد و پیشوندهای فاصله، منها یا بهعلاوه را در یک پچ قابل دانلود بنویسید.
فرضها
- مقایسه خطی است و پس از یکسانسازی خطنو دقیق انجام میشود؛ تفاوتهای فضای خالی، بزرگی و کوچکی حروف و نرمالسازی یونیکد نادیده گرفته نمیشوند.
- هر طرف به ۲۰۰۰ نویسه محدود است تا ماتریس درجهدوم طولانیترین زیردنبالهٔ مشترک در مرورگر محدود بماند.
- ممکن است بیش از یک کمینهاسکریپت ویرایش وجود داشته باشد. تقدم حذف در برابریها این خروجی را تکرارپذیر میکند، اما از نظر ریاضی یگانه و ممتاز نیست.
- پچی که از نظر نحوی درست است همچنان میتواند روی فایل سومی که محتوای پیرامونش تغییر کرده شکست بخورد؛ این ابزار پچها را اعمال یا ادغام نمیکند.
پرسشهای رایج
چرا یک خط تغییریافته بهصورت یک حذف و یک افزودن نشان داده میشود؟
دیف یکپارچه رکوردهای خط زمینه، خط حذفشده و خط اضافهشده دارد، نه یک رکورد جایگزینی جداگانه. بنابراین یک جایگزینی، خط کامل قدیمی را حذف و خط جدید را اضافه میکند.
خطوط زمینه چه چیزی را تغییر میدهند؟
آنها مقدار محتوای بدون تغییر پیرامون یک ویرایش و این را که آیا نواحی نزدیک به هم در یک قطعه ادغام میشوند تغییر میدهند. افزودهها، حذفها یا کمینهاسکریپت ویرایش زیربنایی را تغییر نمیدهند.
آیا تفاوت در خطنوی پایانی به حساب میآید؟
بله. فایل متنیای که به `same` ختم میشود از نظر بایتی با فایلی که به `same` بهعلاوهٔ یک خطنو ختم میشود برابر نیست، بنابراین پچ نشانگر صریح متعارف را برای خط ناقص مینویسد.
آیا پچ میتواند مسیر یک پوشهٔ محلی را فاش کند؟
برچسب به آخرین جزء مسیرش کاهش مییابد و نویسههای کنترلی حذف میشوند. سرآیندها فقط از `a/label` و `b/label` استفاده میکنند، بدون مسیر دستگاه یا مهر زمانی.