FreeToGenerate.com

كل الخطّافات، مُشغَّلةً لا منقولةً عن الدليل.

ابحث عن خطّاف

يعمل حيث تعمل أنت

التوثيق يقول
لا يستطيع تغيير النتيجة، لكن حالة خروجه تصير حالة الأمر
ما حدث فعلًا
تمّت العملية وفشل الأمر مع ذلك
العملية المنفَّذة
git checkout
رمز الخروج
1

لا فرق في حالة الأحرف. جرّب post-checkout أو pre-rebase أو reference-transaction، فكل واحد منها ينقض افتراضًا مختلفًا.

مقيسٌ لا منقول

خطّافًا موثَّقًا
28
شُغِّل فعلًا
19
أوقفت العملية
11
لم تغيّر شيئًا
7
أفشلت الأمر رغم ذلك
1

رُكِّب كل خطّاف وحده، ومتنه لا يفعل شيئًا سوى الفشل، في مستودع مؤقّت إلى جانبه مستودع مجرّد محلي. وشُغِّلت كل حالة أيضًا بلا خطّاف إطلاقًا، وكان على هذا الضابط أن ينجح قبل أن يُعتدّ بالقياس.

الاسم ليس هو القاعدة. فستة فقط من الخطّافات الأحد عشر التي أوقفت شيئًا تبدأ بـpre؛ وتوقف الأمورَ كذلك applypatch-msg وcommit-msg وprepare-commit-msg وupdate وreference-transaction.

git version 2.54.0.windows.1

الخطّافات الثمانية والعشرون

28 معروضة
الخطّافأين يعملالموثَّقالمقيس
applypatch-msgيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
pre-applypatchيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
post-applypatchيعمل حيث تعمل أنتحالة خروجه مُهمَلةلم يتغيّر شيء البتة
pre-commitيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
pre-merge-commitيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
prepare-commit-msgيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
commit-msgيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
post-commitيعمل حيث تعمل أنتحالة خروجه مُهمَلةلم يتغيّر شيء البتة
pre-rebaseيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
post-checkoutيعمل حيث تعمل أنتلا يستطيع تغيير النتيجة، لكن حالة خروجه تصير حالة الأمرتمّت العملية وفشل الأمر مع ذلك
post-mergeيعمل حيث تعمل أنتحالة خروجه مُهمَلةلم يتغيّر شيء البتة
pre-pushيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
pre-receiveيعمل في الطرف المستقبِل للدفعالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
updateيعمل في الطرف المستقبِل للدفعالخروج بحالة غير صفرية يُجهض العمليةأُوقفت العملية
proc-receiveيعمل في الطرف المستقبِل للدفعحالة خروجه لا تُحتسب إلا في بعض الحالات
post-receiveيعمل في الطرف المستقبِل للدفعحالة خروجه مُهمَلةلم يتغيّر شيء البتة
post-updateيعمل في الطرف المستقبِل للدفعحالة خروجه مُهمَلةلم يتغيّر شيء البتة
reference-transactionيعمل حيث تعمل أنتحالة خروجه لا تُحتسب إلا في بعض الحالاتأُوقفت العملية
push-to-checkoutيعمل في الطرف المستقبِل للدفعالخروج بحالة غير صفرية يُجهض العملية
pre-auto-gcيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العملية
post-rewriteيعمل حيث تعمل أنتحالة خروجه مُهمَلةلم يتغيّر شيء البتة
sendemail-validateيعمل حيث تعمل أنتالخروج بحالة غير صفرية يُجهض العملية
fsmonitor-watchmanيعمل حيث تعمل أنتحالة خروجه لا تُحتسب إلا في بعض الحالات
p4-changelistيعمل داخل git-p4الخروج بحالة غير صفرية يُجهض العملية
p4-prepare-changelistيعمل داخل git-p4الخروج بحالة غير صفرية يُجهض العملية
p4-post-changelistيعمل داخل git-p4حالة خروجه مُهمَلة
p4-pre-submitيعمل داخل git-p4الخروج بحالة غير صفرية يُجهض العملية
post-index-changeيعمل حيث تعمل أنتحالة خروجه مُهمَلةلم يتغيّر شيء البتة

