| GIT-FORMAT-PATCH(1) | Git Manual | GIT-FORMAT-PATCH(1) |
نام (NAME)
git-format-patch - آمادهسازی وصلهها برای ارسال با ایمیل
خلاصه دستور (SYNOPSIS)
git format-patch [-k] [(-o|--output-directory) <dir> | --stdout]
[--no-thread | --thread[=<style>]]
[(--attach|--inline)[=<boundary>] | --no-attach]
[-s | --signoff]
[--signature=<signature> | --no-signature]
[--signature-file=<file>]
[-n | --numbered | -N | --no-numbered]
[--start-number <n>] [--numbered-files]
[--in-reply-to=<message-id>] [--suffix=.<sfx>]
[--ignore-if-in-upstream] [--always]
[--cover-from-description=<mode>]
[--rfc[=<rfc>]] [--subject-prefix=<subject-prefix>]
[(--reroll-count|-v) <n>]
[--to=<email>] [--cc=<email>]
[--[no-]cover-letter] [--quiet]
[--commit-list-format=<format-spec>]
[--[no-]encode-email-headers]
[--no-notes | --notes[=<ref>]]
[--interdiff=<previous>]
[--range-diff=<previous> [--creation-factor=<percent>]]
[--filename-max-length=<n>]
[--progress]
[<common-diff-options>]
[ <since> | <revision-range> ]
توضیحات (DESCRIPTION)
هر کامیت غیرادغام را به همراه «وصله» (patch) آن در قالب یک «پیام» در ازای هر کامیت آماده میکند که قالبی شبیه به صندوق پستی یونیکس (UNIX mailbox) دارد. خروجی این دستور برای ارسال با ایمیل یا استفاده با git am بسیار مناسب است.
یک «پیام» ایجادشده توسط این دستور از سه بخش تشکیل میشود:
پیام لاگ و وصله با خطی شامل سه خط تیره (---) از یکدیگر جدا میشوند.
دو روش برای تعیین اینکه دستور روی کدام کامیتها کار کند وجود دارد.
در صورت وجود یک <commit> منفرد، قاعده اول اولویت دارد. برای اعمال قاعده دوم، یعنی قالببندی همهچیز از ابتدای تاریخچه تا <commit>، از گزینه --root استفاده کنید: git format-patch --root <commit>. اگر میخواهید فقط خود <commit> را قالببندی کنید، میتوانید این کار را با git format-patch -1 <commit> انجام دهید.
به طور پیشفرض، هر فایل خروجی از ۱ به صورت متوالی شمارهگذاری میشود و از خط اول پیام کامیت (که برای ایمنی نام مسیر پردازش شده) به عنوان نام فایل استفاده میکند. با گزینه --numbered-files، نام فایلهای خروجی تنها عدد خواهند بود، بدون اینکه خط اول پیام کامیت به آن اضافه شود. نام فایلهای خروجی در خروجی استاندارد چاپ میشود، مگر اینکه گزینه --stdout مشخص شده باشد.
اگر -o مشخص شده باشد، فایلهای خروجی در <dir> ایجاد میشوند. در غیر این صورت در دایرکتوری کاری فعلی ایجاد خواهند شد. مسیر پیشفرض را میتوان با گزینه پیکربندی format.outputDirectory تنظیم کرد. گزینه -o بر format.outputDirectory اولویت دارد. برای ذخیره وصلهها در دایرکتوری کاری فعلی حتی زمانی که format.outputDirectory به جای دیگری اشاره دارد، از -o . استفاده کنید. تمام بخشهای دایرکتوری ساخته خواهند شد.
به طور پیشفرض، موضوع (subject) یک وصله تکی عبارت است از "[PATCH] " که پس از آن خطوط پیام کامیت تا اولین خط خالی قرار میگیرند (بخش بحث در git-commit(1) را ببینید).
هنگامی که چندین وصله در خروجی تولید میشوند، پیشوند موضوع در عوض "[PATCH n/m] " خواهد بود. برای اجبار به افزودن 1/1 برای یک تکوصله، از -n استفاده کنید. برای حذف شمارههای وصله از موضوع، از -N استفاده نمایید.
در صورت دادن --thread، دستور git-format-patch هدرهای In-Reply-To و References را تولید میکند تا ایمیلهای وصله دوم و بعدی به صورت پاسخی به اولین ایمیل نمایش داده شوند؛ این کار همچنین یک هدر Message-ID برای ارجاع ایجاد میکند.
گزینهها (OPTIONS)
-p, --no-stat
-U<n>, --unified=<n>
--output=<file>
--output-indicator-new=<char>, --output-indicator-old=<char>, --output-indicator-context=<char>
--indent-heuristic
--no-indent-heuristic
--minimal
--patience
--histogram
--anchored=<text>
این گزینه میتواند بیش از یک بار مشخص شود.
اگر خطی هم در مبدأ و هم در مقصد وجود داشته باشد، فقط یک بار تکرار شده باشد و با <text> شروع شود، این الگوریتم تلاش میکند تا از ظاهر شدن آن به عنوان حذف یا اضافه در خروجی جلوگیری کند. این گزینه به صورت درونی از الگوریتم "patience diff" استفاده میکند.
--diff-algorithm=(patience|minimal|histogram|myers)
default, myers
minimal
patience
histogram
برای نمونه، اگر متغیر diff.algorithm را روی مقداری غیرپیشفرض تنظیم کردهاید و میخواهید از مقدار پیشفرض استفاده کنید، باید از گزینه --diff-algorithm=default استفاده کنید.
--stat[=<width>[,<name-width>[,<count>]]]
این پارامترها را میتوان به طور جداگانه با --stat-width=<width>، --stat-name-width=<name-width> و --stat-count=<count> نیز تنظیم کرد.
--compact-summary
--numstat
--shortstat
-X [<param>,...], --dirstat[=<param>,...]
changes
lines
files
cumulative
<limit>
مثال: دستور زیر فایلهای تغییریافته را شمارش میکند، در حالی که دایرکتوریهای با کمتر از 10% کل فایلهای تغییریافته را نادیده میگیرد و شمارش دایرکتوری فرزند را در دایرکتوریهای والد تجمیع مینماید: --dirstat=files,10,cumulative.
--cumulative
--dirstat-by-file[=<param>,...]
--summary
--no-renames
--rename-empty, --no-rename-empty
--full-index
--binary
--abbrev[=<n>]
-B[<n>][/<m>], --break-rewrites[=[<n>][/<m>]]
تغییری را که به منزله بازنویسی کلی یک فایل است، نه به عنوان مجموعهای از حذف و درجهای آمیخته با چند خط که به طور متنی تطابق دارند، بلکه به صورت یک حذف کلی تمام موارد قدیمی و سپس یک درج کلی تمام موارد جدید نشان میدهد؛ و عدد <m> این جنبه از گزینه -B را کنترل میکند (به طور پیشفرض 60%). -B/70% مشخص میکند که کمتر از 30% از نسخه اصلی باید در نتیجه باقی بماند تا گیت آن را بازنویسی کامل تلقی کند (یعنی در غیر این صورت وصله حاصل مجموعهای از حذف و درجهای آمیخته با خطوط زمینه خواهد بود).
هنگامی که همراه با -M استفاده میشود، یک فایل کاملاً بازنویسیشده نیز به عنوان منبع یک تغییر نام در نظر گرفته میشود (معمولاً -M فقط فایلی را که ناپدید شده به عنوان منبع تغییر نام در نظر میگیرد)، و عدد <n> این جنبه از گزینه -B را کنترل میکند (به طور پیشفرض 50%). -B20% مشخص میکند تغییری با افزودن و حذف معادل 20% یا بیشتر از اندازه فایل، واجد شرایط است که به عنوان منبع احتمالی تغییر نام به فایلی دیگر در نظر گرفته شود.
-M[<n>], --find-renames[=<n>]
-C[<n>], --find-copies[=<n>]
--find-copies-harder
-D, --irreversible-delete
هنگامی که همراه با -B استفاده میشود، پیشتصویر را در بخش حذف یک جفت حذف/ایجاد نیز حذف میکند.
-l<num>
-O<orderfile>
ترتیب خروجی با ترتیب الگوهای glob در <orderfile> تعیین میشود. همه فایلهایی با نام مسیرهایی که با الگوی اول مطابقت دارند ابتدا خروجی داده میشوند، همه فایلهایی با نام مسیرهایی که با الگوی دوم (اما نه اول) مطابقت دارند بعدی هستند، و به همین ترتیب. همه فایلهایی با نام مسیرهایی که با هیچ الگویی مطابقت ندارند در انتها خروجی داده میشوند، گویی یک الگوی ضمنی تطابق با همهچیز در انتهای فایل وجود داشته است. اگر چند نام مسیر رتبه یکسانی داشته باشند (با همان الگو مطابقت داشته باشند اما با هیچ الگوی قبلی مطابقت نداشته باشند)، ترتیب خروجی آنها نسبت به یکدیگر همان ترتیب عادی است.
<orderfile> به صورت زیر تجزیه میشود:
الگوها همان نحو و معنای الگوهای مورد استفاده برای fnmatch(3) بدون فلگ FNM_PATHNAME را دارند، با این تفاوت که اگر حذف هر تعداد از مؤلفههای پایانی نام مسیر با الگو مطابقت داشته باشد، نام مسیر نیز با الگو مطابقت دارد. برای مثال، الگوی "foo*bar" با "fooasdfbar" و "foo/bar/baz/asdf" مطابقت دارد، اما با "foobarx" مطابقت ندارد.
--skip-to=<file>, --rotate-to=<file>
--relative[=<path>], --no-relative
-a, --text
--ignore-cr-at-eol
--ignore-space-at-eol
-b, --ignore-space-change
-w, --ignore-all-space
--ignore-blank-lines
-I<regex>, --ignore-matching-lines=<regex>
--inter-hunk-context=<number>
-W, --function-context
--ext-diff
--no-ext-diff
--textconv, --no-textconv
--ignore-submodules[=(none|untracked|dirty|all)]
--src-prefix=<prefix>
--dst-prefix=<prefix>
--no-prefix
--default-prefix
--line-prefix=<prefix>
--ita-invisible-in-index
--max-depth=<depth>
اگر هیچ pathspec مشخص نشود، عمق طوری سنجیده میشود که گویی تمام مدخلهای سطح بالا مشخص شدهاند. توجه داشته باشید که این با اندازهگیری از ریشه متفاوت است، به این ترتیب که --max-depth=0 همچنان foo را برمیگرداند. این به شما امکان میدهد در حالی که زیرمجموعهای از مدخلهای سطح بالا را درخواست میکنید، عمق را نیز محدود کنید.
توجه داشته باشید که این گزینه فقط برای diffهای میان اشیاء درخت پشتیبانی میشود، نه در برابر ایندکس یا درخت کاری.
برای توضیحات مفصلتر درباره این گزینههای مشترک، gitdiffcore(7) را نیز ببینید.
-<n>
-o <dir>, --output-directory <dir>
-n, --numbered
-N, --no-numbered
--start-number <n>
--numbered-files
-k, --keep-subject
-s, --signoff
--stdout
--attach[=<boundary>]
--no-attach
--inline[=<boundary>]
--thread[=<style>], --no-thread
آرگومان اختیاری <style> میتواند shallow یا deep باشد. shallow (سطحی) هر ایمیل را به پاسخی به سر سری (head) تبدیل میکند، که سر سری از میان نامه پوششی (cover letter)، --in-reply-to و اولین ایمیل وصله، به همین ترتیب انتخاب میشود. deep (عمیق) هر ایمیل را به پاسخی به ایمیل قبلی تبدیل میکند.
پیشفرض --no-thread است، مگر اینکه پیکربندی format.thread تنظیم شده باشد. --thread بدون آرگومان معادل --thread=shallow است.
توجه داشته باشید که پیشفرض git send-email این است که خودش ایمیلها را رشتهبندی کند. اگر میخواهید git format-patch رشتهبندی را انجام دهد، باید اطمینان حاصل کنید که رشتهبندی برای git send-email غیرفعال شده است.
--in-reply-to=<message-id>
--ignore-if-in-upstream
--always
--cover-from-description=<mode>
اگر <mode> برابر با message یا default باشد، موضوع نامه پوششی با متن جایگزین پر میشود. بدنه نامه پوششی با توضیحات شاخه پر خواهد شد. این حالت پیشفرض در صورت عدم تعیین پیکربندی یا گزینه خط فرمان است.
اگر <mode> برابر با subject باشد، اولین پاراگراف توضیحات شاخه موضوع نامه پوششی را پر میکند. بقیه توضیحات بدنه نامه پوششی را پر خواهد کرد.
اگر <mode> برابر با auto باشد، چنانچه اولین پاراگراف توضیحات شاخه بزرگتر از ۱۰۰ بایت باشد، حالت message خواهد بود، و در غیر این صورت subject استفاده میشود.
اگر <mode> برابر با none باشد، هم موضوع و هم بدنه نامه پوششی با متن جایگزین پر خواهند شد.
--description-file=<file>
--subject-prefix=<subject-prefix>
متغیر پیکربندی format.subjectPrefix نیز ممکن است برای پیکربندی یک پیشوند موضوع جهت اعمال روی تمام وصلههای یک مخزن مشخص استفاده شود. این معمولاً در لیستهای ایمیلی که وصلههای چندین مخزن را دریافت میکنند مفید است و میتواند برای ابهامزدایی از وصلهها به کار رود (مثلاً با مقداری مانند "PATCH my-project").
--filename-max-length=<n>
--rfc[=<rfc>]
عبارت RFC به معنای «درخواست برای نظرات» (Request For Comments) است؛ زمانی از این گزینه استفاده کنید که یک وصله آزمایشی را برای بحث و تبادل نظر ارسال میکنید و نه برای اعمال شدن. گزینه "--rfc=WIP" نیز ممکن است روش مفیدی برای نشان دادن این باشد که یک وصله هنوز کامل نشده است ("WIP" مخفف "Work In Progress" یا کار در حال انجام است).
اگر رسم جامعه دریافتکننده برای یک رشته اضافی خاص این باشد که بعد از پیشوند موضوع قرار گیرد، میتوان رشته <rfc> را با یک خط تیره ("-") شروع کرد تا نشان دهد بقیه رشته <rfc> باید به انتهای پیشوند موضوع اضافه شود، برای مثال، --rfc='-(WIP)' منجر به "PATCH (WIP)" میشود.
-v <n>, --reroll-count=<n>
--to=<email>
--cc=<email>
--from, --from=<ident>
توجه داشته باشید که این گزینه فقط در صورتی مفید است که واقعاً در حال ارسال ایمیلها باشید و بخواهید خود را به عنوان فرستنده معرفی کنید، اما نویسنده اصلی را حفظ نمایید (و git am به درستی هدر درون بدنه را برمیدارد). همچنین توجه داشته باشید که git send-email قبلاً این تبدیل را برای شما انجام میدهد، و اگر خروجی را به git send-email میدهید نباید از این گزینه استفاده شود.
--force-in-body-from, --no-force-in-body-from
--add-header=<header>
--cover-letter, --no-cover-letter
--commit-list-format=<format-spec>
--encode-email-headers, --no-encode-email-headers
--interdiff=<previous>
--range-diff=<previous>
توجه داشته باشید که گزینههای diff ارسالشده به دستور بر چگونگی تولید محصول اصلی format-patch تأثیر میگذارند، و به مکانیزم زیرین range-diff که برای تولید محتوای نامه پوششی استفاده میشود ارسال نمیشوند (این ممکن است در آینده تغییر کند).
--creation-factor=<percent>
مقدار پیشفرض 999 است (دستور git-range-diff(1) از 60 استفاده میکند)، زیرا کاربرد در اینجا نمایش مقایسه با تکرار قدیمیتر از همان موضوع است و ابزار باید تطابق بیشتری بین دو مجموعه وصله پیدا کند.
--notes[=<ref>], --no-notes
مورد استفاده مورد انتظار از این گزینه، نوشتن توضیحات پشتیبان برای کامیت است که به خود پیام لاگ کامیت تعلق ندارد، و گنجاندن آن در ارسال وصله است. در حالی که فرد میتواند به سادگی این توضیحات را پس از اجرای format-patch اما پیش از ارسال بنویسد، نگه داشتن آنها به عنوان یادداشتهای گیت اجازه میدهد تا میان نسخههای مختلف سری وصله حفظ شوند (اما برای استفاده از این گردش کار، بحث گزینههای پیکربندی notes.rewrite را در git-notes(1) ببینید).
پیشفرض --no-notes است، مگر اینکه پیکربندی format.notes تنظیم شده باشد.
--signature=<signature>, --no-signature
--signature-file=<file>
--suffix=.<sfx>
توجه داشته باشید که نویسه آغازین لازم نیست نقطه باشد؛ برای مثال، میتوانید از --suffix=-patch برای به دست آوردن 0001-description-of-my-change-patch استفاده کنید.
-q, --quiet
--no-binary
--zero-commit
--no-base, --base[=<commit>]
--root
--progress
پیکربندی (CONFIGURATION)
شما میتوانید خطوط هدر اضافی ایمیل برای اضافه شدن به هر پیام، مقادیر پیشفرض برای پیشوند موضوع و پسوند فایل، شمارهگذاری وصلهها هنگام خروجی دادن بیش از یک وصله، افزودن هدرهای "To:" یا "Cc:"، پیکربندی پیوستها، تغییر دایرکتوری خروجی وصله، و امضا کردن (sign off) وصلهها را با متغیرهای پیکربندی مشخص کنید.
[format]
headers = "Organization: git-foo\n"
subjectPrefix = CHANGE
suffix = .txt
numbered = auto
to = <email>
cc = <email>
attach [ = mime-boundary-string ]
signOff = true
outputDirectory = <directory>
coverLetter = auto
commitListFormat = shortlog
coverFromDescription = auto
بحث (DISCUSSION)
وصله تولیدشده توسط git format-patch در قالب صندوق پستی یونیکس (UNIX mailbox) است، با یک مهر زمانی ثابت و جادویی ("magic") برای نشان دادن اینکه فایل خروجی format-patch است و نه یک صندوق پستی واقعی، به این صورت:
From 8f72bad1baf19a53459661343e21d6491c3908d3 Mon Sep 17 00:00:00 2001 From: Tony Luck <tony.luck@intel.com> Date: Tue, 13 Jul 2010 11:42:54 -0700 Subject: [PATCH] =?UTF-8?q?[IA64]=20Put=20ia64=20config=20files=20on=20the=20?= =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig=20diet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit arch/arm config files were slimmed down using a python script (See commit c2330e286f68f1c408b4aa6515ba49d57f05beae comment) Do the same for ia64 so we can have sleek & trim looking ...
به طور معمول این فایل در پوشه پیشنویسهای (drafts) نرمافزار MUA قرار میگیرد، ویرایش میشود تا توضیحات بهموقع که نباید بعد از سه خط تیره در گزارش تغییرات قرار گیرند به آن اضافه شوند، و سپس به عنوان پیامی ارسال میشود که بدنه آن، در مثال ما، با "arch/arm config files were..." شروع میشود. در سمت دریافتکننده، خوانندگان میتوانند وصلههای جالب را در یک صندوق پستی یونیکس ذخیره کرده و آنها را با git-am(1) اعمال کنند.
هنگامی که یک وصله بخشی از یک بحث ادامهدار است، وصله تولیدشده توسط git format-patch میتواند طوری تنظیم شود که از ویژگی git am --scissors بهرهمند شود. پس از پاسخ شما به بحث، خطی میآید که صرفاً شامل "-- >8 --" (قیچی و خط برش) است، و پس از آن وصله با حذف فیلدهای هدر غیرضروری قرار میگیرد:
... > So we should do such-and-such. Makes sense to me. How about this patch? -- >8 -- Subject: [IA64] Put ia64 config files on the Uwe Kleine-König diet arch/arm config files were slimmed down using a python script ...
هنگام ارسال وصله به این روش، اغلب شما در حال ارسال وصله خودتان هستید، بنابراین علاوه بر نشانگر "From $SHA1 $magic_timestamp"، باید خطوط From: و Date: را از فایل وصله حذف کنید. عنوان وصله احتمالاً با موضوع بحثی که وصله در پاسخ به آن است تفاوت دارد، بنابراین به احتمال زیاد میخواهید خط Subject: را مانند مثال بالا حفظ کنید.
بررسی خرابی وصله
بسیاری از نرمافزارهای ایمیل در صورت عدم تنظیم مناسب، فاصلههای خالی را خراب میکنند. در اینجا دو نوع خرابی رایج آورده شده است:
یک روش برای آزمایش اینکه آیا MUA شما به درستی تنظیم شده است یا خیر:
$ git fetch <project> master:test-apply $ git switch test-apply $ git restore --source=HEAD --staged --worktree :/ $ git am a.patch
اگر به درستی اعمال نشد، دلایل مختلفی میتواند داشته باشد.
نکات ویژه کلاینتهای ایمیل (MUA-SPECIFIC HINTS)
در اینجا نکاتی درباره نحوه ارسال موفقیتآمیز وصلهها به صورت درونمتنی (inline) با استفاده از برنامههای مختلف ایمیل آورده شده است.
جیمیل (GMail)
جیمیل هیچ راهی برای خاموش کردن شکستن خودکار خطوط (line wrapping) در رابط وب ندارد، بنابراین هر ایمیلی را که ارسال میکنید مخدوش خواهد کرد. با این حال میتوانید از "git send-email" استفاده کرده و وصلههای خود را از طریق سرور SMTP جیمیل ارسال کنید، یا از هر کلاینت ایمیل IMAP برای اتصال به سرور IMAP گوگل استفاده کرده و ایمیلها را از طریق آن فوروارد نمایید.
برای نکاتی درباره استفاده از git send-email جهت ارسال وصلههایتان از طریق سرور SMTP جیمیل، بخش مثال در git-send-email(1) را ببینید.
برای نکاتی درباره ارسال با استفاده از رابط IMAP، بخش مثال در git-imap-send(1) را ببینید.
تاندربرد (Thunderbird)
به طور پیشفرض، تاندربرد هم خطوط ایمیل را میشکند و هم آنها را به عنوان format=flowed علامتگذاری میکند، که هر دوی اینها ایمیل حاصل را برای گیت غیرقابل استفاده میکنند.
سه رویکرد مختلف وجود دارد: استفاده از یک افزونه برای خاموش کردن شکستن خطوط، پیکربندی تاندربرد برای عدم مخدوش کردن وصلهها، یا استفاده از یک ویرایشگر خارجی برای جلوگیری از مخدوش شدن وصلهها توسط تاندربرد.
رویکرد ۱
(افزونه)
افزونه Toggle Line Wrap را که از نشانی https://addons.thunderbird.net/thunderbird/addon/toggle-line-wrap در دسترس است نصب کنید. این افزونه دکمهای به نام "Line Wrap" به نوار ابزار ایجاد پیام اضافه میکند که میتوانید آن را غیرفعال کنید. اکنون میتوانید پیام را به همان روش معمول خود بسازید (برش + چسباندن، git format-patch | git imap-send و غیره)، اما باید شکستگی خطوط را به صورت دستی در هر متنی که تایپ میکنید درج نمایید.
به عنوان یک ویژگی اضافی، افزونه میتواند متن وصله را در پنجره ایجاد پیام تشخیص دهد و زمانی که شکستن خط هنوز خاموش نشده باشد، هشدار دهد.
این افزونه به چند تغییر جزئی در پیکربندی پیشرفته (about:config) نیاز دارد که این موارد در صفحه دانلود فهرست شدهاند.
رویکرد ۲
(پیکربندی)
سه مرحله:
در Thunderbird 2: مسیر Edit..Preferences..Composition، مقدار wrap plain text messages را روی 0 تنظیم کنید.
در Thunderbird 3: مسیر Edit..Preferences..Advanced..Config Editor. عبارت "mail.wrap_long_lines" را جستجو کنید. آن را تغییر دهید تا مطمئن شوید روی false تنظیم شده است. همچنین "mailnews.wraplength" را جستجو کرده و مقدار آن را روی 0 قرار دهید.
پس از انجام این کار، باید بتوانید ایمیل را همانطور که معمولاً انجام میدادید ایجاد کنید (برش + چسباندن، git format-patch | git imap-send و غیره) و وصلهها مخدوش نخواهند شد.
رویکرد ۳
(ویرایشگر
خارجی)
افزونههای زیر برای تاندربرد مورد نیاز هستند: AboutConfig از https://mjg.github.io/AboutConfig و External Editor از https://globs.org/articles.php?lng=en&pg=8
mailnews.send_plaintext_flowed => false mailnews.wraplength => 0
نکته حاشیهای: ممکن است بتوان مرحله ۲ را با about:config و تنظیمات زیر انجام داد، اما هنوز کسی آن را امتحان نکرده است.
mail.html_compose => false mail.identity.default.compose_html => false mail.identity.id?.compose_html => false
اسکریپتی در contrib/thunderbird-patch-inline وجود دارد که میتواند به شما کمک کند تا وصلهها را به روشی آسان در تاندربرد بگنجانید. برای استفاده از آن، مراحل بالا را انجام دهید و سپس از این اسکریپت به عنوان ویرایشگر خارجی استفاده کنید.
کیمیل (KMail)
این بخش به شما کمک میکند تا با استفاده از KMail وصلهها را به صورت درونمتنی (inline) ارسال کنید.
اطلاعات درخت پایه (BASE TREE INFORMATION)
بلوک اطلاعات درخت پایه توسط نگهدارندهها یا آزمایشکنندگان شخص ثالث استفاده میشود تا وضعیت دقیقی را که سری وصله روی آن اعمال میشود بدانند. این بلوک شامل کامیت پایه است که یک کامیت شناختهشده و بخشی از بخش پایدار تاریخچه پروژه است که سایر افراد کار خود را بر پایه آن بنا میکنند، و صفر یا چند وصله پیشنیاز، که وصلههای شناختهشده در حال پیشرفت هستند که هنوز بخشی از کامیت پایه نیستند و باید روی کامیت پایه به ترتیب توپولوژیکی اعمال شوند تا بتوان این وصلهها را اعمال کرد.
کامیت پایه به صورت "base-commit: " و به دنبال آن نام شیء کامیت به صورت هگزادسیمال ۴۰ رقمی نشان داده میشود. یک وصله پیشنیاز به صورت "prerequisite-patch-id: " و به دنبال آن شناسه وصله ۴۰ رقمی نشان داده میشود، که میتوان آن را با ارسال وصله به دستور git patch-id --stable به دست آورد.
تصور کنید که روی کامیت عمومی P، وصلههای شناختهشده X، Y و Z را از شخص دیگری اعمال کردهاید، و سپس سری سه وصلهای خود یعنی A، B و C را ساختهاید؛ تاریخچه به این شکل خواهد بود:
---P---X---Y---Z---A---B---C
با git format-patch --base=P -3 C (یا گونههای دیگر آن، مثلاً با --cover-letter یا با استفاده از Z..C به جای -3 C برای مشخص کردن محدوده)، بلوک اطلاعات درخت پایه در انتهای اولین پیامی که دستور خروجی میدهد (یا اولین وصله، یا نامه پوششی) به این صورت نشان داده میشود:
base-commit: P prerequisite-patch-id: X prerequisite-patch-id: Y prerequisite-patch-id: Z
برای توپولوژی غیرخطی، مانند
---P---X---A---M---C
\ /
Y---Z---B
همچنین میتوانید از git format-patch --base=P -3 C برای تولید وصلههای A، B و C استفاده کنید، و شناسههای P، X، Y و Z به انتهای اولین پیام پیوست میشوند.
اگر --base=auto در خط فرمان تنظیم شود، کامیت پایه به طور خودکار به عنوان پایه ادغامِ (merge base) کامیت نوک شاخه ردیابی از راه دور و محدوده بازنگری مشخصشده در خط فرمان محاسبه میشود. برای یک شاخه محلی، پیش از استفاده از این گزینه باید با git branch --set-upstream-to آن را طوری تنظیم کنید که یک شاخه از راه دور را ردیابی کند.
مثالها (EXAMPLES)
$ git format-patch -k --stdout R1..R2 | git am -3 -k
$ git format-patch origin
برای هر کامیت یک فایل جداگانه در دایرکتوری فعلی ایجاد میشود.
$ git format-patch --root origin
$ git format-patch -M -B origin
علاوه بر این، تغییر نامها و بازنویسیهای کامل را به طور هوشمندانه تشخیص داده و مدیریت میکند تا یک وصله تغییر نام تولید نماید. یک وصله تغییر نام مقدار متن خروجی را کاهش میدهد و به طور کلی بازبینی آن را آسانتر میکند. توجه داشته باشید که برنامههای "patch" غیر از گیت، وصلههای تغییر نام را متوجه نمیشوند، بنابراین فقط زمانی از آن استفاده کنید که میدانید دریافتکننده از گیت برای اعمال وصله شما استفاده میکند.
$ git format-patch -3
هشدارها (CAVEATS)
توجه داشته باشید که format-patch کامیتهای ادغام را از خروجی حذف میکند، حتی اگر بخشی از محدوده درخواستی باشند. یک "وصله" ساده شامل اطلاعات کافی برای سمت دریافتکننده جهت بازتولید همان کامیت ادغام نیست.
اعمال وصله (PATCH APPLICATION)
خروجی حاصل از git-format-patch(1) هنگامی که با git-am(1) اعمال میشود میتواند به پیام کامیت متفاوتی منجر گردد. وصلهای که اعمال میشود نیز ممکن است با وصلهای که تولید شده بود تفاوت داشته باشد، یا اعمال وصله ممکن است کاملاً با شکست مواجه شود.
هر خطی که به شکل:
باشد، به عنوان شروع یک وصله در نظر گرفته میشود و پیام گزارش کامیت قبل از اولین وقوع چنین خطی خاتمه مییابد.
توجه داشته باشید که این به ویژه برای diffهای فاقد تورفتگی که در پیام کامیت رخ میدهند مشکلساز است؛ diff موجود در پیام کامیت ممکن است همراه با بخش وصله اعمال شود، یا سازوکار اعمال وصله ممکن است دچار خطا شود زیرا هدف وصله اعمال نمیشود. این میتواند به عنوان مثال به دلیل یک diff در یک بلوک کد Markdown رخ دهد.
راه حل این موضوع، ایجاد تورفتگی برای diff یا سایر متونی است که میتوانند مشکل ایجاد کنند.
این کاهش دقت ممکن است در صورت اعمال مستقیم وصلهها از صندوق پستی به سادگی قابل توجه باشد. با این حال، تغییرات منشأگرفته از گیت میتوانند به صورت دستهای اعمال شوند، که در این صورت توجه به آن بسیار دشوارتر خواهد بود. این میتواند برای مثال یک توزیع لینوکس باشد که از فایلهای وصله برای اعمال تغییرات بر روی کامیتهای مخازن بالادستی استفاده میکند. این نشان میدهد که این رفتار تنها بر جریانهای کاری ایمیل تأثیر نمیگذارد.
با توجه به این محدودیتها، ممکن است فرد وسوسه شود به جای آن از یک ابزار عمومی مانند patch(1) استفاده کند. با این حال، patch(1) نه تنها به دنبال diffهای فاقد تورفتگی میگردد (مانند git-am(1))، بلکه تلاش میکند diffهای دارای تورفتگی را نیز اعمال کند.
همچنین ببینید (SEE ALSO)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |