در مواقعی که چندین ساعت پشت سرهم کار انجام میدهیم و خسته می‌شویم، امکان این کار وجود دارد که پروژه را سریعا push کنیم و بررسی نکنیم که اصلا پروژه بیلد میشود یا نه. در Git این قابلیت وجود دارد که قبل از پوش کردن یکسری دستورات را اجرا نماییم. بنابراین میتوانیم از این قابلیت برای بیلد گرفتن از پروژه قبل از پوش کردن استفاده نماییم. برای این کار باید در پوشه .git پوشه hooks را باز نمایید و یک فایل به اسم pre-push ایجاد نمایید. سپس باید دستور مربوط به بلید گرفتن از پروژه خود را درون فایل ایجاد شده بنویسید. با این کار قبل از هر بار پوش کردن branchها دستورات درون فایل pre-push اجرا می‌شود. برای مثال در کد زیر یک نمونه از بیلد گرفتن از پروژه قبل از پوش کردن برنچ ها را نوشته ایم.

#!/bin/sh

dotnet clean ".\GitHookExample.ConsoleApp\GitHookExample.ConsoleApp.csproj"
dotnet build ".\GitHookExample.ConsoleApp\GitHookExample.ConsoleApp.csproj"

اکنون اگر پروژه خود را پوش کنید، قبل از پوش کردن دستورات clean و build اجرا میشوند و در صورتی که تمامی مراحل با موفقیت اجرا شود، سپس عملیات پوش کردن صورت میگیرد.
در پوشه hooks چندین فایل نمونه وجود دارد:

  • pre-commit
  • pre-push
  • pre-merge
  • pre-rebase
  • pre-receive
  • pre-applypatch
  • pre-merge-commit
  • update
  • push-to-checkout
  • prepare-commit-msg
  • post-update
  • commit-msg
  • fsmonitor-watchman
  • applypatch-msg

درون هرکدام از این فایل‌ها زمان اجرا شدن دستورات را نوشته اند. برای مثال درون فایل commit-msg اطلاعات زیر نوشته شده است:

#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message.  The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit.  The hook is allowed to edit the commit message file.
#
# To enable this hook, rename this file to "commit-msg".

# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"

# This example catches duplicate Signed-off-by lines.

test "" = "$(grep '^Signed-off-by: ' "$1" |
	 sort | uniq -c | sed -e '/^[ 	]*1[ 	]/d')" || {
	echo >&2 Duplicate Signed-off-by lines.
	exit 1
}

فایل commit-msg زمانی اجرا می‌شود که شما دستور git commit را وارد نمایید. در این فایل شما به متن وارد شده به عنوان commit message دسترسی دارید و میتوانید یکسری قوانین برای وارد کردن commit message وارد کنید که تمامی برنامه نویس های پروژه از یک ساختار مشخص برای نوشتن commit message استفاده نمایند.برای مثال در کد زیر یک pattern نوشته ایم که commit message برنامه نویس باید با GitHookExample شروع شود و شامل یک عددی باشد:

#!/bin/sh
#!/usr/bin/env bash
INPUT_FILE=$1
START_LINE=`head -n1 $INPUT_FILE`
PATTERN="^(GitHookExample)-[[:digit:]]+: "
if ! [[ "$START_LINE" =~ $PATTERN ]]; then
  echo "Bad commit message, see example: GitHookExample-123: commit message"
  exit 1
fi

در کد بالا اگر commit message برنامه نویس با pattern معرفی شده همخوانی نداشته باشد خطای زیر را در زمان commit کردن دریافت خواهد کرد:

Bad commit message, see example: GitHookExample-123: commit message

اما اگر یک متن معتبر وارد نمایند:

 git commit -m "GitHookExample-001: initial project"

تغییرات آنها با موفقیت commit خواهد شد.
همچنین میتوانید قبل از مرج کردن و پوش کردن دستور dotnet test را هم وارد نمایید که قبل از پوش کردن و مرج کردن ابتدا تمامی تست ها اجرا شوند و سپس عملیات مورد نظر اجرا شود.
به صورت پیشفرض تمامی فایلهای موجود در پوشه hooks دارای پسوند .sample هستند. برای فعال سازی هرکدام از موارد ذکر شده بالا، باید در پوشه hooks قسمت .sample را از نام فایلها پاک نمایید. برای مثال:

pre-push
pre-rebase
pre-receive
pre-commit

;)

نظرات

سایر نظرات
  • Alireza

    نه برای اینکه صرفا کتابخانه خودم هست ولی پیشنهاد میکنم Husky.Net رو برای مدیریت هوک ها و تسک ها بررسی کنید. https://github.com/alirezanet/Husky.Netشاید موضوعی بشه برای مقاله بعدی 😊

    ارسال شده در تاریخ جمعه، ۱۹ اسفند ۱۴۰۱
    • admin

      ممنون علیرضا جان بابت معرفی کتابخونه خوبت

      ارسال شده در تاریخ سه شنبه، ۰۱ فروردین ۱۴۰۲