| GIT-HOOK(1) | Git Manual | GIT-HOOK(1) |
نام (NAME)
git-hook - اجرای قلابهای گیت
خلاصه دستور (SYNOPSIS)
git hook run [--allow-unknown-hook-name] [--ignore-missing] [--to-stdin=<path>] [(-j|--jobs) <n>]
<hook-name> [-- <hook-args>]
git hook list [--allow-unknown-hook-name] [-z] [--show-scope] <hook-name>
توضیحات (DESCRIPTION)
یک رابط خط فرمان برای اجرای قلابهای گیت (به githooks(5) مراجعه کنید)، جهت استفاده توسط سایر دستورات اسکریپتی گیت.
این دستور فایلهای پیکربندی پیشفرض را برای مجموعهای از پیکربندیها مانند زیر تجزیه میکند:
[hook "linter"] event = pre-commit command = ~/bin/linter --cpp20
در این مثال، [hook "linter"] یک اسکریپت را نشان میدهد — ~/bin/linter --cpp20 — که در صورت لزوم میتواند میان چندین مخزن و حتی چندین رویداد قلاب به اشتراک گذاشته شود.
برای افزودن یک قلاب نامرتبط که در یک رویداد متفاوت اجرا میشود، برای مثال یک بررسیکننده املای پیامهای ثبت، پیکربندی را بهصورت زیر مینویسید:
[hook "linter"] event = pre-commit command = ~/bin/linter --cpp20 [hook "spellcheck"] event = commit-msg command = ~/bin/spellchecker
با این پیکربندی، هنگام اجرای git commit، ابتدا ~/bin/linter --cpp20 فرصت بررسی فایلهای آماده برای ثبت را دارد (در طول رویداد قلاب pre-commit)، و سپس ~/bin/spellchecker فرصت بررسی پیام ثبت را خواهد داشت (در طول رویداد قلاب commit-msg).
دستورات به ترتیبی اجرا میشوند که گیت هنگام تجزیه پیکربندی به پیکربندیهای hook.<friendly-name>.event مربوط به آنها برخورد میکند (به git-config(1) مراجعه کنید). اگرچه میتوان چندین پیکربندی hook.linter.event اضافه کرد، اما تنها یک رویداد hook.linter.command معتبر است — گیت از قاعده «آخرین مورد برنده است» برای تعیین اینکه کدام دستور اجرا شود استفاده میکند.
بنابراین اگر میخواهید لینتر شما هم هنگام ثبت (commit) و هم هنگام ارسال (push) اجرا شود، آن را به این صورت پیکربندی میکنید:
[hook "linter"] event = pre-commit event = pre-push command = ~/bin/linter --cpp20
با این پیکربندی، ~/bin/linter --cpp20 توسط گیت هم قبل از ایجاد یک ثبت (در طول pre-commit) و هم قبل از انجام یک ارسال (در طول pre-push) اجرا خواهد شد.
و اگر میخواستید هم لینتر و هم یک آشکارساز نشت اطلاعات حساس را تنها در طول رویداد قلاب "pre-commit" اجرا کنید، در عوض آن را به این صورت پیکربندی میکردید:
[hook "linter"] event = pre-commit command = ~/bin/linter --cpp20 [hook "no-leaks"] event = pre-commit command = ~/bin/leak-detector
با این پیکربندی، قبل از ایجاد ثبت (در طول pre-commit)، گیت ابتدا ~/bin/linter --cpp20 و سپس ~/bin/leak-detector را راهاندازی میکند. گیت خروجی هر یک را هنگام تصمیمگیری درباره ادامه ثبت ارزیابی خواهد کرد.
برای مشاهده فهرست کامل رویدادهای قلاب که میتوانید hook.<friendly-name>.event خود را روی آنها تنظیم کنید و نحوه فراخوانی قلابها در طول آن رویدادها، به githooks(5) مراجعه کنید.
گیت هر hook.<friendly-name>.event را که رویدادی ناشناخته را مشخص کند نادیده میگیرد. هدف این است که ابزارهای پوششدهنده گیت بتوانند از زیرساخت قلاب برای اجرای قلابهای خود استفاده کنند؛ برای راهنمایی بیشتر بخش «پوششدهندهها (WRAPPERS)» را ببینید.
بهطور کلی، هنگامی که دستورالعملها اضافه کردن یک اسکریپت به .git/hooks/<hook-event> را پیشنهاد میکنند، میتوانید آن را در پیکربندی با اجرای دستور زیر مشخص کنید:
git config set hook.<some-name>.command <path-to-script> git config set --append hook.<some-name>.event <hook-event>
به این ترتیب میتوانید اسکریپت را میان چندین مخزن به اشتراک بگذارید. یعنی دستور cp ~/my-script.sh ~/project/.git/hooks/pre-commit تبدیل میشود به:
git config set hook.my-script.command ~/my-script.sh git config set --append hook.my-script.event pre-commit
زیردستورها (SUBCOMMANDS)
run
هرگونه آرگومان موضعی برای قلاب باید بعد از یک -- اجباری (یا --end-of-options، به gitcli(7) مراجعه کنید) ارسال شود. برای آرگومانهایی که قلابها ممکن است انتظار داشته باشند (در صورت وجود) به githooks(5) مراجعه کنید.
list [-z] [--show-scope]
گزینهها (OPTIONS)
--allow-unknown-hook-name
--to-stdin
--ignore-missing
-z
--show-scope
-j, --jobs
مشخص میکند که چه تعداد قلاب بهطور همزمان اجرا شوند. اگر این پرچم مشخص نشود، از مقدار پیکربندی hook.jobs استفاده میشود؛ به git-config(1) مراجعه کنید. اگر هیچکدام مشخص نشوند، به ۱ (اجرای ترتیبی) پیشفرض است.
هنگامی که بزرگتر از ۱ باشد، تنظیم مربوط به هر قلاب hook.<friendly-name>.parallel را نادیده گرفته و به تمام قلابهای رویداد اجازه میدهد همزمان اجرا شوند، حتی اگر به صورت انفرادی به عنوان موازی علامتگذاری نشده باشند.
برخی قلابها صرفنظر از این پرچم یا پیکربندی hook.jobs همیشه بهصورت متوالی اجرا میشوند، زیرا گیت میداند که آنها نمیتوانند با امنیت به صورت موازی اجرا شوند: applypatch-msg، pre-commit، prepare-commit-msg، commit-msg، post-commit، post-checkout و push-to-checkout.
پوششدهندهها (WRAPPERS)
دستور git hook run به گونهای طراحی شده است که پیکربندی و اجرای قلابها را با استفاده از زیرساخت قلاب گیت برای ابزارهایی که گیت را پوشش میدهند (wrapper tools) آسان کند. میتوان آرگومانها و stdin را از طریق خط فرمان فراهم کرد و همچنین در صورتی که کاربر چندین قلاب ارائه کرده باشد، اجرای موازی یا سری را مشخص نمود.
با فرض اینکه ابزار پوششدهنده شما بخواهد از قلابی با نام "mywrapper-start-tests" پشتیبانی کند، میتوانید از کاربران خود بخواهید قلابهای خود را به این صورت تعیین کنند:
[hook "setup-test-dashboard"] event = mywrapper-start-tests command = ~/mywrapper/setup-dashboard.py --tap
سپس در ابزار mywrapper خود، میتوانید با اجرای دستور زیر قلابهای پیکربندیشده کاربران را فراخوانی کنید:
git hook run --allow-unknown-hook-name mywrapper-start-tests \ # providing something to stdin --stdin some-tempfile-123 \ # execute multiple hooks in parallel --jobs 3 \ # plus some arguments of your own... -- \ --testname bar \ baz
دقت کنید که رویدادهای قلاب ابزار پوششدهنده خود را به گونهای نامگذاری کنید که بعید باشد با قلابهای بومی گیت تداخل پیدا کند (به githooks(5) مراجعه کنید) — رویدادی با نام ‘mywrappertool-validate-commit` بسیار کمتر احتمال دارد که به گیت بومی افزوده شود تا رویدادی با نام validate-commit. اگر گیت شروع به استفاده از نام رویدادی همنام با قلاب ابزار شما کند، ممکن است قلابهای کاربران شما را به روشهای ناخواسته و پشتیبانینشده فراخوانی نماید.
پیکربندی (CONFIGURATION)
hook.<friendly-name>.command
hook.<friendly-name>.event
نام <friendly-name> نباید با نام یک رویداد قلاب شناختهشده یکسان باشد (مثلاً از hook.pre-commit.event استفاده نکنید). استفاده از نام یک رویداد شناختهشده به عنوان friendly-name یک خطای مهلک است زیرا با hook.<event>.enabled و hook.<event>.jobs ابهام ایجاد میکند. برای نامهای رویداد ناشناخته، در صورتی که <friendly-name> با مقدار رویداد مطابقت داشته باشد، یک هشدار صادر میشود.
hook.<friendly-name>.enabled
hook.<friendly-name>.parallel
hook.<event>.enabled
نکته درباره نامگذاری: <event> باید نام رویداد باشد (مثلاً pre-commit)، نه نام دوستانه یک قلاب. از آنجا که استفاده از نام رویداد شناختهشده به عنوان friendly-name مجاز نیست (به hook.<friendly-name>.event در بالا مراجعه کنید)، هیچ ابهامی بین تنظیمات .enabled در سطح رویداد و در سطح هر قلاب برای رویدادهای شناختهشده وجود ندارد. برای رویدادهای ناشناخته، اگر یک friendly-name علیرغم هشدار با نام رویداد مطابقت داشته باشد، با .enabled تنها به عنوان تنظیم اختصاصی قلاب رفتار میشود.
hook.<event>.jobs
نکته در مورد نامگذاری: اگرچه این کلید شبیه به hook.<friendly-name>.* (یک تنظیم به ازای هر قلاب) است، <event> باید نام رویداد باشد، نه نام دوستانه قلاب. جزء کلید به صورت لغوی ذخیره شده و در زمان اجرا بر اساس نام رویداد بدون هیچ تبدیلی میان دو فضای نام جستجو میشود. کلیدی مانند hook.my-hook.jobs تحت عنوان "my-hook" ذخیره میشود اما جستجو در زمان اجرا از نام رویداد (مثلاً "post-receive") استفاده میکند، بنابراین hook.my-hook.jobs حتی زمانی که my-hook برای آن رویداد ثبت شده باشد بیصدا نادیده گرفته میشود. هنگام تنظیم hook.<event>.jobs از hook.post-receive.jobs یا هر نام رویداد معتبر دیگری استفاده کنید.
hook.jobs
applypatch-msg, prepare-commit-msg, commit-msg
pre-commit, post-checkout, push-to-checkout, post-commit
این تنظیم هیچ تأثیری ندارد مگر اینکه تمام قلابهای پیکربندیشده برای آن رویداد، hook.<friendly-name>.parallel را روی true تنظیم کرده باشند.
برای قلابهای pre-push، که معمولاً خروجی استاندارد و خطای استاندارد را جدا نگه میدارند، تنظیم این مقدار روی عددی بزرگتر از ۱ (یا ارسال -j) خروجی استاندارد را در خطای استاندارد ادغام میکند تا امکان تفکیک صحیح خروجیهای موازی فراهم شود.
همچنین ببینید (SEE ALSO)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |