Git Hooks بسيطة لإدارة مستودعك

Git هي أداة رائعة. يسمح لك ليس فقط بتتبع التغييرات في ملف من خلال خطّافات hooks ولكن أيضًا التعاون بسلاسة مع أشخاص آخرين. في هذا الصدد ، تعد Git إحدى الأدوات التي دفعت بتطوير البرمجيات الحرة والمفتوحة المصدر إلى الأمام. ومع ذلك ، فإن إحدى أكبر المشكلات في Git هي أن إدارة مستودعاتك تستغرق وقتًا وجهدًا. على سبيل المثال ، يمكن أن يستغرق تنفيذ هذه المستودعات ومزامنتها أمرين إلى ثلاثة أوامر git. هذا يجعل إدارتها ليس فقط مملة ولكن أيضًا عرضة لخطأ المستخدم. نعرض لك هنا بعض أدوات Git hooks “خطّافات Git” البسيطة والفعالة لإدارة مستودعاتك بشكل أفضل.

Git Hooks بسيطة لإدارة مستودعك - %categories

ما هي Git Hooks ؟

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

Git Hooks بسيطة لإدارة مستودعك - %categories

يعمل أمر hook الفرعي من خلال قراءة مجلد “hooks” ضمن دليل “.git” الخاص بالمستودع. يحتوي هذا المجلد على عدد من الملفات المعدة مسبقًا التي توفر نموذجًا نصيًا لكل إجراء في Git يمكنك تشغيله تلقائيًا.

Git Hooks بسيطة لإدارة مستودعك - %categories

بالنسبة للجزء الأكبر ، يمكنك كتابة git hook بأي لغة برمجة نصية ترغب فيها. هذا يجعله مرنًا بشكل لا يصدق ودودًا لأي مطور برامج.

1. Prevent Pushing to Master

أحد الأخطاء الأكثر شيوعًا التي يرتكبها المستخدم في Git هو دفع الالتزام من فرع التطوير مباشرة إلى إتقانه. قد يكون هذا محبطًا بشكل لا يصدق إذا كنت تستخدم Github لتتبع وصيانة مشاريعك.

Git Hooks بسيطة لإدارة مستودعك - %categories

يمكنك منع هذه المشكلة عن طريق إنشاء pre-push والذي سيتحقق ويؤكد كلما حاولت دفع مستودع من الفرع الرئيسي.

  1. انتقل إلى مستودع Git الذي تريد حمايته.Git Hooks بسيطة لإدارة مستودعك - %categories
  2. قم بإنشاء ملف Git hook باستخدام برنامج التدقيق النصي الخاص بك. نظرًا لأن هذا hook يجب تشغيله قبل “دفع” ، فأنت بحاجة إلى إنشاء ملف hook “دفع مسبق”:
    touch .git/hooks/pre-push
  3. افتح ملف hook الجديد في محرر نصي.
    nano .git/hooks/pre-push
  4. في الداخل ، اكتب hook الجديد “قبل الدفع”. على سبيل المثال ، ما يلي هو برنامج نصي سيطلب منك التأكيد عندما تدفع من الفرع الرئيسي:
    #!/bin/sh
     
    protect='master'
    current=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
     
    if [ $protect = $current ]
    then
        read -p "Confirm push to master? Y/n." -n 1 -r < /dev/tty
        echo
        if echo $REPLY | grep -E '^[Yy]$' > /dev/null
        then
            exit 0
        fi
        exit 1
    else
        exit 0
    fi
  5. احفظ hook الجديد. في nano ، قم بذلك عن طريق الضغط على Ctrl + O ، ثم Ctrl + X.Git Hooks بسيطة لإدارة مستودعك - %categories
  6. قم بتشغيل الأمر التالي للتأكد من أن Git يمكنه تشغيل hook الجديد.
chmod +x .git/hooks/pre-push

2. Reject Pushes to the Master Branch

بصرف النظر عن منع نفسك من الدفع إلى السيد ، يمكنك أيضًا إنشاء hook من جانب الخادم يرفض أي دفعات إلى فرعه الرئيسي. يعد هذا مفيدًا بشكل لا يصدق إذا كنت تشارك مستودعًا مع مطورين متعددين.

اقرأ أيضا:  كيفية إضافة أو تعديل أو حذف جهات الاتصال في Gmail

Git Hooks بسيطة لإدارة مستودعك - %categories

قم بإصلاح ذلك عن طريق إنشاء hook “استقبال مسبق” والذي سيمنع تلقائيًا أي مستخدم مقيد من الدفع إلى الفرع الرئيسي.

  1. قم بإنشاء ملف Git hook “للاستلام المسبق” في مستودعك البعيد.
    touch .git/hooks/pre-receive
  2. افتح هذا الملف.
    nano .git/hooks/pre-receive
  3. أضف نص الرفض في hook “الاستلام المسبق”. على سبيل المثال ، يجب أن تعمل سطور التعليمات البرمجية التالية خارج الصندوق:
    #!/bin/sh
     
    branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
     
    blacklist=(alice bob)
     
    if [[ ${blacklist[*]} =~ $USER ]]; then
        if [ "$branch" == "master" ]; then   
             echo "You are not allowed commit changes in this branch"     
            exit 1     
        fi
    fi
  4. احفظ ملف hook الجديد الخاص بك. في حالتي ، أحتاج إلى الضغط على Ctrl + O ، ثم Ctrl + X لحفظ الملف.
  5. احفظ نص hook الخاص بك واجعله قابلاً للتنفيذ.
chmod +x .git/hooks/pre-receive

نصيحة: يمكنك أيضًا استخدام الاسم المستعار Git لجعل استخدام Git أكثر كفاءة.

