खोज…
वाक्य - विन्यास
- .git / हुक / applypatch-msg
- .git / हुक / प्रतिबद्ध-msg
- .git / हुक / उत्तर अद्यतन
- .git / हुक / पूर्व applypatch
- .git / हुक / पूर्व प्रतिबद्ध
- .git / हुक / तैयार-लिखें-msg
- .git / हुक / पूर्व धक्का
- .git / हुक / पूर्व रिबेस
- .git / हुक / अद्यतन
टिप्पणियों
--no-verify
या -n
दिया Git आदेश पर सभी स्थानीय हुक को छोड़ने के लिए।
जैसे: git commit -n
इस पृष्ठ पर जानकारी आधिकारिक गिट डॉक्स और एटलसियन से एकत्र की गई थी।
कमिट-msg
यह हुक prepare-commit-msg
हुक के समान है, लेकिन यह उपयोगकर्ता द्वारा पहले के बजाय एक प्रतिबद्ध संदेश दर्ज करने के बाद कहा जाता है। यह आमतौर पर डेवलपर्स को चेतावनी देने के लिए उपयोग किया जाता है यदि उनका प्रतिबद्ध संदेश गलत प्रारूप में है।
इस हुक के लिए दिया गया एकमात्र तर्क उस फ़ाइल का नाम है जिसमें संदेश है। यदि आपको वह संदेश पसंद नहीं है जो उपयोगकर्ता ने दर्ज किया है, तो आप इस फ़ाइल को इन-प्लेस (जैसे कि prepare-commit-msg
) में बदल सकते हैं या आप एक गैर-शून्य स्थिति के साथ बाहर निकलने से पूरी तरह से प्रतिबद्ध को रद्द कर सकते हैं।
निम्न उदाहरण का उपयोग यह जांचने के लिए किया जाता है कि वचन संदेश पर एक नंबर के बाद टिकट शब्द मौजूद है या नहीं
word="ticket [0-9]"
isPresent=$(grep -Eoh "$word" $1)
if [[ -z $isPresent ]]
then echo "Commit message KO, $word is missing"; exit 1;
else echo "Commit message OK"; exit 0;
fi
स्थानीय हुक
स्थानीय हुक केवल स्थानीय रिपॉजिटरी को प्रभावित करते हैं जिसमें वे निवास करते हैं। प्रत्येक डेवलपर अपने स्वयं के स्थानीय हुक को बदल सकता है, इसलिए उन्हें एक प्रतिबद्ध नीति को लागू करने के तरीके के रूप में मज़बूती से उपयोग नहीं किया जा सकता है। वे डेवलपर्स के लिए कुछ दिशानिर्देशों का पालन करने और सड़क के नीचे संभावित समस्याओं से बचने के लिए आसान बनाने के लिए डिज़ाइन किए गए हैं।
छह प्रकार के स्थानीय हुक हैं: प्री-कमिट, प्री-कमेटी, एमएसएन, कमिट-एमएसएन, पोस्ट-कमेटी, पोस्ट-चेकआउट और प्री-रिबास।
पहले चार हुक कमिट्स से संबंधित हैं और आपको कमिट के जीवन चक्र में प्रत्येक भाग पर कुछ नियंत्रण रखने की अनुमति देते हैं। अंतिम दो आपको गिट चेकआउट और गिट रीबेस कमांड के लिए कुछ अतिरिक्त कार्रवाई या सुरक्षा जांच करने देते हैं।
सभी "पूर्व-" हुक आपको उस कार्रवाई को बदलने की अनुमति देते हैं जो कि होने वाली है, जबकि "पोस्ट-" हुक का उपयोग मुख्य रूप से सूचनाओं के लिए किया जाता है।
पोस्ट-चेकआउट
यह हुक post-commit
हुक के समान काम करता है, लेकिन जब भी आप सफलतापूर्वक चेक git checkout
साथ संदर्भ की जांच करते हैं तो इसे कॉल किया जाता है। यह स्वतः-जनरेट की गई फ़ाइलों की अपनी कार्यशील निर्देशिका को साफ़ करने के लिए एक उपयोगी उपकरण हो सकता है जो अन्यथा भ्रम का कारण होगा।
यह हुक तीन मापदंडों को स्वीकार करता है:
- पिछले HEAD का रेफरी,
- नए सिर की वापसी, और
- यदि यह शाखा चेकआउट या एक फ़ाइल चेकआउट (क्रमशः
1
या0
) था, तो एक ध्वज दर्शाता है।
इसकी निकास स्थिति का git checkout
कमांड पर कोई प्रभाव नहीं पड़ता है।
पोस्ट-प्रतिबद्ध
इस हुक को commit-msg
हुक के तुरंत बाद कहा जाता है। यह git commit
ऑपरेशन के परिणाम में परिवर्तन नहीं कर सकता है, इसलिए इसे मुख्य रूप से अधिसूचना उद्देश्यों के लिए उपयोग किया जाता है।
स्क्रिप्ट कोई पैरामीटर नहीं लेती है, और इसकी निकास स्थिति किसी भी तरह से प्रतिबद्ध को प्रभावित नहीं करती है।
पोस्ट-प्राप्त
इस हुक को एक सफल पुश ऑपरेशन के बाद कहा जाता है। यह आमतौर पर अधिसूचना प्रयोजनों के लिए उपयोग किया जाता है।
स्क्रिप्ट कोई पैरामीटर नहीं लेता है, लेकिन मानक इनपुट के माध्यम से pre-receive
सूचना के रूप में एक ही जानकारी भेजी जाती है:
<old-value> <new-value> <ref-name>
प्री-प्रतिबद्ध
यह हुक हर बार आपके द्वारा git commit
जाने के बारे में सत्यापित करने के git commit
, git commit
चलाने के लिए निष्पादित किया जाता है। आप इस हुक का उपयोग उस स्नैपशॉट का निरीक्षण करने के लिए कर सकते हैं जो प्रतिबद्ध होने वाला है।
इस प्रकार का हुक स्वचालित परीक्षणों को चलाने के लिए उपयोगी है, यह सुनिश्चित करने के लिए कि आने वाली प्रतिबद्ध आपके प्रोजेक्ट की मौजूदा कार्यक्षमता को नहीं तोड़ती है। इस प्रकार का हुक व्हॉट्सएप या ईओएल त्रुटियों की भी जांच कर सकता है।
पूर्व-प्रतिबद्ध स्क्रिप्ट में कोई तर्क पारित नहीं किया जाता है, और गैर-शून्य स्थिति के साथ बाहर निकलने से पूरी प्रतिबद्धता समाप्त हो जाती है।
तैयार-लिखें-msg
पाठ संपादक को एक प्रतिबद्ध संदेश के साथ पॉप्युलेट pre-commit
लिए pre-commit
हुक के बाद यह हुक कहा जाता है। यह आमतौर पर स्क्वैश या मर्ज किए गए कमिट के लिए स्वचालित रूप से उत्पन्न किए गए संदेशों को बदलने के लिए उपयोग किया जाता है।
इस हुक में एक से तीन तर्क दिए जाते हैं:
- एक अस्थायी फ़ाइल का नाम जिसमें संदेश होता है।
- कमिट का प्रकार, या तो
- संदेश (
-m
या-F
विकल्प), - टेम्पलेट (
-t
विकल्प), - मर्ज (यदि यह मर्ज कमिट है), या
- स्क्वैश (यदि यह अन्य आवागमन स्क्वैश कर रहा है)।
- संदेश (
- प्रासंगिक प्रतिबद्धता का SHA1 हैश। यह केवल तभी दिया जाता है यदि
-c
,-C
, या--amend
विकल्प दिया गया हो।
pre-commit
समान, एक गैर-शून्य स्थिति के साथ बाहर निकलना प्रतिबद्ध को समाप्त कर देता है।
पूर्व रिबेस
यह हुक कोड संरचना को बदलने के लिए git rebase
शुरू होने से पहले कहा जाता है। यह हुक आमतौर पर यह सुनिश्चित करने के लिए उपयोग किया जाता है कि रिबास ऑपरेशन उचित है।
यह हुक 2 पैरामीटर लेता है:
- श्रृंखला है कि ऊपर से forked शाखा थी, और
- शाखा को विद्रोह किया जा रहा है (वर्तमान शाखा को पुन: व्यवस्थित करते समय खाली)।
आप एक गैर-शून्य स्थिति के साथ बाहर निकलकर रिबास संचालन को समाप्त कर सकते हैं।
प्री-प्राप्त
इस हुक को हर बार क्रियान्वित किया जाता है, जब कोई रिपॉजिटरी में आने के लिए पुश git push
का उपयोग करता है। यह हमेशा दूरस्थ रिपॉजिटरी में रहता है जो पुश का गंतव्य है और मूल (स्थानीय) रिपॉजिटरी में नहीं है।
किसी भी संदर्भ को अपडेट करने से पहले हुक चलता है। इसका उपयोग आमतौर पर किसी भी प्रकार की विकास नीति को लागू करने के लिए किया जाता है।
स्क्रिप्ट कोई पैरामीटर नहीं लेती है, लेकिन जो प्रत्येक रेफरी को धकेला जा रहा है, उसे निम्न प्रारूप में मानक इनपुट पर एक अलग लाइन पर स्क्रिप्ट में भेजा जाता है:
<old-value> <new-value> <ref-name>
अपडेट करें
यह हुक pre-receive
बाद कहा जाता है, और यह उसी तरह काम करता है। कुछ भी वास्तव में अपडेट होने से पहले इसे कॉल किया जाता है, लेकिन प्रत्येक रेफ के लिए अलग-अलग कॉल किया जाता है, जो एक बार में सभी रेफल्स के बजाय धकेल दिया गया था।
यह हुक निम्नलिखित 3 तर्क स्वीकार करता है:
- रेफरी का नाम अद्यतन किया जा रहा है,
- रेफरी में संग्रहीत पुरानी वस्तु का नाम, और
- रेफरी में संग्रहीत नई वस्तु का नाम।
यह वही सूचना है जिसे pre-receive
करने के लिए पारित किया गया है, लेकिन चूंकि प्रत्येक रेफ के लिए update
अलग से मंगवाया गया है, आप दूसरों को अनुमति देते समय कुछ रेफरी को अस्वीकार कर सकते हैं।
पूर्व धक्का
Git 1.8.2 और इसके बाद के संस्करण में उपलब्ध है।
हालांकि एक पुश को जाने से रोकने के लिए प्री-पुश हुक का इस्तेमाल किया जा सकता है। इसकी मददगार होने की वजहों में शामिल हैं: यदि कोई स्थापित चेक फेल होता है (यूनिट टेस्ट, सिंटैक्स) तो आकस्मिक मैनुअल ब्लॉक करने से विशिष्ट शाखाओं को धक्का लगता है, या ब्लॉकिंग पुश होता है।
एक प्री-पुश हुक केवल pre-push
तहत .git/hooks/
, और ( गोच अलर्ट ) नामक एक फ़ाइल बनाकर बनाया जाता है, जिससे यह सुनिश्चित होता है कि फ़ाइल निष्पादन योग्य है: chmod +x ./git/hooks/pre-push
।
हन्ना वोल्फ से एक उदाहरण यह है कि मास्टर के लिए एक धक्का ब्लॉक:
#!/bin/bash
protected_branch='master'
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [ $protected_branch = $current_branch ]
then
read -p "You're about to push master, is that what you intended? [y|n] " -n 1 -r < /dev/tty
echo
if echo $REPLY | grep -E '^[Yy]$' > /dev/null
then
exit 0 # push will execute
fi
exit 1 # push will not execute
else
exit 0 # push will execute
fi
यहाँ Volkan Unsal से एक उदाहरण दिया गया है जो यह सुनिश्चित करता है कि पुश की अनुमति देने से पहले RSpec परीक्षण पास हो जाए:
#!/usr/bin/env ruby
require 'pty'
html_path = "rspec_results.html"
begin
PTY.spawn( "rspec spec --format h > rspec_results.html" ) do |stdin, stdout, pid|
begin
stdin.each { |line| print line }
rescue Errno::EIO
end
end
rescue PTY::ChildExited
puts "Child process exit!"
end
# find out if there were any errors
html = open(html_path).read
examples = html.match(/(\d+) examples/)[0].to_i rescue 0
errors = html.match(/(\d+) errors/)[0].to_i rescue 0
if errors == 0 then
errors = html.match(/(\d+) failure/)[0].to_i rescue 0
end
pending = html.match(/(\d+) pending/)[0].to_i rescue 0
if errors.zero?
puts "0 failed! #{examples} run, #{pending} pending"
# HTML Output when tests ran successfully:
# puts "View spec results at #{File.expand_path(html_path)}"
sleep 1
exit 0
else
puts "\aCOMMIT FAILED!!"
puts "View your rspec results at #{File.expand_path(html_path)}"
puts
puts "#{errors} failed! #{examples} run, #{pending} pending"
# Open HTML Ooutput when tests failed
# `open #{html_path}`
exit 1
end
जैसा कि आप देख सकते हैं, बहुत सारी संभावनाएं हैं, लेकिन अगर अच्छी चीजें हुईं तो कोर टुकड़ा exit 0
से exit 0
, और अगर बुरी चीजें हुईं तो exit 1
। जब भी आप exit 1
से exit 1
, तो पुश को रोक दिया जाएगा और आपका कोड उस स्थिति में होगा, जो git push...
चलाने से पहले था।
क्लाइंट साइड हुक का उपयोग करते समय, ध्यान रखें कि उपयोगकर्ता एक धक्का पर "--no- सत्यापित" विकल्प का उपयोग करके सभी क्लाइंट साइड हुक को छोड़ सकते हैं। यदि आप प्रक्रिया को लागू करने के लिए हुक पर भरोसा कर रहे हैं, तो आप जल सकते हैं।
प्रलेखन: https://git-scm.com/docs/githooks#_pre_push
आधिकारिक नमूना: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample
करने से पहले मावेन बिल्ड (या अन्य बिल्ड सिस्टम) को सत्यापित करें
.git/hooks/pre-commit
#!/bin/sh
if [ -s pom.xml ]; then
echo "Running mvn verify"
mvn clean verify
if [ $? -ne 0 ]; then
echo "Maven build failed"
exit 1
fi
fi
स्वचालित रूप से आगे कुछ रिपॉजिटरी में कुछ पुश करता है
post-receive
हुक का उपयोग किसी अन्य रिपॉजिटरी में आने वाले पुश को स्वचालित रूप से आगे बढ़ाने के लिए किया जा सकता है।
$ cat .git/hooks/post-receive
#!/bin/bash
IFS=' '
while read local_ref local_sha remote_ref remote_sha
do
echo "$remote_ref" | egrep '^refs\/heads\/[A-Z]+-[0-9]+$' >/dev/null && {
ref=`echo $remote_ref | sed -e 's/^refs\/heads\///'`
echo Forwarding feature branch to other repository: $ref
git push -q --force other_repos $ref
}
done
इस उदाहरण में, egrep
regexp एक विशिष्ट शाखा प्रारूप की तलाश में है (यहाँ: JIRA-12345 जिसका उपयोग जीरा मुद्दों के नाम के लिए किया गया है)। यदि आप सभी शाखाओं को अग्रेषित करना चाहते हैं, तो आप इस भाग को छोड़ सकते हैं।