से निपटने के लिए एक गिट पोस्ट-प्राप्त हुक लिखना यहां एक नंगे रेपो में मेरा वर्तमान हुक है जो कंपनी के सर्वर में रहता है: git push origin master
यह हुक असेंबला को धक्का देता है। मुझे केवल एक शाखा (मास्टर, आदर्श) को धक्का देना है जब कोई हमारे सर्वर पर उस शाखा में परिवर्तन को धक्का देता है, और अन्य शाखाओं को धक्का देता है। क्या एक नंगे रेपो से शाखा का चयन करना संभव है और केवल उस शाखा को असेंबला में धक्का देना संभव है?एक विशिष्ट शाखा
उत्तर
आखिरी पैरामीटर जो पोस्ट-प्राप्त हुक stdin पर हो जाता है वह है कि क्या रेफ बदल दिया गया था, इसलिए हम इसका उपयोग यह जांचने के लिए कर सकते हैं कि वह मान "refs/head/master" था या नहीं। क्या मैं एक में उपयोग करने के लिए इसी तरह के गहरे लाल रंग का एक छोटा सा हुक के बाद प्राप्त होता है:
STDIN.each do |line|
(old_rev, new_rev, ref_name) = line.split
if ref_name =~ /master/
# do your push
end
end
ध्यान दें कि यह प्रत्येक रेफरी कि धकेल दिया गया के लिए एक लाइन हो जाता है, इसलिए यदि आप सिर्फ मास्टर की तुलना में अधिक धक्का दे दिया, यह अभी भी काम करेंगे।
रूबी उदाहरण के लिए धन्यवाद। मैं इस तरह कुछ करने जा रहा हूँ। – Leif
स्टीफन का जवाब मेरे लिए काम नहीं किया था, लेकिन this किया:
#!/bin/bash
echo "determining branch"
if ! [ -t 0 ]; then
read -a ref
fi
IFS='/' read -ra REF <<< "${ref[2]}"
branch="${REF[2]}"
if [ "master" == "$branch" ]; then
echo 'master was pushed'
fi
if [ "staging" == "$branch" ]; then
echo 'staging was pushed'
fi
echo "done"
मेरे लिए एक साधारण नाम (मास्टर, टेस्ट इत्यादि) के साथ शाखाओं के लिए काम किया, लेकिन जब मेरे पास शाखा का नाम है: prod12/proj250/ropesPatch12। यह अच्छी तरह से काम नहीं करता है। क्या आपके पास ऐसा समाधान है जो उन विशेष पात्रों के साथ काम कर सकता है? –
एक के बाद प्राप्त हुक रूप <oldrev> <newrev> <refname>
में, stdin से अपने तर्कों हो जाता है। चूंकि ये तर्क stdin से आ रहे हैं, कमांड लाइन तर्क से नहीं, आपको $1 $2 $3
के बजाय read
का उपयोग करने की आवश्यकता है।
बाद प्राप्त हुक (अगर कोई एक git push --all
करता है उदाहरण के लिए) एक साथ कई शाखाओं प्राप्त कर सकते हैं, तो हम भी एक while
पाश में read
रैप करने के लिए की जरूरत है।
#!/bin/bash
while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ "master" == "$branch" ]; then
# Do something
fi
done
इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। – jackyalcine
"==" मेरे लिए काम नहीं करता है। एकल "=" मेरे साथ काम करता है। – Ray
यह अजीब है। डबल बराबर और एकल बराबर दोनों ठीक काम करना चाहिए (देखें http://stackoverflow.com/questions/2600281/what-is-the-difference-between-operator-and-in-bash)। क्या आप संभवतः बाश के अलावा कुछ और उपयोग कर रहे हैं? भले ही, आपको इसके लिए एक फिक्स मिल गया। – pauljz
न तो:
एक कार्य टुकड़ा कुछ इस तरह लग रहा है। बहुत अधिक, डिबगिंग के बाद, यह पता चला है कि 'read' कमांड का उपयोग करना काम नहीं करता है - इसके बजाए, कमांड लाइन तर्कों को पार्स करना सामान्य तरीके से ठीक काम करता है।
यहां सटीक पोस्ट-अपडेट हुक है जिसे मैंने अभी सफलतापूर्वक CentOS 6.3 पर परीक्षण किया है।
#!/bin/bash
echo "determining branch"
branch=`echo $1 | cut -d/ -f3`
if [ "master" == "$branch" ]; then
echo "master branch selected"
fi
if [ "staging" == "$branch" ]; then
echo "staging branch selected"
fi
exec git update-server-info
अद्यतन: एक और भी अजनबी नोट पर, पूर्व प्राप्त हुक stdin के माध्यम से अपने इनपुट लेता है, इसलिए (वाह, कभी नहीं सोचा था कि मैं कहना है कि चाहते हैं) 'पढ़ा' के साथ पढ़ें। पोस्ट-अपडेट हुक अभी भी मेरे लिए $ 1 के साथ काम करता है।
इसके लायक होने के लिए, उपर्युक्त समाधान काम नहीं कर सकते हैं क्योंकि वे विशेष रूप से 'पोस्ट-अपडेट' हुक के लिए हैं, न कि 'पोस्ट-अपडेट' हुक। वे अपना इनपुट विभिन्न तरीकों से लेते हैं। – pauljz
'पोस्ट-प्राप्त'' यहां नोटिस के रूप में stdin लेता है: https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks – h4xnoodle
मैंने इस कार्यक्षमता को करने के लिए स्वयं के लिए एक PHP स्क्रिप्ट लिखी थी।
https://github.com/fotuzlab/githubdump-php
होस्ट अपने सर्वर पर इस फाइल को प्राथमिकता रेपो जड़ और GitHub webhooks में URL निर्दिष्ट करें। अपनी शाखा के नाम के साथ लाइन 8 पर 'allcommits' बदलें और लाइन कोड पर अपना कोड/फ़ंक्शन जोड़ें।
उदा।
function githubdump($payload_object) {
// Write your code here.
exec('git push origin master');
}
@pauljz pre-push
जैसे कुछ Git हुक के लिए ठीक काम करता है से जवाब बारे में अधिक जानकारी के लिए, लेकिन pre-commit
करता है उन चरों तक पहुंच नहीं है oldrev newrev refname
इसलिए मैंने यह वैकल्पिक संस्करण बनाया जो प्री-प्रतिबद्ध, या वास्तव में और हुक के लिए काम करता है। यह pre-commit
हुक है जो husky
स्क्रिप्ट चलाएगा यदि हम master
शाखा पर नहीं हैं।
#!/bin/bash
# git 'commit' does not have access to these variables: oldrev newrev refname
# So get the branch name off the head
branchPath=$(git symbolic-ref -q HEAD) # Something like refs/heads/myBranchName
branch=${branchPath##*/} # Get text behind the last/of the branch path
echo "Head: $branchPath";
echo "Current Branch: $branch";
if [ "master" != "$branch" ]; then
# If we're NOT on the Master branch, then Do something
# Original Pre-push script from husky 0.14.3
command_exists() {
command -v "$1" >/dev/null 2>&1
}
has_hook_script() {
[ -f package.json ] && cat package.json | grep -q "\"$1\"[[:space:]]*:"
}
cd "frontend" # change to your project directory, if .git is a level higher
# Check if precommit script is defined, skip if not
has_hook_script precommit || exit 0
# Node standard installation
export PATH="$PATH:/c/Program Files/nodejs"
# Check that npm exists
command_exists npm || {
echo >&2 "husky > can't find npm in PATH, skipping precommit script in package.json"
exit 0
}
# Export Git hook params
export GIT_PARAMS="$*"
# Run npm script
echo "husky > npm run -s precommit (node `node -v`)"
echo
npm run -s precommit || {
echo
echo "husky > pre-commit hook failed (add --no-verify to bypass)"
exit 1
}
fi
मुझे उम्मीद है कि किसी की मदद करेगा। आप अपनी आवश्यकताओं के लिए आसानी से संशोधित कर सकते हैं, if
और fi
कथन के बीच कुछ भी।
- 1. जीआईटी शाखा विशिष्ट फाइलें?
- 2. बल: एक विशिष्ट परिवर्तनीय प्रतिद्वंद्वी से शाखा
- 3. गिट - विशिष्ट शाखा से खींचने
- 4. मैं एक विशिष्ट शाखा में एक गिट खींच कैसे करूं?
- 5. मैं गिट में एक शाखा से दूसरे शाखा में एक विशिष्ट प्रतिबद्धता कैसे विलय करूं?
- 6. विशिष्ट टैग से SVN शाखा बनाएँ और
- 7. सबवर्सन - एक शाखा की शाखा
- 8. एक शाखा
- 9. एक विशिष्ट प्रतिबद्धता
- 10. Mercurial - एक नामित शाखा
- 11. उपयोग विशिष्ट एक विशिष्ट एक
- 12. एक शाखा है कि वर्तमान शाखा
- 13. विशिष्ट शाखा को पुश करने के लिए स्थानीय शाखा को कॉन्फ़िगर करें
- 14. एक SVN शाखा
- 15. एक अलग गिट शाखा
- 16. एक दूरस्थ शाखा
- 17. गिट एक और शाखा
- 18. एक खाली शाखा
- 19. एक दूरस्थ शाखा
- 20. एक 'अनचेक आउट' शाखा
- 21. एक विशेष शाखा देखें?
- 22. Git: एक अलग शाखा
- 23. फ़्लैटन एक शाखा
- 24. विभिन्न शाखाओं में विशिष्ट प्रतिबद्धता से शाखा कैसे बनाएं
- 25. सभी विशिष्ट उपयोगकर्ता से नई शाखा में कैसे चलते हैं?
- 26. गिट: विशिष्ट शाखाओं को दूसरी शाखा में ले जाएं
- 27. गीथब में एक शाखा से कांटा
- 28. (गिट): अपस्ट्रीम शाखा से विशिष्ट प्रतिबद्धता कैसे लाएं?
- 29. एक विशिष्ट
- 30. गिट शाखा मास्टर शाखा
आपका क्या मतलब है? 'गिट पुश मूल मास्टर' केवल 'मास्टर' शाखा को 'मूल' रिमोट पर धक्का देगी, जिसे मैं मानता हूं जिसे असेंबला माना जाता है। क्या आप कह रहे हैं कि आपको केवल 'हुक * ट्रिगर करने की आवश्यकता है जब कोई' मास्टर 'पर जाता है,' सुविधा 1 'के विपरीत, या ऐसा कुछ? –
@ स्टीफन बिल्कुल यही है। मुझे शब्द नहीं मिला, हे। –
डुप्लिकेट http://stackoverflow.com/questions/6372334/git-commit-hooks-per-branch – insign