GIT-HOOK(1) Git Manual GIT-HOOK(1)

git-hook - اجرای قلاب‌های گیت

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>

یک رابط خط فرمان برای اجرای قلاب‌های گیت (به 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

run

قلاب‌های پیکربندی‌شده برای <hook-name> را به ترتیبی که در طول تجزیه پیکربندی کشف شده‌اند اجرا می‌کند. قلاب پیش‌فرض <hook-name> از پوشه hookdir در آخر اجرا می‌شود. برای نام قلاب‌های پشتیبانی‌شده به githooks(5) مراجعه کنید.

هرگونه آرگومان موضعی برای قلاب باید بعد از یک -- اجباری (یا --end-of-options، به gitcli(7) مراجعه کنید) ارسال شود. برای آرگومان‌هایی که قلاب‌ها ممکن است انتظار داشته باشند (در صورت وجود) به githooks(5) مراجعه کنید.

list [-z] [--show-scope]

فهرستی از قلاب‌هایی را که در رویداد <hook-name> اجرا خواهند شد چاپ می‌کند. اگر هیچ قلابی برای آن رویداد پیکربندی نشده باشد، یک هشدار چاپ کرده و مقدار ۱ را برمی‌گرداند. از -z برای خاتمه دادن به خطوط خروجی با NUL به جای خط جدید استفاده کنید.

--allow-unknown-hook-name

به‌طور پیش‌فرض دستورات git hook run و git hook list هنگامی که <hook-name> یک رویداد قلاب شناخته‌شده برای گیت نباشد متوقف می‌شوند (برای فهرست قلاب‌های شناخته‌شده به githooks(5) مراجعه کنید). هدف این است که به کشف اشتباهات تایپی مانند prereceive به جای pre-receive کمک شود. این گزینه را برای مجاز دانستن نام‌های قلاب ناشناخته ارسال کنید.

--to-stdin

برای "run"؛ فایلی را مشخص می‌کند که محتوای آن به ورودی استاندارد (stdin) قلاب هدایت می‌شود. قلاب کل فایل را از ابتدا تا انتها (EOF) دریافت خواهد کرد.

--ignore-missing

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

-z

خطوط خروجی دستور "list" را به جای خط جدید با نویسه NUL خاتمه می‌دهد.

--show-scope

برای "list"؛ پیشوند نام هر قلاب پیکربندی‌شده را با یک محدوده پیکربندی که با نویسه tab جدا شده است (مانند local، global، system) قرار می‌دهد، که سبک خروجی git config --show-scope را بازتاب می‌دهد. قلاب‌های سنتی موجود در hookdir تحت تأثیر قرار نمی‌گیرند.

-j, --jobs

تنها برای run معتبر است.

مشخص می‌کند که چه تعداد قلاب به‌طور همزمان اجرا شوند. اگر این پرچم مشخص نشود، از مقدار پیکربندی 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.

دستور 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. اگر گیت شروع به استفاده از نام رویدادی هم‌نام با قلاب ابزار شما کند، ممکن است قلاب‌های کاربران شما را به روش‌های ناخواسته و پشتیبانی‌نشده فراخوانی نماید.

hook.<friendly-name>.command

دستوری که برای hook.<friendly-name> اجرا می‌شود. <friendly-name> نامی یکتاست که این قلاب را مشخص می‌کند. رویدادهای قلابی که دستور را فراخوانی می‌کنند با hook.<friendly-name>.event پیکربندی می‌شوند. مقدار می‌تواند مسیر یک فایل اجرایی یا یک تک‌خطی شل باشد. اگر بیش از یک مقدار برای همان <friendly-name> مشخص شود، تنها آخرین مقدار پردازش‌شده استفاده می‌شود.

hook.<friendly-name>.event

رویدادهای قلابی که موجب راه‌اندازی hook.<friendly-name> می‌شوند. مقدار، نام یک رویداد قلاب مانند "pre-commit" یا "update" است. (برای فهرست کامل رویدادهای قلاب به githooks(5) مراجعه کنید.) در رویداد مشخص‌شده، دستور hook.<friendly-name>.command متناظر اجرا می‌شود. این یک کلید با چند مقدار است. برای اجرای hook.<friendly-name> در چندین رویداد، این کلید را بیش از یک بار مشخص کنید. یک مقدار خالی فهرست رویدادها را بازنشانی کرده و تمام رویدادهای قبلاً تعریف‌شده برای hook.<friendly-name> را پاک می‌کند.

نام <friendly-name> نباید با نام یک رویداد قلاب شناخته‌شده یکسان باشد (مثلاً از hook.pre-commit.event استفاده نکنید). استفاده از نام یک رویداد شناخته‌شده به عنوان friendly-name یک خطای مهلک است زیرا با hook.<event>.enabled و hook.<event>.jobs ابهام ایجاد می‌کند. برای نام‌های رویداد ناشناخته، در صورتی که <friendly-name> با مقدار رویداد مطابقت داشته باشد، یک هشدار صادر می‌شود.

hook.<friendly-name>.enabled

آیا قلاب hook.<friendly-name> فعال است یا خیر. مقدار پیش‌فرض true است. برای غیرفعال کردن قلاب بدون حذف پیکربندی آن، روی false تنظیم کنید. این قابلیت به‌ویژه زمانی مفید است که قلابی در فایل پیکربندی سیستم یا سراسری (global) تعریف شده باشد و نیاز باشد برای یک مخزن خاص غیرفعال شود.

hook.<friendly-name>.parallel

آیا قلاب hook.<friendly-name> مجاز است همزمان با سایر قلاب‌های همان رویداد اجرا شود یا خیر. مقدار پیش‌فرض false است. تنها زمانی روی true تنظیم کنید که اسکریپت قلاب برای اجرای همزمان با سایر قلاب‌های همان رویداد ایمن باشد. اگر هر یک از قلاب‌های یک رویداد این مقدار را روی true نداشته باشند، تمام قلاب‌های آن رویداد صرف‌نظر از hook.jobs به‌صورت ترتیبی اجرا خواهند شد. فقط قلاب‌های پیکربندی‌شده (نام‌گذاری‌شده) نیاز به تعریف این مورد دارند. قلاب‌های سنتی موجود در پوشه hooks نیازی به این کار ندارند و زمانی که تعداد کار مؤثر بزرگتر از ۱ باشد، به‌صورت موازی اجرا می‌شوند.

hook.<event>.enabled

کلیدی برای فعال یا غیرفعال کردن تمام قلاب‌های رویداد <event>. هنگامی که روی false تنظیم شود، هیچ قلابی برای آن رویداد اجرا نمی‌شود، صرف‌نظر از هر تنظیمی که به ازای هر قلاب در hook.<friendly-name>.enabled وجود داشته باشد. مقدار پیش‌فرض true است.

نکته درباره نام‌گذاری: <event> باید نام رویداد باشد (مثلاً pre-commit)، نه نام دوستانه یک قلاب. از آنجا که استفاده از نام رویداد شناخته‌شده به عنوان friendly-name مجاز نیست (به hook.<friendly-name>.event در بالا مراجعه کنید)، هیچ ابهامی بین تنظیمات .enabled در سطح رویداد و در سطح هر قلاب برای رویدادهای شناخته‌شده وجود ندارد. برای رویدادهای ناشناخته، اگر یک friendly-name علیرغم هشدار با نام رویداد مطابقت داشته باشد، با .enabled تنها به عنوان تنظیم اختصاصی قلاب رفتار می‌شود.

hook.<event>.jobs

مشخص می‌کند چه تعداد قلاب را می‌توان به‌طور همزمان برای رویداد <event> اجرا کرد (مثلاً hook.post-receive.jobs = 4). تنظیم hook.jobs را برای این رویداد خاص بازنویسی می‌کند. همان محدودیت‌های موازی‌سازی اعمال می‌شود: این تنظیم هیچ تأثیری ندارد مگر اینکه تمام قلاب‌های پیکربندی‌شده برای آن رویداد، گزینه hook.<friendly-name>.parallel را روی true تنظیم کرده باشند. برای استفاده از تعداد هسته‌های CPU در دسترس، مقدار را روی -1 تنظیم کنید. باید یک عدد صحیح مثبت یا -1 باشد؛ مقدار صفر با یک هشدار رد می‌شود.

نکته در مورد نام‌گذاری: اگرچه این کلید شبیه به 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

مشخص می‌کند چه تعداد قلاب می‌توانند به‌طور همزمان در طول اجرای موازی قلاب‌ها اجرا شوند. در صورت مشخص نشدن، پیش‌فرض روی ۱ است (اجرای ترتیبی). برای استفاده از تعداد هسته‌های پردازنده موجود، آن را روی -1 تنظیم کنید. می‌توان آن را به ازای هر رویداد با hook.<event>.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) خروجی استاندارد را در خطای استاندارد ادغام می‌کند تا امکان تفکیک صحیح خروجی‌های موازی فراهم شود.

githooks(5)

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

2026-06-29 Git 2.55.0