GIT-INTERPRET-TRAILERS(1) Git Manual GIT-INTERPRET-TRAILERS(1)

git-interpret-trailers - افزودن یا تجزیه اطلاعات ساختاریافته در انتهای پیام کامیت

git interpret-trailers [--in-place] [--trim-empty]
                        [(--trailer (<key>|<key-alias>)[(=|:)<value>])...]
                        [--parse] [<file>...]

افزودن یا تجزیه خطوط دنباله (trailer) که ساختاری مشابه با سرآیندهای ایمیل در RFC 822 دارند، در انتهای بخش آزاد پیام کامیت. برای نمونه، در پیام کامیت زیر:

subject
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Signed-off-by: Alice <alice@example.com>
Signed-off-by: Bob <bob@example.com>

دو خط پایانی که با Signed-off-by آغاز می‌شوند، دنباله (trailer) هستند.

این دستور پیام‌های کامیت را از آرگومان‌های <file> یا در صورت عدم تعیین <file>، از ورودی استاندارد می‌خواند. اگر --parse مشخص شود، خروجی شامل دنباله‌های تجزیه‌شده از ورودی خواهد بود، بدون آنکه گزینه‌های خط فرمان یا متغیرهای پیکربندی بر آن‌ها تاثیری بگذارند.

در غیر این صورت، این دستور متغیرهای پیکربندی trailer.<key-alias> (که می‌توانند دنباله‌های جدید اضافه کرده یا جایگاه آن‌ها را تغییر دهند) و همچنین آرگومان‌های خط فرمان را که می‌توانند متغیرهای پیکربندی را بازنویسی کنند (مانند --trailer=... که آن هم می‌تواند دنباله‌های جدید بیفزاید)، روی هر فایل ورودی اعمال می‌کند. نتیجه در خروجی استاندارد منتشر می‌شود.

این دستور همچنین می‌تواند بر روی خروجی git-format-patch(1) عمل کند، که ساختاری غنی‌تر از یک پیام کامیت ساده دارد. مشخصاً چنین خروجی‌ای شامل یک پیام کامیت (همانند بالا)، یک خط جداکننده --- و یک بخش وصله (patch) است. برای این ورودی‌ها، بخش جداکننده و وصله توسط این دستور تغییر نمی‌کنند و همان‌گونه که هستند در خروجی منتشر می‌شوند، مگر اینکه --no-divider تعیین شده باشد.

برخی متغیرهای پیکربندی نحوه اعمال آرگومان‌های --trailer روی هر ورودی و نحوه تغییر هر دنباله موجود در ورودی را کنترل می‌کنند. این متغیرها همچنین افزودن خودکار برخی دنباله‌ها را امکان‌پذیر می‌سازند.

به‌طور پیش‌فرض، یک آرگومان <key>=<value> یا <key>:<value> که با استفاده از --trailer داده می‌شود، تنها در صورتی پس از دنباله‌های موجود الحاق خواهد شد که آخرین دنباله دارای جفت (<key>, <value>) متفاوتی باشد (یا اگر هیچ دنباله‌ای از قبل وجود نداشته باشد). بخش‌های <key> و <value> برای حذف فاصله‌های خالی ابتدا و انتها پیراسته (trim) می‌شوند و مقادیر پیراسته‌شده حاصل در خروجی به این صورت نمایش داده خواهند شد:

key: value

این بدان معنی است که <key> و <value> پیراسته با ": " (یک دو‌نقطه و به دنبال آن یک فاصله) از یکدیگر جدا می‌شوند.

برای راحتی، می‌توان یک <key-alias> (نام مستعار کلید) را پیکربندی کرد تا تایپ گزینه --trailer در خط فرمان کوتاه‌تر شود. این کار را می‌توان با متغیر پیکربندی trailer.<key-alias>.key انجام داد. مقدار <key-alias> باید یک پیشوند از رشته کامل <key> باشد، هرچند بزرگی و کوچکی حروف اهمیتی ندارد. برای نمونه، اگر در پیکربندی خود مقدار زیر را داشته باشید:

trailer.sign.key "Signed-off-by: "

کافی است در خط فرمان عبارت --trailer="sign: foo" را به جای --trailer="Signed-off-by: foo" مشخص کنید.