القائمة والعمود الموثَّق من githooks(5) كما يأتي مع git. أما العمود المقيس فمن تشغيل كل خطّاف.

متوفر أيضًا بلغات أخرى: English · Español · Português · Français

خطّافات git: القائمة الكاملة وأيها يستطيع إيقافك

المجموعة الكاملة التي يوثّقها git، والجواب المقيس عن السؤال الوحيد المهم: هل يستطيع هذا الخطّاف إيقاف ما تفعله؟

ما خطّاف git؟

خطّاف git ملف تنفيذي في مجلد الخطّافات داخل مستودعك، مسمّى باسم لحظة من حياة git. فإذا حلّت تلك اللحظة — وأنت على وشك الحفظ، أو أنهيت دمجًا، أو وصل دفعٌ إلى الخادم — شغّل git ذلك الملف. وهكذا يفرض مشروعٌ صيغةً لرسائل الحفظ، أو يمرّر مدقّق شيفرة قبل دخولها، أو يرفض دفعًا قسريًّا إلى الفرع الرئيسي.

يوثّق git ثمانية وعشرين خطّافًا. ولا يصادف أكثر الناس منها إلا ثلاثة أو أربعة، أما البقية فتغطي تطبيق الرقع عبر البريد، وإعادة الأساس، والطرف المستقبِل للدفع، وكنس المهملات، وجسرًا إلى Perforce، وعدد منها يعمل في مواضع لا يدلّ عليها اسمه أبدًا.

والسؤال الذي يأتي به كل أحد بسيط: إن فشل هذا الخطّاف، هل يوقفني؟ وكل مرجع وجدناه يجيب بنقل القائمة من دليل git. أما هذه الصفحة فتجيب بتشغيلها.

طريقة الاستخدام

  1. اكتب اسم خطّاف. تحصل على موضع تشغيله، وعلى ما يقوله توثيق git عن حالة خروجه، وعلى ما حدث حين رُكِّب فعلًا وأُمر بالفشل.
  2. أو ابحث في المجموعة كلها. يضم الجدول أدناه الثمانية والعشرين. والبحث بأمر من أوامر git — commit أو push أو git am — يعيد كل خطّاف ينطلق أثناءه.
  3. واقرأ العمودين أحدهما في مقابل الآخر. فهما من مصدرين مختلفين؛ حيث يتفقان يمكنك الوثوق بالجواب، وحيث لا تملك المواصفة كلمةً لما يجري، يقدّم القياس واحدة.

ماذا حدث حين شغّلناها

رُكِّب كل خطّاف على حدة، في مستودع مؤقّت إلى جانبه مستودع مجرّد محلي، ومتنه لا يفعل شيئًا سوى الفشل. ثم نُفِّذت العملية التي ينتمي إليها ذلك الخطّاف، وسُجِّل أمران: رمز الخروج الذي أعاده الأمر، وهل تحرّكت حالة المستودع فعلًا. وتسعة عشر من الثمانية والعشرين يمكن قيادتها هكذا، أما البقية فتحتاج مستودع Perforce أو ناقل بريد أو watchman أو بروتوكول الدفع الأحدث، فتُركت خالية بدل تخمينها.

وشُغِّلت كل حالة أيضًا بلا خطّاف إطلاقًا، وكان على هذا الضابط أن ينجح وأن يحرّك الحالة قبل أن يُعتدّ بالقياس. وليس هذا طقسًا شكليًّا: فقد أفادت النسخة الأولى من هذه التجربة بأن الخطّاف pre-rebase لا يستطيع إيقاف إعادة الأساس، وهو باطل، وسببه أن الفرع الذي بنته لم يكن فيه ما يُعاد تأسيسه، فلم تفعل العملية شيئًا بخطّاف أو بغيره. الضابط حوّل كذبةً معقولةً قابلةً للنشر إلى فشل صاخب.

ومن هذه التسعة عشر: أحد عشر أوقفت العملية، وسبعة لم تغيّر شيئًا البتة، وواحد فعل شيئًا لا كلمة شائعة له.

الخطّاف الذي يفشل دون أن يُفشل

