गिट हुक को रिपॉजिटरी में डालना


198

क्या यह एक बुरा अभ्यास माना जाता है - .git/hooksपरियोजनाओं के भंडार में डाल देना (उदाहरण के लिए, सीमलिंक का उपयोग करना)। यदि हाँ, तो अलग-अलग गिट उपयोगकर्ताओं को एक ही हुक देने का सबसे अच्छा तरीका क्या है?

जवाबों:


143

मैं आमतौर पर कुछ अतिरिक्त सुझावों के साथ, स्केल के साथ सहमत हूं, पर्याप्त है कि यह एक अलग उत्तर के लायक है।

सबसे पहले, आपको एक स्क्रिप्ट लिखनी चाहिए जो उपयुक्त सिम्बल बनाता है, खासकर यदि ये हुक नीति लागू करने या उपयोगी सूचनाएं बनाने के बारे में हैं। लोगों को हुक का उपयोग करने की बहुत अधिक संभावना होगी यदि वे केवल टाइप कर सकते हैं 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

6
मैंने इसे काम करने के chmod +x .git/hooks/*लिए आपके साथ जोड़ा bin/create-hook-symlinks
गनियुस

6
@guneysus आपको इसकी आवश्यकता नहीं होनी चाहिए, क्योंकि हुक पहले से ही निष्पादन योग्य होना चाहिए (उन्हें उस तरह से जांचा जाना चाहिए) और लिंक को किसी विशेष अनुमति की आवश्यकता नहीं है, बस वे जिस फ़ाइल से लिंक करते हैं।
कैस्केबेल

13
हुक डायर प्राप्त करने का एक बेहतर तरीका है HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
अर्नोल्ड डेनियल्स

2
मैंने अपनी परियोजना में हुक का प्रबंधन करने के लिए इस पर आधारित एक सरल प्रणाली लगाई है
ELLIOTTCAL

6
मैंने सिर्फ आवश्यक
वस्तुएं लीं

111

नहीं, उन्हें भंडार में रखना ठीक है, मैं भी ऐसा करने का सुझाव दूंगा (यदि वे दूसरों के लिए भी उपयोगी हों)। उपयोगकर्ता को उन्हें स्पष्ट रूप से सक्षम करना है (जैसा कि आपने कहा था, उदाहरण के लिए सहानुभूति से), जो एक तरफ थोड़ा दर्द होता है, लेकिन दूसरी ओर उपयोगकर्ताओं को उनकी सहमति के बिना मनमाना कोड चलाने से बचाता है।


13
यदि यह एक कंपनी की नीति की बात है, तो कोड "मनमाना" नहीं है यह आवश्यक कोड है, इसलिए इसे जीआईटी में एक सीमा माना जाएगा, जिसके लिए एक और (पूर्व-परिभाषित) निर्देशिका नहीं है, जिसे ट्रैक किया जाता है, जो भी मिलता है नियमित हुक के साथ निष्पादित
टोबियास हेगनबीक

14
स्वचालित रूप से हुक पहुंचाना एक सुरक्षा मुद्दा है, मुझे खुशी है कि Git यह सीधे-सीधे नहीं करता है - टीम / कंपनी नीति को लागू करने के लिए, सर्वर साइड पर हुक का उपयोग करें या उपयोगकर्ताओं को मैन्युअल रूप से उन्हें @Scy के रूप में सक्षम करने का निर्णय लेने दें :)
मार्क के कोवन

4
"उपयोगकर्ताओं को उनकी सहमति के बिना मनमाने कोड चलाने से बचाता है ..."। यदि कोई डेवलपर आपको सुझाव देता है (सहानुभूति) तो हुक किसी और के द्वारा बदला जा सकता है, और "उनकी सहमति के बिना मनमाना कोड" चला सकते हैं
MiniGod

24
मिनीगॉड: बेशक। यदि आप पर्याप्त रूप से पागल हैं, तो आप उन्हें सममित करने के बजाय हुक की प्रतिलिपि बना सकते हैं, फिर उनका ऑडिट कर सकते हैं, और उसके बाद ही उन्हें सक्षम कर सकते हैं। हालांकि, अधिकांश (उद्धरण आवश्यक) Git रिपॉजिटरी में स्रोत कोड होगा जो उपयोगकर्ता की मशीन पर चलाया जाना है, इसलिए आपको वैसे भी लगातार बदलते, बिना कोड के चलने की संभावना है। लेकिन हां, आपको एक बात मिल गई है। ;)
scy

47

आजकल आप एक निर्देशिका सेट करने के लिए निम्नलिखित कर सकते हैं जो कि आपके नियंत्रण के अंतर्गत आपके गिट हुक निर्देशिका, उदाहरण के लिए, MY_REPO_DIR/.githooksहोगा

git config --local core.hooksPath .githooks/

अभी भी सीधे लागू नहीं है लेकिन, यदि आप अपने README (या जो भी) में एक नोट जोड़ते हैं, तो इसके लिए प्रत्येक डेवलपर के हिस्से पर न्यूनतम प्रयास की आवश्यकता होती है।


3
एक ट्रिक जो मुझे viget.com/articles/two-ways-to-share-git-hooks-with-your-team पर मिली है, वह है अपने Makefile / CMake config / जो भी से विकल्प सेट करना है।
जूलियस बुलिंगर

6

से http://git-scm.com/docs/git-init#_template_directory , आप .git अद्यतन करने के लिए / प्रत्येक नव निर्मित Git रेपो की निर्देशिका हुक इन तंत्रों में से एक इस्तेमाल कर सकते हैं:

टेम्प्लेट डायरेक्टरी में फाइलें और निर्देशिकाएं होती हैं, जिन्हें $ GIT_DIR में बनाए जाने के बाद कॉपी किया जाएगा।

टेम्प्लेट डायरेक्टरी निम्नलिखित में से एक होगी (क्रम में):

  • --template विकल्प के साथ दिया गया तर्क;

  • $ GIT_TEMPLATE_DIR पर्यावरण चर की सामग्री;

  • init.templateDir कॉन्फ़िगरेशन चर; या

  • डिफ़ॉल्ट टेम्पलेट निर्देशिका: / usr / शेयर / गिट-कोर / टेम्पलेट्स।


5

प्रोजेक्ट में स्टोर करें और बिल्ड में इंस्टॉल करें

जैसा कि अन्य लोग अपने जवाब में कहते हैं, यदि आपके हुक आपके विशेष प्रोजेक्ट्स के लिए विशिष्ट हैं, तो उन्हें प्रोजेक्ट में ही शामिल करें, जिसे 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",
      "...": "..."
    }
  }
}

अन्य

इसके अतिरिक्त, पायथन प्रोजेक्ट्स के लिए प्री- कमेटी है , रूबी प्रोजेक्ट्स के लिए ओवरकैमिट , और रूबी या डायोड प्रोजेक्ट्स के लिए लेफ्थुक


1
इस प्लगइन को बनाने के लिए धन्यवाद, इसने मेरी प्री-कमिट फ़ाइल को सुपर आसान बना दिया।
मिकिएल बुगर


1

यहां एक स्क्रिप्ट है, 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-- मैंने आसान सवाल का जवाब दिया जो कि नहीं पूछा गया था और वह नहीं था जो ओपी देख रहा था। मैंने रेपो बनाम स्क्रिप्ट के शिपिंग-स्क्रिप्ट के उपयोग-मामलों और तर्कों का विरोध किया। आशा है कि आप के लिए देख रहे थे और अधिक था।


मैं आपके प्रयास की सराहना करता हूं और विश्वास करता हूं कि हालांकि यहां एक बहुमूल्य जानकारी है - यह कहा गया प्रश्न का उत्तर नहीं देता है।
शबूनक

मेरी राय में, यदि हुक एक विशेष भंडार के लिए विशिष्ट हैं या उपयोग किए जाने वाले वर्कफ़्लोज़ के अभिन्न अंग हैं तो वे फ़ाइलों के रूप में भंडार में हैं। इसे हल करने की तुलना में अधिक समस्याएं पैदा किए बिना उन्हें कहीं और रखना मुश्किल है। आप सामान्य हुक को अपने स्वयं के भंडार में या एक साझा ड्राइव पर संग्रहीत कर सकते हैं जो परियोजना रेपो को साफ रख सकता है लेकिन बहुत कम व्यावहारिक होने की कीमत पर। मैं अन्य उपयोगकर्ताओं से यह कहते हुए सहमत हूं कि हुक को जोड़ना आसान होना चाहिए। प्रतीकात्मक लिंक एक विशेष प्रणाली या फ़ाइल संरचना पर अनावश्यक निर्भरता पैदा कर सकते हैं।
मैथ्यूगुएस्ट

इसके अतिरिक्त, प्रतीकात्मक लिंक अपने हुक जोड़ने के लिए उपयोगकर्ताओं की क्षमता को तोड़ते हैं। .गित / हुक निर्देशिका को ट्रैक नहीं किया जाता है, इसलिए स्रोत को भंडार में शुरू करना चाहिए और इसे हुक स्क्रिप्ट में बनाना चाहिए, न कि दूसरे तरीके से। मुझे लगता है कि प्रतिवाद यह होगा कि गिट हुक परियोजना के बजाय वर्कफ़्लो या टीम से अधिक संबंधित होते हैं और इस प्रकार भंडार में नहीं होते हैं। आपके विशिष्ट उपयोग के मामले के आधार पर, क्या आप कम-संबंधित हुक वाले संभावित रूप से गिट रिपॉजिटरी को प्रदूषित करने के साथ अधिक ठीक हैं या आप उन्हें कहीं और लगाने में जटिलता का एक गुच्छा नहीं छोड़ेंगे?
मैथ्यूगुएस्ट

1

संगीतकार आधारित 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नियमित आधार पर चल रहा है ।


0

आप के लिए एक प्रबंधित समाधान इस्तेमाल कर सकते हैं पूर्व प्रतिबद्ध तरह हुक प्रबंधन पूर्व प्रतिबद्ध । या Datree.io की तरह सर्वर-साइड गिट-हुक के लिए एक केंद्रीकृत समाधान । इसमें अंतर्निहित नीतियां हैं जैसे:

  1. रहस्यों का पता लगाना और उनका विलय रोकना ।
  2. उचित Git उपयोगकर्ता कॉन्फ़िगरेशन लागू करें
  3. जीरा टिकट एकीकरण लागू करें - पुल अनुरोध नाम / प्रतिबद्ध संदेश में टिकट संख्या का उल्लेख करें।

यह आपके सभी हुक को प्रतिस्थापित नहीं करेगा, लेकिन यह आपके डेवलपर्स को हर डेवलपर्स कंप्यूटर / रेपो पर हुक स्थापित करने के कॉन्फ़िगरेशन नरक के बिना सबसे स्पष्ट लोगों के साथ मदद कर सकता है।

डिस्क्लेमर: मैं डेट्राइटर्स संस्थापकों में से एक हूं


3
मुझे लगता है कि आप एक दिलचस्प उत्पाद बना रहे हैं, लेकिन मुझे यह भी लगता है कि यह सवाल का जवाब नहीं देता है और मूल रूप से एक आत्म-प्रचार है और इससे अधिक कुछ नहीं है।
shabunc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.