به‌طور پیش‌فرض دنباله جدید در انتهای تمام دنباله‌های موجود قرار می‌گیرد. اگر دنباله‌ای از قبل وجود نداشته باشد، دنباله جدید در انتهای ورودی ظاهر می‌شود. اگر از قبل خط خالی وجود نداشته باشد، یک خط خالی پیش از دنباله جدید اضافه خواهد شد.

دنباله‌های موجود با جستجوی گروهی از یک یا چند خط در ورودی استخراج می‌شوند که یا (i) تماماً دنباله باشند، یا (ii) شامل دست‌کم یک دنباله تولیدشده توسط گیت یا پیکربندی‌شده توسط کاربر بوده و حداقل ۲۵٪ آن از دنباله‌ها تشکیل شده باشد. پیش از این گروه باید یک یا چند خط خالی (یا فقط حاوی فاصله‌های سفید) وجود داشته باشد. این گروه یا باید در انتهای ورودی باشد یا آخرین خطوط غیرخالی پیش از خطی باشد که با --- شروع می‌شود (به همراه یک فاصله یا پایان خط).

هنگام خواندن دنباله‌ها، نمی‌تواند هیچ فاصله خالی قبل یا درون <key> وجود داشته باشد، اما هر تعداد کاراکتر فاصله معمولی و تب (tab) میان <key> و جداکننده مجاز است. قبل، درون یا بعد از <value> می‌تواند فضای خالی وجود داشته باشد. مقدار <value> ممکن است در چند خط امتداد یابد به‌طوری‌که هر خط بعدی با حداقل یک فاصله سفید آغاز شود، مشابه سازوکار "تازدن" (folding) در سرآیندهای RFC 822. مثال:

key: This is a very long value, with spaces and
  newlines in it.

توجه داشته باشید که دنباله‌ها از بسیاری از قوانین سرآیندهای RFC 822 پیروی نمی‌کنند (و هدف آن نیز پیروی از آن‌ها نیست). برای نمونه، از قاعده کدگذاری (encoding) پیروی نمی‌کنند.

--in-place, --no-in-place

ویرایش درجا (in-place) فایل‌ها. مقدار پیش‌فرض --no-in-place است.

--trim-empty, --no-trim-empty

اگر بخش <value> هر دنباله فقط شامل فاصله‌های خالی باشد، کل دنباله از خروجی حذف خواهد شد. این موضوع هم بر روی دنباله‌های موجود و هم دنباله‌های جدید اعمال می‌شود.

مقدار پیش‌فرض --no-trim-empty است.

--trailer=<key>[(=|:)<value>], --no-trailer

یک جفت (<key>, <value>) را مشخص می‌کند که باید به عنوان یک دنباله بر روی ورودی‌ها اعمال شود. به توضیحات این دستور مراجعه کنید. این گزینه می‌تواند چندین بار مشخص شود.

از گزینه --no-trailer برای بازنشانی فهرست استفاده کنید.

--where=<placement>, --no-where

محل اضافه شدن همه دنباله‌های جدید را مشخص می‌کند. مقداری که با گزینه --where تعیین شود، متغیر پیکربندی trailer.where و هر متغیر قابل اعمال trailer.<key-alias>.where را بازنویسی کرده و تا رخداد بعدی --where یا --no-where بر تمام گزینه‌های --trailer اعمال خواهد شد. موقعیت‌های مجاز عبارتند از: after، before، end یا start.

از گزینه --no-where برای پاک کردن اثر استفاده قبلی از --where استفاده کنید، به نحوی که متغیرهای پیکربندی مربوطه دیگر بازنویسی نشوند.

--if-exists=<action>, --no-if-exists

اقدامی را مشخص می‌کند که در صورت وجود حداقل یک دنباله با همان <key> در ورودی انجام خواهد شد. مقداری که با --if-exists تعیین شود، متغیر پیکربندی trailer.ifExists و هر متغیر قابل اعمال trailer.<key-alias>.ifExists را بازنویسی کرده و تا رخداد بعدی --if-exists یا --no-if-exists بر تمام گزینه‌های --trailer اعمال خواهد شد. اقدامات مجاز عبارتند از: addIfDifferent، addIfDifferentNeighbor، add، replace و doNothing.

از گزینه --no-if-exists برای پاک کردن اثر استفاده قبلی از --if-exists استفاده کنید، به گونه‌ای که متغیرهای پیکربندی مربوطه دیگر بازنویسی نشوند.

