مدیریت بهتر و قانونمندتر با استفاده از GitHooks

Git Hooksگیت یه ابزار خیلی قدرتمند واسه کنترل پروژه است که عموما تو پروژهای برنامه‌نویسی ازش استفاده میشه و اگه برنامه‌نویس هستید قطعا باهاش آشنایی دارید. اما وقتی پروژه‌ شما از یه میزان بزرگتر میشه مدیریت مخزن Git پروژه واقعا سخت میشه از Branchهایی با اسم‌های متفاوت بگیر تا Commit های به محتواهای اشتباه یا نامفهوم. اما خب چیکار میشه کرد ؟ تو خیلی از تیم‌ها شاید این مورد مرسوم باشه که اعضای پروژه باهم دیگه توافق میکنن که از یک سری قوانین خاص پیروی کنی و روی همون قوانین با Git کار کنن اما خب ایین مورد هم ایرادات خاص خودش رو داره و خیلی وقتی ممکنه سهوا اشتباهاتی پیش بیاد که باز میتونه تاثیرات منفی روی پروژه Git شما به همراه داشته باشه. من تو این مقاله میخوام چند راه ساده رو به شما نشون بدم که بهتون کمک میکنه به شیوه بهتری پروژه‌های Git رو مدیریت کنید و قوانین خاصی رو به صورت اجباری داخل پروژه قرار بدید پس لطفا در ادامه این مطلب با من همراه باشید.تعریف اولیهاول از همه بیاید با هم ببینم که Git Hook چیه و چجوری قراره به ما کمک کنه تو حل این مشکل. اگخ بخوام به زبان ساده توضیح بدم؛ Git Hook در واقع به رخدادهای مشخصی در Git گفته میشه که به شما این امکان رو میده که برای اون‌ها با استفاده Shell برنامه‌هایی رو تعریف کنید تا پیش یا پس از اتفاق رخداد اول برنامه شما اجرا بشه و ما هم قراره دقیقا از همین قابلیت استفاده کنید. - آیا ما برای هر رخدادی که دلمون بخواد میتونید از Git Hook استفاده کنید ؟ + خب جواب این سوال طبیعتا خیر هست.در ادامه من دوتا از رایج‌ترین Hookها رو به توضیحات کامل و نمونه کد مربوط بهش براتون قرار میدم که بتونید ازش استفاده کنید در صورت نیاز و بعد از اون هم باقی Hookهارو معرفی میکنم و یه مروری روی بقیه با هم انجام میدیمچه زمانی از Pre-Commit استفاده کنیم؟این Hook در واقع زمانی فراخوانی میشه که کاربر دستور git commit رو اجرا میکنه اما پیش از اینکه کاربر متن Commit خودش رو وارد کنه این Script اجرا میشه و اگه برنامه با موفقیت اجرا نشه کاربر قادر به ادامه فرایند Commit نخواهد بود. برای مثال شما میتونید این امکان رو داشته باشید تا پیش از ذخیره تغییرات به عنوان یک Commit تست‌هایی که از قبل نوشتید اجرا بشه و اگر تست‌ها به درستی انجام نشدن از ادامه فرآیند جلوگیری بشه یا حتی تو حالت خیلی ساده مثل کد زیر شما میتونید بررسی کنید که آیا برنچی که داره تغییراتش در اون ثبت میشه از نامگذاری درستی پیروی میکنه یا نه ؟ https://gist.github.com/amirzenoozi/1b688be780cf0429259874dbecc1ba09 چه زمانی از Commit-msg استفاده کنیم؟این Hook دقیقا زمانی اجرا میشه که قراره یک Commit به هر شکلی توسط کاربر برای تغییر اخیر ثبت بشه که عمدتا این Hook توسط دستورهای git commit و git merge فراخوانی میشه اما چه کمکی به شما میکنه؟ خب شما خیلی راحت میتونید با استفاده از این Hook متن پیام خودتون رو بررسی کنید و یک سری قوانین براش تعریف کنید برای مثال این قانون میتونه این باشه که طول commit از یک تعداد کاراکتر بیشتر نباشه یا حتما با یک سری کلمات خاص شروع بشه و یا هر قانونی که خودتون دوست دارید تو پروژه رعایت بشه برای مثال تو قطعه کد زیر من میام بررسی میکنم که آیا متن Commit ثبت شده توسط کاربر از قواعد CommitConvension پیروی میکنه یا خیر ؟ https://gist.github.com/amirzenoozi/ed80483d33e5a71185f1cb3319525cb8 اما Hookها فقط به همین دو موردی که واستون مثال زدم محدود نمیشه و تعداد خیلی بیشتری Hook داریم که به بسته به پروژه و تصمیم‌گیری مدیر پروژه میتونید ازش داخل پروژه‌های خودتون استفاده کنیداما یه نکته رو دقت داشته باشید اونم اینکه موقعی که شما Hookها رو داخل پروژه خودتون قرار میدین بعد از اون لازمه که این امکان رو داشته باشید که اون‌هارو با بقیه اعضای تیم هم به اشتراک بذارید که بتونن ازش استفاده کنن اما به صورت پیشفرض مسیر ذخیره Hookها داخل .git هست و همونطور که میدونید تغییرات این فایل داخل مخزن اصلی Git ذخیره نخواهد شد برای اینکه بتونید Hookها رو به صورت Local داخل پروژه خودتون قرار بدید لازمه که اول از همه اونا رو داخل یه فولدر دیگه مثل .githooks ذخیره کنید و سپس از دستور زیر استفاده کنید:git config core.hooksPath .githooksسایر Hookهای موجود ؟خب همونطور که قبلا هم گفتم Git تعداد زیادی Hook داره که من فقط دوتا اون‌ها رو براتون به صورت کامل و با مثال توضیح دادم به همین دلیل اگه نیاز دارید که با بقیه اون‌ها آشنا بشید و بدونید که چه زمانی باید ازشون استفاده کنید توصیه میکنم حتما مستندات خود گیت رو مطالعه کنید چرا که به صورت خیلی کامل‌تری در مورد هر Hook توضیحات قرارداده و شما میتونید خیلی راحت ازش استفاده کنید. پروفایل گیت‌هاب https://github.com/amirzenoozi مقالات مرتبط https://vrgl.ir/Rgjgx https://vrgl.ir/8fI5Z https://vrgl.ir/kC235