जवाबों:
मैं आमतौर पर कुछ अतिरिक्त सुझावों के साथ, स्केल के साथ सहमत हूं, पर्याप्त है कि यह एक अलग उत्तर के लायक है।
सबसे पहले, आपको एक स्क्रिप्ट लिखनी चाहिए जो उपयुक्त सिम्बल बनाता है, खासकर यदि ये हुक नीति लागू करने या उपयोगी सूचनाएं बनाने के बारे में हैं। लोगों को हुक का उपयोग करने की बहुत अधिक संभावना होगी यदि वे केवल टाइप कर सकते हैं bin/create-hook-symlinks
यदि उन्हें स्वयं करना है।
दूसरा, सीधे सहानुभूति हुक अपने स्वयं के व्यक्तिगत हुक में उपयोगकर्ताओं को जोड़ने से रोकता है। उदाहरण के लिए, मैं नमूना पूर्व-प्रतिबद्ध हुक को पसंद करता हूं जो यह सुनिश्चित करता है कि मेरे पास कोई व्हाट्सएप त्रुटियां नहीं हैं। इसके चारों ओर एक शानदार तरीका यह है कि आप अपने रेपो में एक हुक रैपर स्क्रिप्ट को छोड़ दें, और सभी हुक को इसके साथ जोड़ दें। रैपर तब जांच कर सकता है $0
(यह एक बैश स्क्रिप्ट है; एक समान समरूप argv[0]
) यह पता लगाने के लिए कि यह किस हुक के रूप में लागू किया गया था, फिर अपने रेपो के भीतर उपयुक्त हुक और साथ ही उपयुक्त उपयोगकर्ता के हुक का भी नाम बदलें। प्रत्येक के लिए सभी तर्कों को पारित करना। स्मृति से त्वरित उदाहरण:
#!/bin/bash
if [ -x $0.local ]; then
$0.local "$@" || exit $?
fi
if [ -x tracked_hooks/$(basename $0) ]; then
tracked_hooks/$(basename $0) "$@" || exit $?
fi
इंस्टॉलेशन स्क्रिप्ट सभी पूर्व-मौजूदा हुक को किनारे पर ले जाएगी ( .local
उनके नामों के लिए संलग्न करें), और उपरोक्त स्क्रिप्ट के सभी ज्ञात हुक नामों को सिमिलिंक करें:
#!/bin/bash
HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc"
# assuming the script is in a bin directory, one level into the repo
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
for hook in $HOOK_NAMES; do
# If the hook already exists, is executable, and is not a symlink
if [ ! -h $HOOK_DIR/$hook -a -x $HOOK_DIR/$hook ]; then
mv $HOOK_DIR/$hook $HOOK_DIR/$hook.local
fi
# create the symlink, overwriting the file if it exists
# probably the only way this would happen is if you're using an old version of git
# -- back when the sample hooks were not executable, instead of being named ____.sample
ln -s -f ../../bin/hooks-wrapper $HOOK_DIR/$hook
done
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
।
नहीं, उन्हें भंडार में रखना ठीक है, मैं भी ऐसा करने का सुझाव दूंगा (यदि वे दूसरों के लिए भी उपयोगी हों)। उपयोगकर्ता को उन्हें स्पष्ट रूप से सक्षम करना है (जैसा कि आपने कहा था, उदाहरण के लिए सहानुभूति से), जो एक तरफ थोड़ा दर्द होता है, लेकिन दूसरी ओर उपयोगकर्ताओं को उनकी सहमति के बिना मनमाना कोड चलाने से बचाता है।
आजकल आप एक निर्देशिका सेट करने के लिए निम्नलिखित कर सकते हैं जो कि आपके नियंत्रण के अंतर्गत आपके गिट हुक निर्देशिका, उदाहरण के लिए, MY_REPO_DIR/.githooks
होगा
git config --local core.hooksPath .githooks/
अभी भी सीधे लागू नहीं है लेकिन, यदि आप अपने README (या जो भी) में एक नोट जोड़ते हैं, तो इसके लिए प्रत्येक डेवलपर के हिस्से पर न्यूनतम प्रयास की आवश्यकता होती है।
से http://git-scm.com/docs/git-init#_template_directory , आप .git अद्यतन करने के लिए / प्रत्येक नव निर्मित Git रेपो की निर्देशिका हुक इन तंत्रों में से एक इस्तेमाल कर सकते हैं:
टेम्प्लेट डायरेक्टरी में फाइलें और निर्देशिकाएं होती हैं, जिन्हें $ GIT_DIR में बनाए जाने के बाद कॉपी किया जाएगा।
टेम्प्लेट डायरेक्टरी निम्नलिखित में से एक होगी (क्रम में):
--template विकल्प के साथ दिया गया तर्क;
$ GIT_TEMPLATE_DIR पर्यावरण चर की सामग्री;
init.templateDir कॉन्फ़िगरेशन चर; या
डिफ़ॉल्ट टेम्पलेट निर्देशिका: / usr / शेयर / गिट-कोर / टेम्पलेट्स।
जैसा कि अन्य लोग अपने जवाब में कहते हैं, यदि आपके हुक आपके विशेष प्रोजेक्ट्स के लिए विशिष्ट हैं, तो उन्हें प्रोजेक्ट में ही शामिल करें, जिसे git द्वारा प्रबंधित किया गया है। मैं इसे और भी आगे ले जाऊंगा और यह कहते हुए कि आपके प्रोजेक्ट का निर्माण एक स्क्रिप्ट या कमांड का उपयोग करके किया जाना अच्छा है, बिल्ड के दौरान आपके हुक स्थापित होने चाहिए।
मैंने गिट हुक के प्रबंधन के बारे में एक लेख लिखा था , यदि आप इस बारे में थोड़ा और गहराई से पढ़ने में रुचि रखते हैं।
पूर्ण अस्वीकरण; मैंने नीचे वर्णित मेवेन प्लगइन लिखा है।
यदि आप अपने जावा प्रोजेक्ट्स के लिए मावेन के साथ बिल्ड मैनेजमेंट संभाल रहे हैं, तो निम्न मावेन प्लगइन आपके प्रोजेक्ट में किसी लोकेशन से हुक स्थापित करने का काम करता है।
https://github.com/rudikershaw/git-build-hook
अपने सभी गिट हुक को अपनी परियोजना में एक निर्देशिका में रखें, फिर pom.xml
निम्नलिखित प्लगइन घोषणा, लक्ष्य और कॉन्फ़िगरेशन को शामिल करने के लिए अपने कॉन्फ़िगर करें ।
<build>
<plugins>
<plugin>
<groupId>com.rudikershaw.gitbuildhook</groupId>
<artifactId>git-build-hook-maven-plugin</artifactId>
<configuration>
<gitConfig>
<!-- The location of the directory you are using to store the Git hooks in your project. -->
<core.hooksPath>hooks-directory/</core.hooksPath>
</gitConfig>
</configuration>
<executions>
<execution>
<goals>
<!-- Sets git config specified under configuration > gitConfig. -->
<goal>configure</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- ... etc ... -->
</plugins>
</build>
जब आप अपना प्रोजेक्ट बनाते हैं तो प्लगइन निर्दिष्ट निर्देशिका से हुक चलाने के लिए git कॉन्फ़िगर करेगा। यह प्रभावी रूप से आपके प्रोजेक्ट पर काम करने वाले सभी लोगों के लिए उस निर्देशिका में हुक स्थापित करेगा।
एनपीएम के लिए हस्की नामक एक निर्भरता है जो आपको जावास्क्रिप्ट में लिखे गए हुक सहित हुक लगाने की अनुमति देती है।
// package.json
{
"husky": {
"hooks": {
"pre-commit": "npm test",
"pre-push": "npm test",
"...": "..."
}
}
}
इसके अतिरिक्त, पायथन प्रोजेक्ट्स के लिए प्री- कमेटी है , रूबी प्रोजेक्ट्स के लिए ओवरकैमिट , और रूबी या डायोड प्रोजेक्ट्स के लिए लेफ्थुक ।
Https://www.npmjs.com/package/pre-commit अपने package.json में NPM पैकेज हैंडल इस सुंदर ढंग से आप निर्दिष्ट करने की अनुमति पहले से प्रतिबद्ध हुक।
यहां एक स्क्रिप्ट है, add-git-hook.sh, जिसे आप रिपॉजिटरी में एक नियमित फ़ाइल के रूप में शिप कर सकते हैं और स्क्रिप्ट फ़ाइल में गिट हुक को जोड़ने के लिए निष्पादित किया जा सकता है। समायोजित करें कि किस हुक का उपयोग किया जाए (पूर्व-कमेंट, पोस्ट-कमिट, प्री-पुश, आदि) और बिल्ली के हुक में हुक की परिभाषा।
#!/usr/bin/bash
# Adds the git-hook described below. Appends to the hook file
# if it already exists or creates the file if it does not.
# Note: CWD must be inside target repository
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
HOOK_FILE="$HOOK_DIR"/post-commit
# Create script file if doesn't exist
if [ ! -e "$HOOK_FILE" ] ; then
echo '#!/usr/bin/bash' >> "$HOOK_FILE"
chmod 700 "$HOOK_FILE"
fi
# Append hook code into script
cat >> "$HOOK_FILE" <<EOF
########################################
# ... post-commit hook script here ... #
########################################
EOF
यह स्क्रिप्ट निष्पादन योग्य अनुमतियों को समझ सकती है या उपयोगकर्ता इसे सीधे चला सकते हैं। मेरे द्वारा प्रतिबद्ध होने के बाद मैंने इसका उपयोग अन्य मशीनों पर स्वचालित रूप से करने के लिए किया।
EDIT-- मैंने आसान सवाल का जवाब दिया जो कि नहीं पूछा गया था और वह नहीं था जो ओपी देख रहा था। मैंने रेपो बनाम स्क्रिप्ट के शिपिंग-स्क्रिप्ट के उपयोग-मामलों और तर्कों का विरोध किया। आशा है कि आप के लिए देख रहे थे और अधिक था।
संगीतकार आधारित PHP परियोजनाओं के लिए आप इंजीनियरों को स्वचालित रूप से वितरित कर सकते हैं। यहां पूर्व-प्रतिबद्ध और प्रतिबद्ध-एमएस हुक के लिए एक उदाहरण है।
एक hooks
फ़ोल्डर बनाएँ , फिर अपने कंपोज़र में। json:
},
"scripts": {
"post-install-cmd": [
"cp -r 'hooks/' '.git/hooks/'",
"php -r \"copy('hooks/pre-commit', '.git/hooks/pre-commit');\"",
"php -r \"copy('hooks/commit-msg', '.git/hooks/commit-msg');\"",
"php -r \"chmod('.git/hooks/pre-commit', 0777);\"",
"php -r \"chmod('.git/hooks/commit-msg', 0777);\"",
],
फिर आप उन्हें अपडेट भी कर सकते हैं क्योंकि परियोजना जारी है क्योंकि हर कोई composer install
नियमित आधार पर चल रहा है ।
आप के लिए एक प्रबंधित समाधान इस्तेमाल कर सकते हैं पूर्व प्रतिबद्ध तरह हुक प्रबंधन पूर्व प्रतिबद्ध । या Datree.io की तरह सर्वर-साइड गिट-हुक के लिए एक केंद्रीकृत समाधान । इसमें अंतर्निहित नीतियां हैं जैसे:
यह आपके सभी हुक को प्रतिस्थापित नहीं करेगा, लेकिन यह आपके डेवलपर्स को हर डेवलपर्स कंप्यूटर / रेपो पर हुक स्थापित करने के कॉन्फ़िगरेशन नरक के बिना सबसे स्पष्ट लोगों के साथ मदद कर सकता है।
डिस्क्लेमर: मैं डेट्राइटर्स संस्थापकों में से एक हूं
chmod +x .git/hooks/*
लिए आपके साथ जोड़ाbin/create-hook-symlinks
।