--if-missing=<action>, --no-if-missing

اقدامی را مشخص می‌کند که در صورت عدم وجود هیچ دنباله دیگری با همان <key> در ورودی انجام خواهد شد. مقداری که با --if-missing تعیین شود، متغیر پیکربندی trailer.ifMissing و هر متغیر قابل اعمال trailer.<key-alias>.ifMissing را بازنویسی کرده و تا رخداد بعدی --if-missing یا --no-if-missing بر تمام گزینه‌های --trailer اعمال خواهد شد. اقدامات مجاز عبارتند از: doNothing یا add.

از گزینه --no-if-missing برای پاک کردن اثر استفاده قبلی از --if-missing استفاده کنید، به نحوی که متغیرهای پیکربندی مربوطه دیگر بازنویسی نشوند.

--only-trailers, --no-only-trailers

تنها دنباله‌ها چاپ شوند و هیچ بخش دیگری از ورودی در خروجی قرار نگیرد. مقدار پیش‌فرض --no-only-trailers است.

--only-input, --no-only-input

تنها دنباله‌هایی که در ورودی وجود دارند در خروجی قرار گیرند؛ هیچ دنباله‌ای از خط فرمان یا با اعمال متغیرهای پیکربندی trailer.<key-alias> اضافه نشود. مقدار پیش‌فرض --no-only-input است.

--unfold, --no-unfold

اگر یک دنباله دارای مقداری باشد که در چند خط امتداد یافته است (اصطلاحاً تاخورده یا "folded")، مقدار آن را به صورت یک خط واحد بازآرایی می‌کند. مقدار پیش‌فرض --no-unfold است.

--parse

یک نام مستعار کاربردی برای ترکیب گزینه‌های --only-trailers، --only-input و --unfold. این گزینه دیدن دنباله‌های استخراج‌شده از ورودی را بدون تاثیرپذیری از گزینه‌های خط فرمان یا متغیرهای پیکربندی ساده‌تر می‌کند، و همزمان با --unfold خروجی را برای خوانش ماشین سازگار می‌سازد.

هیچ گزینه‌ای برای لغو یا بی‌اثر کردن این نام مستعار وجود ندارد.

--divider, --no-divider

خط --- را به عنوان پایان پیام کامیت در نظر می‌گیرد. این رفتار پیش‌فرض است. از گزینه --no-divider زمانی استفاده کنید که اطمینان دارید ورودی تنها شامل خود پیام کامیت است (و نه یک ایمیل یا خروجی حاصل از git-format-patch(1)).

تمامی موارد زیر در این بخش به طور گزینش‌شده از مستندات git-config(1) درج شده‌اند. محتوا با آنچه در آنجا موجود است یکسان است:

trailer.separators

این گزینه مشخص می‌کند چه نویسه‌هایی به عنوان جداکننده دنباله شناخته شوند. به‌طور پیش‌فرض تنها : به عنوان جداکننده دنباله شناخته می‌شود، با این استثنا که = همیشه برای سازگاری با سایر دستورات گیت در خط فرمان پذیرفته می‌شود.

نخستین نویسه ارائه‌شده در این گزینه، نویسه پیش‌فرضی خواهد بود که در صورت عدم تعیین جداکننده دیگری در پیکربندی برای این دنباله، استفاده می‌شود.

برای نمونه، اگر مقدار این گزینه %=$ باشد، تنها خطوطی با قالب <key><sep><value> که در آن‌ها <sep> شامل %، = یا $ و سپس فاصله باشد، به عنوان دنباله در نظر گرفته می‌شوند. و % جداکننده پیش‌فرضی خواهد بود که استفاده می‌شود، بنابراین به‌طور پیش‌فرض دنباله‌ها به این صورت ظاهر می‌شوند: <key>% <value> (یک علامت درصد و یک فاصله بین کلید و مقدار قرار خواهد گرفت).

trailer.where

این گزینه مشخص می‌کند دنباله جدید در کجا افزوده شود.

این مقدار می‌تواند end (که پیش‌فرض است)، start، after یا before باشد.

اگر مقدار آن end باشد، هر دنباله جدید در انتهای دنباله‌های موجود قرار خواهد گرفت.