لا يستطيع الخطّاف post-checkout إيقاف تبديل الفرع. ويقول توثيق git نفسه إنه لا يؤثر في النتيجة، إلا أن حالة خروجه تصير حالة خروج الأمر. وبالقياس، هذا بالضبط ما يقع: يتم التبديل، وتصير على الفرع الجديد، ويعيد git الرمز 1.

فالسكربت المكتوب على هيئة تبديل فرع يتبعه أمر مسلسل — وهكذا تُكتب معظم سكربتات النشر وخطوات التكامل المستمر — يتوقف تمامًا في مستودع يفشل فيه خطّاف post-checkout. التبديل نجح، والأمر فشل. حقيقتان مختلفتان، ولا يرى الصدَفُ إلا إحداهما.

ورمز خروج آخر يستحق المعرفة: حين يرفض الخطّاف reference-transaction في حالته prepared، لا يعيد git فشلًا عاديًّا بل يعيد 128، وهو رمزه للخطأ القاتل. فأي شيء يطابق رموز الخروج ينبغي أن يتوقع ذلك لا الرمز 1.

الاسم ليس هو القاعدة

يتعلّمها الجميع هكذا: الخطّافات التي تبدأ بـpre تستطيع المنع، والتي تبدأ بـpost لا تستطيع. ونصف هذا صحيح: فلم يوقف شيءٌ اسمه post شيئًا، وكل خطّاف لم يغيّر شيئًا البتة كان اسمه post-كذا.

أما النصف الآخر فيسقط. فستة فقط من الخطّافات الأحد عشر التي أوقفت عمليةً تُسمّى pre-كذا، والخمسة الأخرى هي applypatch-msg وcommit-msg وprepare-commit-msg وupdate وreference-transaction — أي أن قرابة نصف ما يستطيع إيقافك لا ينبّه إلى ذلك في اسمه. وprepare-commit-msg هو الفخ داخل الفخ: يبدأ بالحروف p-r-e، وليس خطّاف pre، ويمنع.

والقاعدة الحقيقية هي هل يستشير git حالة الخروج عند النقطة التي يعمل فيها الخطّاف، وهذه خاصية للعملية لا للاسم. ولهذا يوقف update عملية دفع، ويستطيع reference-transaction منع إنشاء فرع، ويستطيع post-checkout إفشال أمر دون أن يغيّر شيئًا.

ما لا تستطيع هذه الصفحة إخبارك به

هي إصدار واحد من git على منصة واحدة. أُخذ القياس بإصدار git المطبوع إلى جانب الأرقام، على ويندوز، ودلالات الخطّافات وإن كانت تتغيّر ببطء فهي تتغيّر. وحيث يتفق التوثيق والقياس — وهو كل ما يتقاطعان فيه — فالجواب أوثق ما يمكن دون قراءة الشيفرة المصدرية.

وتسعة خطّافات لم تُقَس، وتقول خاناتها ذلك بدل أن تُملأ. وقد جُرّب أحدها، pre-auto-gc، ثم تُرك: فكنس المهملات التلقائي لا يعمل إلا بعد أن يقرّر git أن في المستودع ما يكفي من الكائنات السائبة، وذلك القرار يأخذ عيّنة من مجلد بدل أن يعدّ، فلم يشغّله أي مستودع اختبار صغير بما يكفي. والخانة التي لا يمكن جعل ضابطها أمينًا تُترك خارجًا.

وأخيرًا، الحديث هنا عن قدرة الخطّاف على إيقاف عملية لا عن جدارته بذلك. فالخطّاف الذي يرفض عملًا لا ينفع إلا إذا عرف من أوقفه لماذا أُوقف، وgit لا يطبع شيئًا نيابةً عنك: ما يكتبه خطّافك في مخرج الخطأ هو الرسالة كلها التي سيراها أي أحد.

لماذا هي مجانية؟

القائمة كلها بضعة كيلوبايتات تُشحن مع الصفحة ويجري البحث فيها داخل متصفحك. لا يُرفع شيء مما تكتبه، ولا يُسجَّل شيء، ولا حساب عليك إنشاؤه.

بلا تسجيل، وبلا حدود، وبلا علامة مائية على أي شيء تنسخه.