3. Lock the Repository from Rebasing

هناك خطأ شائع آخر يرتكبه المستخدم في Git وهو إعادة تعيين الفرع النشط حاليًا. قد تكون هذه مشكلة محبطة إذا كنت تعمل على مستودع مع العديد من المساهمين ، حيث ستؤدي إعادة التأسيس إلى إزالة الالتزامات التي قام بها المستخدمون الآخرون.

Git Hooks بسيطة لإدارة مستودعك - %categories

يمكنك منع هذه المشكلة عن طريق إنشاء hook “إعادة التأسيس المسبق” والذي سيتحقق مما إذا كان الفرع الحالي مغلقًا أم لا.

  1. أنشئ ملف “pre-rebase” في دليل “.git / hooks”:
    touch .git/hooks/pre-rebase
  2. افتح هذا الملف للتحرير.
    nano .git/hooks/pre-rebase
  3. أضف البرنامج النصي rebase داخل ملف hook الجديد.
    #!/bin/sh
     
    branch="$2"
    [ -n "$branch" ] || branch=$(git rev-parse --abbrev-ref HEAD)
    lock="branch.${branch}.rebaselock"
     
    if [ "$(git config --bool "$lock")" = true ]; then
    echo "pre-rebase hook: \"$lock\" is set to true. Refusing to rebase."
    exit 1
    fi
  4. احفظ ملف hook الجديد واجعله قابلاً للتنفيذ.
chmod +x .git/hooks/pre-rebase

4. Force a Style and Syntax Check on Your Code

أحد أكثر الاستخدامات المفيدة لـ hook Git هو ربطه برمز linter. هذا برنامج بسيط يتحقق مما إذا كانت التعليمات البرمجية الخاصة بك تتبع أسلوب وتنسيق المشروع.

اقرأ أيضا:  لماذا امتلأت مساحة تخزين هاتفي

Git Hooks بسيطة لإدارة مستودعك - %categories

  1. لربط linter بمستودع Git الخاص بك ، قم أولاً بإنشاء ملف ربط “التزام مسبق”.
    touch .git/hooks/pre-commit
  2. قم بتثبيت linter المناسب للغة مشروعك. في هذه الحالة ، أستخدم “shellcheck” لتحليل كود Bash الخاص بي:
    sudo apt install shellcheck
  3. افتح ملف hook الجديد وأضف البرنامج النصي التالي.
    #!/bin/bash
    for file in $(git diff --cached --name-only --diff-filter=AM | grep -E '\.sh$')
    do
     
      shellcheck "$file" # Run the linter for every new file.
     
      if [ $? -ne 0 ]; then
        exit 1 # Terminate the commit if the linter fails.
      fi
    done
  4. احفظ ملف hook الجديد واجعله قابلاً للتنفيذ:
    chmod +x .git/hooks/pre-commit

5. Automatically Notify Users with Repository Changes

أخيرًا ، يمكنك أيضًا إنشاء Git hook الذي سيرسل تلقائيًا بريدًا إلكترونيًا كلما تلقى مستودعك التزامًا جديدًا. هذا مفيد إذا كنت تريد إنشاء نظام إعلام بسيط لمستودعك.

  1. قم بإنشاء ملف hooks “post-Receiver” في دليل .git / hooks بالمستودع الخاص بك:
    touch .git/hooks/post-receive
  2. افتح ملف Git hook الجديد وأدخل البرنامج النصي التالي:
    #!/bin/sh
     
    commit_message=$(git log -1 --pretty=%B)
    users=("[email protected]" "[email protected]" "[email protected]")
     
    for user in "${users[@]}"; do
        mail -s "New Commit: $commit_message" $user < /dev/null
        done
  3. احفظ ملف hook الجديد واجعله قابلاً للتنفيذ.
    chmod +x .git/hooks/post-receive

أسئلة مكررة

س 1. هل يمكنني كتابة Git hooks بلغة مترجمة ، مثل C؟

اقرأ أيضا:  كيفية مسح ذاكرة التخزين المؤقت على Android TV وGoogle TV

الجواب. أحد أكبر قيود Hooks Git “خطّافات Git” هو أنه يتطلب منك استخدام لغة يمكنك تشغيلها مباشرة من المحطة. هذا يعني أن Git hooks لا تدعم أي لغة مترجمة لنصوصها. على سبيل المثال ، يمكنك إنشاء Git hooks جديد باستخدام Python أو Shell وليس C أو C ++.

س 2. هل من الممكن تشغيل عدة hooks في نفس مستودع Git؟

الجواب. نعم. بينما تُظهر الأمثلة أعلاه hooks كميزات فردية منفصلة ، يمكنك بسهولة مزجها معًا لإنشاء سير العمل الفريد الخاص بك ، مما يجعل Git hooks مرنة بشكل لا يصدق وقابلة للتكيف مع أي موقف ترميز. على سبيل المثال ، يمكنك استخدام كل من hook  الدفع المسبق “Prevent Push to Master” و hook الالتزام المسبق “Syntax Check” في المستودع الخاص بك.

س 3. لماذا لا يرسل البريد الإلكتروني Git hooks بريدًا إلكترونيًا إلى المستخدمين؟

الجواب. ترجع هذه المشكلة على الأرجح إلى عدم قدرة خادمك البعيد على إرسال أي رسائل بريد إلكتروني صادرة بشكل صحيح. لإصلاح ذلك ، تأكد من أن الخادم البعيد الخاص بك آمن وأنه يحتوي على عامل تسليم بريد يعمل جنبًا إلى جنب مع مجال SMTP.

قد يعجبك ايضا