اگر مقدار آن start باشد، هر دنباله جدید به جای انتها، در آغاز دنباله‌های موجود ظاهر می‌شود.

اگر مقدار آن after باشد، هر دنباله جدید دقیقاً پس از آخرین دنباله با همان <key> قرار خواهد گرفت.

اگر مقدار آن before باشد، هر دنباله جدید دقیقاً پیش از نخستین دنباله با همان <key> قرار خواهد گرفت.

trailer.ifexists

این گزینه امکان انتخاب اقدامی را فراهم می‌کند که در صورت وجود دست‌کم یک دنباله با همان <key> در ورودی انجام شود.

مقادیر معتبر برای این گزینه عبارتند از: addIfDifferentNeighbor (که پیش‌فرض است)، addIfDifferent، add، replace یا doNothing.

با مقدار addIfDifferentNeighbor، یک دنباله جدید تنها در صورتی اضافه می‌شود که هیچ دنباله‌ای با همان جفت (<key>, <value>) در خط بالا یا پایین موقعیتی که دنباله جدید قرار است در آن اضافه شود وجود نداشته باشد.

با مقدار addIfDifferent، یک دنباله جدید تنها در صورتی اضافه می‌شود که هیچ دنباله‌ای با همان جفت (<key>, <value>) از قبل در ورودی موجود نباشد.

با مقدار add، یک دنباله جدید اضافه می‌شود، حتی اگر دنباله‌هایی با همان جفت (<key>, <value>) از قبل در ورودی موجود باشند.

با مقدار replace، یک دنباله موجود با همان <key> حذف شده و دنباله جدید افزوده خواهد شد. دنباله حذف‌شده نزدیک‌ترین دنباله (با همان <key>) به موقعیتی خواهد بود که دنباله جدید در آن اضافه می‌شود.

با مقدار doNothing، هیچ عملی صورت نخواهد گرفت؛ یعنی اگر از قبل دنباله‌ای با همان <key> در ورودی باشد، هیچ دنباله جدیدی اضافه نمی‌شود.

trailer.ifmissing

این گزینه امکان انتخاب اقدامی را فراهم می‌کند که در صورت عدم وجود هیچ دنباله‌ای با همان <key> در ورودی انجام شود.

مقادیر مجاز برای این گزینه عبارتند از: add (که پیش‌فرض است) و doNothing.

با مقدار add، یک دنباله جدید اضافه خواهد شد.

با مقدار doNothing، هیچ اقدامی صورت نخواهد گرفت.

trailer.<key-alias>.key

یک <key-alias> (نام مستعار کلید) برای <key> تعریف می‌کند. مقدار <key-alias> باید پیشوندی (بدون توجه به بزرگی یا کوچکی حروف) از <key> باشد. برای نمونه، در دستور git config trailer.ack.key "Acked-by" مقدار Acked-by همان <key> است و ack همان <key-alias> است. این پیکربندی استفاده از فراخوانی کوتاه‌تر --trailer "ack:..." را در خط فرمان با استفاده از نام مستعار "ack" به جای فرم طولانی‌تر --trailer "Acked-by:..." میسر می‌سازد.

در انتهای <key>، یک جداکننده و سپس چند نویسه فاصله می‌تواند قرار گیرد. به‌طور پیش‌فرض تنها جداکننده معتبر : است، اما این رفتار را می‌توان با متغیر پیکربندی trailer.separators تغییر داد.

اگر یک جداکننده در کلید وجود داشته باشد، هنگام افزودن دنباله، جداکننده پیش‌فرض را بازنویسی می‌کند.

trailer.<key-alias>.where

این گزینه همان مقادیر متغیر پیکربندی trailer.where را می‌پذیرد و آنچه را که توسط آن گزینه تعیین شده است برای دنباله‌هایی با <key-alias> مشخص‌شده بازنویسی می‌کند.

trailer.<key-alias>.ifexists

این گزینه همان مقادیر متغیر پیکربندی trailer.ifexists را می‌پذیرد و آنچه را که توسط آن گزینه تعیین شده است برای دنباله‌هایی با <key-alias> مشخص‌شده بازنویسی می‌کند.

trailer.<key-alias>.ifmissing

این گزینه همان مقادیر متغیر پیکربندی trailer.ifmissing را می‌پذیرد و آنچه را که توسط آن گزینه تعیین شده است برای دنباله‌هایی با <key-alias> مشخص‌شده بازنویسی می‌کند.

