Git Hooks بسيطة لإدارة مستودعك
Git هي أداة رائعة. يسمح لك ليس فقط بتتبع التغييرات في ملف من خلال خطّافات hooks ولكن أيضًا التعاون بسلاسة مع أشخاص آخرين. في هذا الصدد ، تعد Git إحدى الأدوات التي دفعت بتطوير البرمجيات الحرة والمفتوحة المصدر إلى الأمام. ومع ذلك ، فإن إحدى أكبر المشكلات في Git هي أن إدارة مستودعاتك تستغرق وقتًا وجهدًا. على سبيل المثال ، يمكن أن يستغرق تنفيذ هذه المستودعات ومزامنتها أمرين إلى ثلاثة أوامر git. هذا يجعل إدارتها ليس فقط مملة ولكن أيضًا عرضة لخطأ المستخدم. نعرض لك هنا بعض أدوات Git hooks “خطّافات Git” البسيطة والفعالة لإدارة مستودعاتك بشكل أفضل.
ما هي Git Hooks ؟
يعد git-hook في جوهره أمرًا فرعيًا مرنًا يمكنك استخدامه لإنشاء نصوص برمجية مخصصة يتم تشغيلها عندما ينفذ Git إجراءً على المستودع. على سبيل المثال ، من الممكن استخدام hook لمراجعة المستودع الخاص بك تلقائيًا بحثًا عن أخطاء النمط قبل أن تلتزم به.
يعمل أمر hook الفرعي من خلال قراءة مجلد “hooks” ضمن دليل “.git” الخاص بالمستودع. يحتوي هذا المجلد على عدد من الملفات المعدة مسبقًا التي توفر نموذجًا نصيًا لكل إجراء في Git يمكنك تشغيله تلقائيًا.
بالنسبة للجزء الأكبر ، يمكنك كتابة git hook بأي لغة برمجة نصية ترغب فيها. هذا يجعله مرنًا بشكل لا يصدق ودودًا لأي مطور برامج.
1. Prevent Pushing to Master
أحد الأخطاء الأكثر شيوعًا التي يرتكبها المستخدم في Git هو دفع الالتزام من فرع التطوير مباشرة إلى إتقانه. قد يكون هذا محبطًا بشكل لا يصدق إذا كنت تستخدم Github لتتبع وصيانة مشاريعك.
يمكنك منع هذه المشكلة عن طريق إنشاء pre-push والذي سيتحقق ويؤكد كلما حاولت دفع مستودع من الفرع الرئيسي.
- انتقل إلى مستودع Git الذي تريد حمايته.
- قم بإنشاء ملف Git hook باستخدام برنامج التدقيق النصي الخاص بك. نظرًا لأن هذا hook يجب تشغيله قبل “دفع” ، فأنت بحاجة إلى إنشاء ملف hook “دفع مسبق”:
touch .git/hooks/pre-push
- افتح ملف hook الجديد في محرر نصي.
nano .git/hooks/pre-push
- في الداخل ، اكتب 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
- احفظ hook الجديد. في nano ، قم بذلك عن طريق الضغط على Ctrl + O ، ثم Ctrl + X.
- قم بتشغيل الأمر التالي للتأكد من أن Git يمكنه تشغيل hook الجديد.
chmod +x .git/hooks/pre-push
2. Reject Pushes to the Master Branch
بصرف النظر عن منع نفسك من الدفع إلى السيد ، يمكنك أيضًا إنشاء hook من جانب الخادم يرفض أي دفعات إلى فرعه الرئيسي. يعد هذا مفيدًا بشكل لا يصدق إذا كنت تشارك مستودعًا مع مطورين متعددين.
قم بإصلاح ذلك عن طريق إنشاء hook “استقبال مسبق” والذي سيمنع تلقائيًا أي مستخدم مقيد من الدفع إلى الفرع الرئيسي.
- قم بإنشاء ملف Git hook “للاستلام المسبق” في مستودعك البعيد.
touch .git/hooks/pre-receive
- افتح هذا الملف.
nano .git/hooks/pre-receive
- أضف نص الرفض في 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
- احفظ ملف hook الجديد الخاص بك. في حالتي ، أحتاج إلى الضغط على Ctrl + O ، ثم Ctrl + X لحفظ الملف.
- احفظ نص hook الخاص بك واجعله قابلاً للتنفيذ.
chmod +x .git/hooks/pre-receive
نصيحة: يمكنك أيضًا استخدام الاسم المستعار Git لجعل استخدام Git أكثر كفاءة.
3. Lock the Repository from Rebasing
هناك خطأ شائع آخر يرتكبه المستخدم في Git وهو إعادة تعيين الفرع النشط حاليًا. قد تكون هذه مشكلة محبطة إذا كنت تعمل على مستودع مع العديد من المساهمين ، حيث ستؤدي إعادة التأسيس إلى إزالة الالتزامات التي قام بها المستخدمون الآخرون.
يمكنك منع هذه المشكلة عن طريق إنشاء hook “إعادة التأسيس المسبق” والذي سيتحقق مما إذا كان الفرع الحالي مغلقًا أم لا.
- أنشئ ملف “pre-rebase” في دليل “.git / hooks”:
touch .git/hooks/pre-rebase
- افتح هذا الملف للتحرير.
nano .git/hooks/pre-rebase
- أضف البرنامج النصي 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
- احفظ ملف hook الجديد واجعله قابلاً للتنفيذ.
chmod +x .git/hooks/pre-rebase
4. Force a Style and Syntax Check on Your Code
أحد أكثر الاستخدامات المفيدة لـ hook Git هو ربطه برمز linter. هذا برنامج بسيط يتحقق مما إذا كانت التعليمات البرمجية الخاصة بك تتبع أسلوب وتنسيق المشروع.
- لربط linter بمستودع Git الخاص بك ، قم أولاً بإنشاء ملف ربط “التزام مسبق”.
touch .git/hooks/pre-commit
- قم بتثبيت linter المناسب للغة مشروعك. في هذه الحالة ، أستخدم “shellcheck” لتحليل كود Bash الخاص بي:
sudo apt install shellcheck
- افتح ملف 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
- احفظ ملف hook الجديد واجعله قابلاً للتنفيذ:
chmod +x .git/hooks/pre-commit
5. Automatically Notify Users with Repository Changes
أخيرًا ، يمكنك أيضًا إنشاء Git hook الذي سيرسل تلقائيًا بريدًا إلكترونيًا كلما تلقى مستودعك التزامًا جديدًا. هذا مفيد إذا كنت تريد إنشاء نظام إعلام بسيط لمستودعك.
- قم بإنشاء ملف hooks “post-Receiver” في دليل .git / hooks بالمستودع الخاص بك:
touch .git/hooks/post-receive
- افتح ملف 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
- احفظ ملف hook الجديد واجعله قابلاً للتنفيذ.
chmod +x .git/hooks/post-receive
أسئلة مكررة
س 1. هل يمكنني كتابة Git hooks بلغة مترجمة ، مثل C؟
الجواب. أحد أكبر قيود 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.