'\" t .\" Title: git-hook .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 2026-06-29 .\" Manual: Git Manual .\" Source: Git 2.55.0 .\" Language: English .\" .TH "GIT\-HOOK" "1" "2026\-06\-29" "Git 2\&.55\&.0" "Git Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "نام (NAME)" git-hook \- اجرای قلاب‌های گیت .SH "خلاصه دستور (SYNOPSIS)" .sp .nf \fIgit hook\fR run [\-\-allow\-unknown\-hook\-name] [\-\-ignore\-missing] [\-\-to\-stdin=] [(\-j|\-\-jobs) ] [\-\- ] \fIgit hook\fR list [\-\-allow\-unknown\-hook\-name] [\-z] [\-\-show\-scope] .fi .sp .SH "توضیحات (DESCRIPTION)" .sp یک رابط خط فرمان برای اجرای قلاب‌های گیت (به \fBgithooks\fR(5) مراجعه کنید)، جهت استفاده توسط سایر دستورات اسکریپتی گیت\&. .sp این دستور فایل‌های پیکربندی پیش‌فرض را برای مجموعه‌ای از پیکربندی‌ها مانند زیر تجزیه می‌کند: .sp .if n \{\ .RS 4 .\} .nf [hook "linter"] event = pre\-commit command = ~/bin/linter \-\-cpp20 .fi .if n \{\ .RE .\} .sp در این مثال، [\fBhook\fR "linter"] یک اسکریپت را نشان می‌دهد \(em \fB~/bin/linter\fR \fB\-\-cpp20\fR \(em که در صورت لزوم می‌تواند میان چندین مخزن و حتی چندین رویداد قلاب به اشتراک گذاشته شود\&. .sp برای افزودن یک قلاب نامرتبط که در یک رویداد متفاوت اجرا می‌شود، برای مثال یک بررسی‌کننده املای پیام‌های ثبت، پیکربندی را به‌صورت زیر می‌نویسید: .sp .if n \{\ .RS 4 .\} .nf [hook "linter"] event = pre\-commit command = ~/bin/linter \-\-cpp20 [hook "spellcheck"] event = commit\-msg command = ~/bin/spellchecker .fi .if n \{\ .RE .\} .sp با این پیکربندی، هنگام اجرای \fIgit commit\fR، ابتدا \fB~/bin/linter\fR \fB\-\-cpp20\fR فرصت بررسی فایل‌های آماده برای ثبت را دارد (در طول رویداد قلاب \fBpre\-commit\fR)، و سپس \fB~/bin/spellchecker\fR فرصت بررسی پیام ثبت را خواهد داشت (در طول رویداد قلاب \fBcommit\-msg\fR)\&. .sp دستورات به ترتیبی اجرا می‌شوند که گیت هنگام تجزیه پیکربندی به پیکربندی‌های \fBhook\&.\fR\fI\fR\fB\&.event\fR مربوط به آن‌ها برخورد می‌کند (به \fBgit-config\fR(1) مراجعه کنید)\&. اگرچه می‌توان چندین پیکربندی \fBhook\&.linter\&.event\fR اضافه کرد، اما تنها یک رویداد \fBhook\&.linter\&.command\fR معتبر است \(em گیت از قاعده «آخرین مورد برنده است» برای تعیین اینکه کدام دستور اجرا شود استفاده می‌کند\&. .sp بنابراین اگر می‌خواهید لینتر شما هم هنگام ثبت (commit) و هم هنگام ارسال (push) اجرا شود، آن را به این صورت پیکربندی می‌کنید: .sp .if n \{\ .RS 4 .\} .nf [hook "linter"] event = pre\-commit event = pre\-push command = ~/bin/linter \-\-cpp20 .fi .if n \{\ .RE .\} .sp با این پیکربندی، \fB~/bin/linter\fR \fB\-\-cpp20\fR توسط گیت هم قبل از ایجاد یک ثبت (در طول \fBpre\-commit\fR) و هم قبل از انجام یک ارسال (در طول \fBpre\-push\fR) اجرا خواهد شد\&. .sp و اگر می‌خواستید هم لینتر و هم یک آشکارساز نشت اطلاعات حساس را تنها در طول رویداد قلاب "pre\-commit" اجرا کنید، در عوض آن را به این صورت پیکربندی می‌کردید: .sp .if n \{\ .RS 4 .\} .nf [hook "linter"] event = pre\-commit command = ~/bin/linter \-\-cpp20 [hook "no\-leaks"] event = pre\-commit command = ~/bin/leak\-detector .fi .if n \{\ .RE .\} .sp با این پیکربندی، قبل از ایجاد ثبت (در طول \fBpre\-commit\fR)، گیت ابتدا \fB~/bin/linter\fR \fB\-\-cpp20\fR و سپس \fB~/bin/leak\-detector\fR را راه‌اندازی می‌کند\&. گیت خروجی هر یک را هنگام تصمیم‌گیری درباره ادامه ثبت ارزیابی خواهد کرد\&. .sp برای مشاهده فهرست کامل رویدادهای قلاب که می‌توانید \fBhook\&.\fR\fI\fR\fB\&.event\fR خود را روی آن‌ها تنظیم کنید و نحوه فراخوانی قلاب‌ها در طول آن رویدادها، به \fBgithooks\fR(5) مراجعه کنید\&. .sp گیت هر \fBhook\&.\fR\fI\fR\fB\&.event\fR را که رویدادی ناشناخته را مشخص کند نادیده می‌گیرد\&. هدف این است که ابزارهای پوشش‌دهنده گیت بتوانند از زیرساخت قلاب برای اجرای قلاب‌های خود استفاده کنند؛ برای راهنمایی بیشتر بخش «پوشش‌دهنده‌ها (WRAPPERS)» را ببینید\&. .sp به‌طور کلی، هنگامی که دستورالعمل‌ها اضافه کردن یک اسکریپت به \fB\&.git/hooks/\fR\fI\fR را پیشنهاد می‌کنند، می‌توانید آن را در پیکربندی با اجرای دستور زیر مشخص کنید: .sp .if n \{\ .RS 4 .\} .nf git config set hook\&.\&.command git config set \-\-append hook\&.\&.event .fi .if n \{\ .RE .\} .sp .sp به این ترتیب می‌توانید اسکریپت را میان چندین مخزن به اشتراک بگذارید\&. یعنی دستور \fBcp\fR \fB~/my\-script\&.sh\fR \fB~/project/\&.git/hooks/pre\-commit\fR تبدیل می‌شود به: .sp .if n \{\ .RS 4 .\} .nf git config set hook\&.my\-script\&.command ~/my\-script\&.sh git config set \-\-append hook\&.my\-script\&.event pre\-commit .fi .if n \{\ .RE .\} .sp .SH "زیردستورها (SUBCOMMANDS)" .PP run .RS 4 قلاب‌های پیکربندی‌شده برای \fI\fR را به ترتیبی که در طول تجزیه پیکربندی کشف شده‌اند اجرا می‌کند\&. قلاب پیش‌فرض \fI\fR از پوشه hookdir در آخر اجرا می‌شود\&. برای نام قلاب‌های پشتیبانی‌شده به \fBgithooks\fR(5) مراجعه کنید\&. .sp هرگونه آرگومان موضعی برای قلاب باید بعد از یک \fB\-\-\fR اجباری (یا \fB\-\-end\-of\-options\fR، به \fBgitcli\fR(7) مراجعه کنید) ارسال شود\&. برای آرگومان‌هایی که قلاب‌ها ممکن است انتظار داشته باشند (در صورت وجود) به \fBgithooks\fR(5) مراجعه کنید\&. .RE .PP list [\-z] [\-\-show\-scope] .RS 4 فهرستی از قلاب‌هایی را که در رویداد \fI\fR اجرا خواهند شد چاپ می‌کند\&. اگر هیچ قلابی برای آن رویداد پیکربندی نشده باشد، یک هشدار چاپ کرده و مقدار ۱ را برمی‌گرداند\&. از \fB\-z\fR برای خاتمه دادن به خطوط خروجی با NUL به جای خط جدید استفاده کنید\&. .RE .SH "گزینه‌ها (OPTIONS)" .PP \-\-allow\-unknown\-hook\-name .RS 4 به‌طور پیش‌فرض دستورات \fBgit\fR \fBhook\fR \fBrun\fR و \fBgit\fR \fBhook\fR \fBlist\fR هنگامی که \fI\fR یک رویداد قلاب شناخته‌شده برای گیت نباشد متوقف می‌شوند (برای فهرست قلاب‌های شناخته‌شده به \fBgithooks\fR(5) مراجعه کنید)\&. هدف این است که به کشف اشتباهات تایپی مانند \fBprereceive\fR به جای \fBpre\-receive\fR کمک شود\&. این گزینه را برای مجاز دانستن نام‌های قلاب ناشناخته ارسال کنید\&. .RE .PP \-\-to\-stdin .RS 4 برای "run"؛ فایلی را مشخص می‌کند که محتوای آن به ورودی استاندارد (stdin) قلاب هدایت می‌شود\&. قلاب کل فایل را از ابتدا تا انتها (EOF) دریافت خواهد کرد\&. .RE .PP \-\-ignore\-missing .RS 4 هر قلاب ناموجود را با برگرداندن بی‌صدای مقدار صفر نادیده می‌گیرد\&. برای ابزارهایی استفاده می‌شود که می‌خواهند اجرای یک‌باره‌ای از قلابی داشته باشند که ممکن است وجود داشته باشد یا نداشته باشد\&. .RE .PP \-z .RS 4 خطوط خروجی دستور "list" را به جای خط جدید با نویسه NUL خاتمه می‌دهد\&. .RE .PP \-\-show\-scope .RS 4 برای "list"؛ پیشوند نام هر قلاب پیکربندی‌شده را با یک محدوده پیکربندی که با نویسه tab جدا شده است (مانند \fBlocal\fR، \fBglobal\fR، \fBsystem\fR) قرار می‌دهد، که سبک خروجی \fBgit\fR \fBconfig\fR \fB\-\-show\-scope\fR را بازتاب می‌دهد\&. قلاب‌های سنتی موجود در hookdir تحت تأثیر قرار نمی‌گیرند\&. .RE .PP \-j, \-\-jobs .RS 4 تنها برای \fBrun\fR معتبر است\&. .sp مشخص می‌کند که چه تعداد قلاب به‌طور همزمان اجرا شوند\&. اگر این پرچم مشخص نشود، از مقدار پیکربندی \fBhook\&.jobs\fR استفاده می‌شود؛ به \fBgit-config\fR(1) مراجعه کنید\&. اگر هیچ‌کدام مشخص نشوند، به ۱ (اجرای ترتیبی) پیش‌فرض است\&. .sp هنگامی که بزرگتر از ۱ باشد، تنظیم مربوط به هر قلاب \fBhook\&.\fR\fI\fR\fB\&.parallel\fR را نادیده گرفته و به تمام قلاب‌های رویداد اجازه می‌دهد همزمان اجرا شوند، حتی اگر به صورت انفرادی به عنوان موازی علامت‌گذاری نشده باشند\&. .sp برخی قلاب‌ها صرف‌نظر از این پرچم یا پیکربندی \fBhook\&.jobs\fR همیشه به‌صورت متوالی اجرا می‌شوند، زیرا گیت می‌داند که آن‌ها نمی‌توانند با امنیت به صورت موازی اجرا شوند: \fBapplypatch\-msg\fR، \fBpre\-commit\fR، \fBprepare\-commit\-msg\fR، \fBcommit\-msg\fR، \fBpost\-commit\fR، \fBpost\-checkout\fR و \fBpush\-to\-checkout\fR\&. .RE .SH "پوشش‌دهنده‌ها (WRAPPERS)" .sp دستور \fBgit\fR \fBhook\fR \fBrun\fR به گونه‌ای طراحی شده است که پیکربندی و اجرای قلاب‌ها را با استفاده از زیرساخت قلاب گیت برای ابزارهایی که گیت را پوشش می‌دهند (wrapper tools) آسان کند\&. می‌توان آرگومان‌ها و stdin را از طریق خط فرمان فراهم کرد و همچنین در صورتی که کاربر چندین قلاب ارائه کرده باشد، اجرای موازی یا سری را مشخص نمود\&. .sp با فرض اینکه ابزار پوشش‌دهنده شما بخواهد از قلابی با نام "mywrapper\-start\-tests" پشتیبانی کند، می‌توانید از کاربران خود بخواهید قلاب‌های خود را به این صورت تعیین کنند: .sp .if n \{\ .RS 4 .\} .nf [hook "setup\-test\-dashboard"] event = mywrapper\-start\-tests command = ~/mywrapper/setup\-dashboard\&.py \-\-tap .fi .if n \{\ .RE .\} .sp سپس در ابزار \fImywrapper\fR خود، می‌توانید با اجرای دستور زیر قلاب‌های پیکربندی‌شده کاربران را فراخوانی کنید: .sp .if n \{\ .RS 4 .\} .nf git hook run \-\-allow\-unknown\-hook\-name mywrapper\-start\-tests \e # providing something to stdin \-\-stdin some\-tempfile\-123 \e # execute multiple hooks in parallel \-\-jobs 3 \e # plus some arguments of your own\&.\&.\&. \-\- \e \-\-testname bar \e baz .fi .if n \{\ .RE .\} .sp .sp دقت کنید که رویدادهای قلاب ابزار پوشش‌دهنده خود را به گونه‌ای نام‌گذاری کنید که بعید باشد با قلاب‌های بومی گیت تداخل پیدا کند (به \fBgithooks\fR(5) مراجعه کنید) \(em رویدادی با نام \(oqmywrappertool\-validate\-commit` بسیار کمتر احتمال دارد که به گیت بومی افزوده شود تا رویدادی با نام \fBvalidate\-commit\fR\&. اگر گیت شروع به استفاده از نام رویدادی هم‌نام با قلاب ابزار شما کند، ممکن است قلاب‌های کاربران شما را به روش‌های ناخواسته و پشتیبانی‌نشده فراخوانی نماید\&. .SH "پیکربندی (CONFIGURATION)" .PP hook\&.\&.command .RS 4 دستوری که برای \fBhook\&.\fR\fI\fR اجرا می‌شود\&. \fI\fR نامی یکتاست که این قلاب را مشخص می‌کند\&. رویدادهای قلابی که دستور را فراخوانی می‌کنند با \fBhook\&.\fR\fI\fR\fB\&.event\fR پیکربندی می‌شوند\&. مقدار می‌تواند مسیر یک فایل اجرایی یا یک تک‌خطی شل باشد\&. اگر بیش از یک مقدار برای همان \fI\fR مشخص شود، تنها آخرین مقدار پردازش‌شده استفاده می‌شود\&. .RE .PP hook\&.\&.event .RS 4 رویدادهای قلابی که موجب راه‌اندازی \fBhook\&.\fR\fI\fR می‌شوند\&. مقدار، نام یک رویداد قلاب مانند "pre\-commit" یا "update" است\&. (برای فهرست کامل رویدادهای قلاب به \fBgithooks\fR(5) مراجعه کنید\&.) در رویداد مشخص‌شده، دستور \fBhook\&.\fR\fI\fR\fB\&.command\fR متناظر اجرا می‌شود\&. این یک کلید با چند مقدار است\&. برای اجرای \fBhook\&.\fR\fI\fR در چندین رویداد، این کلید را بیش از یک بار مشخص کنید\&. یک مقدار خالی فهرست رویدادها را بازنشانی کرده و تمام رویدادهای قبلاً تعریف‌شده برای \fBhook\&.\fR\fI\fR را پاک می‌کند\&. .sp نام \fI\fR نباید با نام یک رویداد قلاب شناخته‌شده یکسان باشد (مثلاً از \fBhook\&.pre\-commit\&.event\fR استفاده نکنید)\&. استفاده از نام یک رویداد شناخته‌شده به عنوان friendly\-name یک خطای مهلک است زیرا با \fBhook\&.\fR\fI\fR\fB\&.enabled\fR و \fBhook\&.\fR\fI\fR\fB\&.jobs\fR ابهام ایجاد می‌کند\&. برای نام‌های رویداد ناشناخته، در صورتی که \fI\fR با مقدار رویداد مطابقت داشته باشد، یک هشدار صادر می‌شود\&. .RE .PP hook\&.\&.enabled .RS 4 آیا قلاب \fBhook\&.\fR\fI\fR فعال است یا خیر\&. مقدار پیش‌فرض \fBtrue\fR است\&. برای غیرفعال کردن قلاب بدون حذف پیکربندی آن، روی \fBfalse\fR تنظیم کنید\&. این قابلیت به‌ویژه زمانی مفید است که قلابی در فایل پیکربندی سیستم یا سراسری (global) تعریف شده باشد و نیاز باشد برای یک مخزن خاص غیرفعال شود\&. .RE .PP hook\&.\&.parallel .RS 4 آیا قلاب \fBhook\&.\fR\fI\fR مجاز است همزمان با سایر قلاب‌های همان رویداد اجرا شود یا خیر\&. مقدار پیش‌فرض \fBfalse\fR است\&. تنها زمانی روی \fBtrue\fR تنظیم کنید که اسکریپت قلاب برای اجرای همزمان با سایر قلاب‌های همان رویداد ایمن باشد\&. اگر هر یک از قلاب‌های یک رویداد این مقدار را روی \fBtrue\fR نداشته باشند، تمام قلاب‌های آن رویداد صرف‌نظر از \fBhook\&.jobs\fR به‌صورت ترتیبی اجرا خواهند شد\&. فقط قلاب‌های پیکربندی‌شده (نام‌گذاری‌شده) نیاز به تعریف این مورد دارند\&. قلاب‌های سنتی موجود در پوشه hooks نیازی به این کار ندارند و زمانی که تعداد کار مؤثر بزرگتر از ۱ باشد، به‌صورت موازی اجرا می‌شوند\&. .RE .PP hook\&.\&.enabled .RS 4 کلیدی برای فعال یا غیرفعال کردن تمام قلاب‌های رویداد \fI\fR\&. هنگامی که روی \fBfalse\fR تنظیم شود، هیچ قلابی برای آن رویداد اجرا نمی‌شود، صرف‌نظر از هر تنظیمی که به ازای هر قلاب در \fBhook\&.\fR\fI\fR\fB\&.enabled\fR وجود داشته باشد\&. مقدار پیش‌فرض \fBtrue\fR است\&. .sp نکته درباره نام‌گذاری: \fI\fR باید نام رویداد باشد (مثلاً \fBpre\-commit\fR)، نه نام دوستانه یک قلاب\&. از آنجا که استفاده از نام رویداد شناخته‌شده به عنوان friendly\-name مجاز نیست (به \fBhook\&.\fR\fI\fR\fB\&.event\fR در بالا مراجعه کنید)، هیچ ابهامی بین تنظیمات \fB\&.enabled\fR در سطح رویداد و در سطح هر قلاب برای رویدادهای شناخته‌شده وجود ندارد\&. برای رویدادهای ناشناخته، اگر یک friendly\-name علیرغم هشدار با نام رویداد مطابقت داشته باشد، با \fB\&.enabled\fR تنها به عنوان تنظیم اختصاصی قلاب رفتار می‌شود\&. .RE .PP hook\&.\&.jobs .RS 4 مشخص می‌کند چه تعداد قلاب را می‌توان به‌طور همزمان برای رویداد \fI\fR اجرا کرد (مثلاً \fBhook\&.post\-receive\&.jobs\fR \fB=\fR \fB4\fR)\&. تنظیم \fBhook\&.jobs\fR را برای این رویداد خاص بازنویسی می‌کند\&. همان محدودیت‌های موازی‌سازی اعمال می‌شود: این تنظیم هیچ تأثیری ندارد مگر اینکه تمام قلاب‌های پیکربندی‌شده برای آن رویداد، گزینه \fBhook\&.\fR\fI\fR\fB\&.parallel\fR را روی \fBtrue\fR تنظیم کرده باشند\&. برای استفاده از تعداد هسته‌های CPU در دسترس، مقدار را روی \fB\-1\fR تنظیم کنید\&. باید یک عدد صحیح مثبت یا \fB\-1\fR باشد؛ مقدار صفر با یک هشدار رد می‌شود\&. .sp نکته در مورد نام‌گذاری: اگرچه این کلید شبیه به \fBhook\&.\fR\fI\fR\fB\&.*\fR (یک تنظیم به ازای هر قلاب) است، \fI\fR باید نام رویداد باشد، نه نام دوستانه قلاب\&. جزء کلید به صورت لغوی ذخیره شده و در زمان اجرا بر اساس نام رویداد بدون هیچ تبدیلی میان دو فضای نام جستجو می‌شود\&. کلیدی مانند \fBhook\&.my\-hook\&.jobs\fR تحت عنوان "my\-hook" ذخیره می‌شود اما جستجو در زمان اجرا از نام رویداد (مثلاً "post\-receive") استفاده می‌کند، بنابراین \fBhook\&.my\-hook\&.jobs\fR حتی زمانی که \fBmy\-hook\fR برای آن رویداد ثبت شده باشد بی‌صدا نادیده گرفته می‌شود\&. هنگام تنظیم \fBhook\&.\fR\fI\fR\fB\&.jobs\fR از \fBhook\&.post\-receive\&.jobs\fR یا هر نام رویداد معتبر دیگری استفاده کنید\&. .RE .PP hook\&.jobs .RS 4 مشخص می‌کند چه تعداد قلاب می‌توانند به‌طور همزمان در طول اجرای موازی قلاب‌ها اجرا شوند\&. در صورت مشخص نشدن، پیش‌فرض روی ۱ است (اجرای ترتیبی)\&. برای استفاده از تعداد هسته‌های پردازنده موجود، آن را روی \fB\-1\fR تنظیم کنید\&. می‌توان آن را به ازای هر رویداد با \fBhook\&.\fR\fI\fR\fB\&.jobs\fR بازنویسی کرد\&. برخی قلاب‌ها صرف‌نظر از این تنظیم همیشه به‌صورت ترتیبی اجرا می‌شوند، زیرا روی داده‌های مشترک عمل می‌کنند و نمی‌توان آن‌ها را با ایمنی موازی کرد: .PP \fBapplypatch\-msg\fR, \fBprepare\-commit\-msg\fR, \fBcommit\-msg\fR .RS 4 یک فایل پیام ثبت را دریافت می‌کنند و ممکن است آن را درجا بازنویسی کنند\&. .RE .PP \fBpre\-commit\fR, \fBpost\-checkout\fR, \fBpush\-to\-checkout\fR, \fBpost\-commit\fR .RS 4 به درخت کاری، نمایه‌ها یا وضعیت مخزن دسترسی دارند\&. .RE .sp این تنظیم هیچ تأثیری ندارد مگر اینکه تمام قلاب‌های پیکربندی‌شده برای آن رویداد، \fBhook\&.\fR\fI\fR\fB\&.parallel\fR را روی \fBtrue\fR تنظیم کرده باشند\&. .sp برای قلاب‌های \fBpre\-push\fR، که معمولاً خروجی استاندارد و خطای استاندارد را جدا نگه می‌دارند، تنظیم این مقدار روی عددی بزرگتر از ۱ (یا ارسال \fB\-j\fR) خروجی استاندارد را در خطای استاندارد ادغام می‌کند تا امکان تفکیک صحیح خروجی‌های موازی فراهم شود\&. .RE .SH "همچنین ببینید (SEE ALSO)" .sp \fBgithooks\fR(5) .SH "گیت (GIT)" .sp بخشی از مجموعه \fBgit\fR(1)