trailer.<key-alias>.command

منسوخ‌شده به نفع trailer.<key-alias>.cmd. این گزینه مشابه با trailer.<key-alias>.cmd رفتار می‌کند، به جز اینکه هیچ آرگومانی را به دستور مشخص‌شده ارسال نمی‌کند. در عوض، نخستین رخداد زیررشته $ARG با <value> که قرار بود به عنوان آرگومان ارسال شود جایگزین می‌شود.

توجه داشته باشید که $ARG در دستور کاربر تنها یک بار جایگزین می‌شود و روش اولیه جایگزینی $ARG ایمن نیست.

هنگامی که هر دو گزینه trailer.<key-alias>.cmd و trailer.<key-alias>.command برای یک <key-alias> مشابه داده شوند، trailer.<key-alias>.cmd مورد استفاده قرار می‌گیرد و trailer.<key-alias>.command نادیده گرفته می‌شود.

trailer.<key-alias>.cmd

این گزینه می‌تواند برای تعیین یک دستور شل استفاده شود که یک بار برای افزودن خودکار یک دنباله با <key-alias> مشخص‌شده فراخوانی می‌شود، و سپس هر بار که یک آرگومان --trailer <key-alias>=<value> تعیین شود، فراخوانی می‌گردد تا <value> دنباله‌ای را که این گزینه تولید می‌کرد اصلاح کند.

هنگامی که دستور مشخص‌شده برای نخستین بار جهت افزودن یک دنباله با <key-alias> تعیین‌شده فراخوانی می‌شود، رفتار به گونه‌ای است که گویی یک آرگومان ویژه --trailer <key-alias>=<value> در ابتدای فراخوانی git-interpret-trailers(1) اضافه شده باشد، که در آن <value> خروجی استاندارد دستور پس از پیراستن فاصله‌های سفید ابتدا و انتها در نظر گرفته می‌شود.

اگر تعدادی آرگومان --trailer <key-alias>=<value> نیز در خط فرمان ارسال شده باشند، دستور یک بار دیگر به ازای هر یک از این آرگومان‌ها با همان <key-alias> فراخوانی می‌شود. و بخش <value> این آرگومان‌ها (در صورت وجود) به عنوان اولین آرگومان به دستور فرستاده خواهد شد. بدین ترتیب دستور می‌تواند یک <value> را بر پایه <value> ارسال‌شده در آرگومان --trailer <key-alias>=<value> محاسبه و تولید نماید.

•پیکربندی یک دنباله sign با یک کلید Signed-off-by، و سپس افزودن دو مورد از این دنباله‌ها به یک فایل پیام کامیت:
$ git config trailer.sign.key "Signed-off-by"
$ cat msg.txt
subject
body text
$ git interpret-trailers --trailer 'sign: Alice <alice@example.com>' --trailer 'sign: Bob <bob@example.com>' <msg.txt
subject
body text
Signed-off-by: Alice <alice@example.com>
Signed-off-by: Bob <bob@example.com>
•استفاده از گزینه --in-place برای ویرایش درجا یک فایل پیام کامیت:
$ cat msg.txt
subject
body text
Signed-off-by: Bob <bob@example.com>
$ git interpret-trailers --trailer 'Acked-by: Alice <alice@example.com>' --in-place msg.txt
$ cat msg.txt
subject
body text
Signed-off-by: Bob <bob@example.com>
Acked-by: Alice <alice@example.com>
•استخراج آخرین کامیت به عنوان یک وصله، و افزودن یک دنباله Cc و یک دنباله Reviewed-by به آن:
$ git format-patch -1
0001-foo.patch
$ git interpret-trailers --trailer 'Cc: Alice <alice@example.com>' --trailer 'Reviewed-by: Bob <bob@example.com>' 0001-foo.patch >0001-bar.patch
•پیکربندی یک دنباله sign با دستوری جهت افزودن خودکار "Signed-off-by: " همراه با مشخصات نویسنده تنها در صورتی که هنوز هیچ "Signed-off-by: " وجود نداشته باشد، و نمایش نحوه عملکرد آن:
$ cat msg1.txt
subject
body text
$ git config trailer.sign.key "Signed-off-by: "
$ git config trailer.sign.ifmissing add
$ git config trailer.sign.ifexists doNothing
$ git config trailer.sign.cmd 'echo "$(git config user.name) <$(git config user.email)>"'
$ git interpret-trailers --trailer sign <msg1.txt
subject
body text
Signed-off-by: Bob <bob@example.com>
$ cat msg2.txt
subject
body text
Signed-off-by: Alice <alice@example.com>
$ git interpret-trailers --trailer sign <msg2.txt
subject
body text
Signed-off-by: Alice <alice@example.com>
•پیکربندی یک دنباله fix با کلیدی که شامل علامت # باشد و هیچ فاصله‌ای پس از این نویسه نداشته باشد، و نمایش نحوه عملکرد آن:
$ git config trailer.separators ":#"
$ git config trailer.fix.key "Fix #"
$ echo "subject" | git interpret-trailers --trailer fix=42
subject
Fix #42
•پیکربندی یک دنباله help همراه با یک cmd که از اسکریپت glog-find-author استفاده می‌کند؛ اسکریپتی که هویت نویسنده مشخص‌شده را از لاگ مخزن گیت جستجو می‌کند، و نمایش نحوه عملکرد آن:
$ cat ~/bin/glog-find-author
#!/bin/sh
test -n "$1" && git log --author="$1" --pretty="%an <%ae>" -1 || true
$ cat msg.txt
subject
body text
$ git config trailer.help.key "Helped-by: "
$ git config trailer.help.ifExists "addIfDifferentNeighbor"
$ git config trailer.help.cmd "~/bin/glog-find-author"
$ git interpret-trailers --trailer="help:Junio" --trailer="help:Couder" <msg.txt
subject
body text
Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Christian Couder <christian.couder@gmail.com>
•پیکربندی یک دنباله ref همراه با یک cmd که از اسکریپت glog-grep برای یافتن (grep) آخرین کامیت مرتبط از تاریخچه مخزن گیت استفاده می‌کند، و نمایش نحوه عملکرد آن:
$ cat ~/bin/glog-grep
#!/bin/sh
test -n "$1" && git log --grep "$1" --pretty=reference -1 || true
$ cat msg.txt
subject
body text
$ git config trailer.ref.key "Reference-to: "
$ git config trailer.ref.ifExists "replace"
$ git config trailer.ref.cmd "~/bin/glog-grep"
$ git interpret-trailers --trailer="ref:Add copyright notices." <msg.txt
subject
body text
Reference-to: 8bc9a0c769 (Add copyright notices., 2005-04-07)
•پیکربندی یک دنباله see با دستوری جهت نمایش موضوع کامیت مرتبط، و نمایش نحوه عملکرد آن:
$ cat msg.txt
subject
body text
see: HEAD~2
$ cat ~/bin/glog-ref
#!/bin/sh
git log -1 --oneline --format="%h (%s)" --abbrev-commit --abbrev=14
$ git config trailer.see.key "See-also: "
$ git config trailer.see.ifExists "replace"
$ git config trailer.see.ifMissing "doNothing"
$ git config trailer.see.cmd "glog-ref"
$ git interpret-trailers --trailer=see <msg.txt
subject
body text
See-also: fe3187489d69c4 (subject of related commit)
•پیکربندی یک قالب کامیت با چند دنباله دارای مقادیر خالی (با استفاده از sed برای نمایش و نگهداری فاصله‌های انتهایی در پایان دنباله‌ها)، سپس پیکربندی یک قلاب (hook) commit-msg که از git-interpret-trailers(1) برای حذف دنباله‌های با مقدار خالی و افزودن یک دنباله git-version استفاده می‌کند:
$ cat temp.txt
***subject***
***message***
Fixes: Z
Cc: Z
Reviewed-by: Z
Signed-off-by: Z
$ sed -e 's/ Z$/ /' temp.txt > commit_template.txt
$ git config commit.template commit_template.txt
$ cat .git/hooks/commit-msg
#!/bin/sh
git interpret-trailers --trim-empty --trailer "git-version: \$(git describe)" "\$1" > "\$1.new"
mv "\$1.new" "\$1"
$ chmod +x .git/hooks/commit-msg

git-commit(1), git-format-patch(1), git-config(1)

بخشی از مجموعه git(1)

2026-06-29 Git 2.55.0