क्या Git हुक स्क्रिप्ट को रिपॉजिटरी के साथ प्रबंधित किया जा सकता है?


336

हम कुछ मूल हुक स्क्रिप्ट बनाना चाहते हैं जो हम सभी साझा कर सकते हैं - पूर्व-स्वरूपित प्रतिबद्ध संदेशों जैसी चीजों के लिए। Git में हुक स्क्रिप्ट्स हैं जो सामान्य रूप से संग्रहीत हैं <project>/.git/hooks/। हालांकि, उन लिपियों का प्रचार तब नहीं किया जाता है जब लोग क्लोन करते हैं और वे संस्करण नियंत्रित नहीं होते हैं।

क्या सभी को सही हुक स्क्रिप्ट प्राप्त करने में मदद करने का एक अच्छा तरीका है? क्या मैं उन हुक स्क्रिप्ट्स को अपने रेपो में संस्करण नियंत्रित स्क्रिप्ट्स की ओर इंगित कर सकता हूं?


5
एक अच्छा सवाल। मैं केवल यह चाहता हूं कि एक बेहतर उत्तर था (@mipadi के लिए कोई शिकायत नहीं होने के साथ, मैं चाहता हूं कि git के पास अधिक स्वचालित तरीके से ऐसा करने का एक तरीका था - भले ही वह केवल क्लोन क्लोन के लिए निर्दिष्ट विकल्प के साथ हो।)
lindes

मैं सहमत हूँ, @lindes! लेकिन शायद जानबूझकर हुक के इस बंटवारे को प्रतिबंधित करना? विंडोज उपयोगकर्ताओं के लिए चीजें गड़बड़ हो जाएंगी, मुझे लगता है।
kristianlm

@kristianlm: कई तरह के कारण हैं जो कई बार गन्दे हो सकते हैं ... और कई बार जब इसे वहाँ करना अच्छा लगता है। काश कुछ विकल्प या ऐसा कुछ होता जो हुक की नकल करता। मुझे लगता है कि मुझे कुछ समय पहले गिट-कोर कोड की जांच करनी होगी, और एक पैच बनाना होगा। :) (या आशा है कि कोई और करता है ... या
मिपाडी

pre-commitपूर्व-प्रतिबद्ध हुक के लिए यह आसान बनाता है। किसी भी मनमाने ढंग से गिट हुक के प्रबंधन के बारे में ओपी के सवाल का जवाब नहीं देता है, लेकिन पूर्व-प्रतिबद्ध हुक संभवतः कोड गुणवत्ता प्रयोजनों के लिए सबसे अधिक बार उपयोग किए जाते हैं।
एरिटोको

जवाबों:


143

सैद्धांतिक रूप से, आप hooksअपनी परियोजना निर्देशिका में सभी लिपियों के साथ एक निर्देशिका (या जो भी नाम आप पसंद करते हैं) बना सकते हैं, और फिर उन्हें इसमें जोड़ सकते हैं .git/hooks। बेशक, प्रत्येक व्यक्ति जिसने रेपो पर क्लोन किया था, उसे इन सीमलिंक को स्थापित करना होगा (हालांकि आप वास्तव में फैंसी प्राप्त कर सकते हैं और एक तैनात स्क्रिप्ट है कि क्लोनर उन्हें स्वचालित रूप से सेट करने के लिए चला सकता है)।

सिम्लिंक को * निक्स पर करने के लिए आपको बस इतना करना है:

root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"

ln -sfयदि आप इस बारे में बताने के लिए तैयार हैं कि क्या उपयोग करना है.git/hooks


38
यह गैर-तुच्छ था, इसलिए मैं ठीक से सहानुभूति रखने के लिए एक कड़ी सहित हूं: stackoverflow.com/questions/4592838/…
डेविड टी।

17
git संस्करण 2.9 में अब core.hooksPathहुक फ़ोल्डर से लिंक करने के लिए .it के बाहर एक फ़ाइल सेट करने के लिए एक कॉन्फ़िगर विकल्प है ।
आरोन राबिनोविट्ज

215

में Git 2.9 , विन्यास विकल्प core.hooksPathएक कस्टम हुक निर्देशिका निर्दिष्ट करता है।

hooksअपने रिपॉजिटरी में अपने हुक को ट्रैक की गई डायरेक्टरी में ले जाएँ । फिर, इसके बजाय ट्रैक किए गए उपयोग के लिए रिपॉजिटरी के प्रत्येक उदाहरण को कॉन्फ़िगर करें :hooks$GIT_DIR/hooks

git config core.hooksPath hooks

सामान्य तौर पर, मार्ग निरपेक्ष या उस निर्देशिका के सापेक्ष हो सकता है जहां हुक चलाए जाते हैं (आमतौर पर काम करने वाले पेड़ की जड़; DESCRIPTION अनुभाग देखें man githooks)।


15
... और हुक निर्देशिका को इंगित करने के लिए अलग हुक रिपॉजिटरी हो सकता है;)
रेने लिंक

10
जब आप एक क्लोन क्लोन करते हैं, तो क्या यह कॉन्फिगर पैरामीटर ऑटो सेट है?
रिंग

4
एक नियम के रूप में git config वैरिएबल उस रिपॉजिटरी द्वारा सेट नहीं किया जा सकता है जिसे आप क्लोन कर रहे हैं। मुझे लगता है कि यह मनमाने कोड के निष्पादन को रोकने के लिए है। git config, हुक के माध्यम से कोड के निष्पादन, प्रतिबद्ध संदेशों पर उपयोगकर्ता नाम और अन्य महत्वपूर्ण कार्यों को नियंत्रित करता है।
मैक्स शेनफील्ड

1
क्या होगा यदि टीम में कोई व्यक्ति किसी अन्य शाखा में एक git चेकआउट करता है? उन्हें हर शाखा में इसे शामिल करना होगा ..
जोकर

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

15

यदि आपकी परियोजना एक जावास्क्रिप्ट परियोजना है और आप npmपैकेज मैनेजर के रूप में उपयोग करते हैं, तो आप githooks को लागू करने के लिए साझा-गिट-हुक का उपयोग कर सकते हैं npm install


5
अब मुझे पता है कि किसने घुसपैठ की है उन लोगों को .git/hooks
गवेंको

चेतावनी - विंडोज का समर्थन नहीं करता है (जब तक कि इसे गिट बैश में व्यवस्थापक के रूप में नहीं चलाया जाता है)। पैकेज "स्क्रिप्ट" में स्क्रिप्ट के रूप में "प्रीइंस्टॉल": "git config core.hooksPath हुक" जोड़ना आसान उपाय है। यानी जहां हुक आपके git लिपियों वाला एक फ़ोल्डर है।
शेन गैनन

8

के लिए NodeJS उपयोगकर्ताओं एक सरल उपाय अद्यतन करने के लिए है package.json साथ

{
  "name": "name",
  "version": "0.0.1",
  ......
  "scripts": {
    "preinstall": "git config core.hooksPath hooks", 

इससे पहले प्रीइंस्टॉल चलेगा

npm स्थापित करें

और । हुक (या जो भी नाम आप चुनते हैं) निर्देशिका के अंदर हुक के लिए देखने के लिए पुनर्निर्देशित करता है । इस निर्देशिका चाहिए नकल । \। Git \ हुक फ़ाइल नाम (ऋण .sample) और संरचना के संदर्भ में।

कल्पना कीजिए कि मावेन और अन्य बिल्ड टूल प्रीइंस्टॉल्ड के बराबर होंगे ।

यह सभी प्लेटफार्मों पर भी काम करना चाहिए।

यदि आपको किसी और जानकारी की आवश्यकता है तो https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/ देखें


5

कैसे git-hooks के बारे में , यह .git/hooksप्रोजेक्ट डायरेक्टरी के तहत स्क्रिप्ट में रूट करता है githooks

आपको कॉपी और सिमिंकल हुक को कम से कम करने के लिए बहुत सारी सुविधाएँ हैं।


5

अधिकांश आधुनिक प्रोग्रामिंग भाषाएं, या बल्कि उनके निर्माण उपकरण, गिट हुक का प्रबंधन करने के लिए प्लगइन्स का समर्थन करते हैं। इसका मतलब है कि आपको केवल अपना पैकेज कॉन्फ़िगर करना होगा। json, pom.xml, आदि, और आपकी टीम में किसी के पास बिल्ड फ़ाइल को बदलने तक अनुपालन करने के अलावा कोई विकल्प नहीं होगा। प्लगइन आपके लिए .IT निर्देशिका में सामग्री जोड़ देगा।

उदाहरण:

https://github.com/rudikershaw/git-build-hook

https://github.com/olukyrich/githook-maven-plugin

https://www.npmjs.com/package/git-hooks


मैंने अपनी परियोजनाओं में उपयोग करने के लिए इसे एक सामान्य तरीके से हासिल करने की कोशिश की, इसलिए मैंने यह उपकरण लिखा: pypi.org/project/hooks4git
Lovato

3

हम विजुअल स्टूडियो सॉल्यूशंस (और इस तरह के प्रोजेक्ट्स) का इस्तेमाल कर रहे हैं, जिसमें इवेंट्स के प्री और पोस्ट बिल्ड हैं। मैं 'GitHookDeployer' नाम की एक अतिरिक्त परियोजना जोड़ रहा हूं। प्रोजेक्ट स्वयं पोस्ट बिल्ड ईवेंट में एक फ़ाइल को संशोधित करता है। वह फ़ाइल बिल्ड डायरेक्टरी में कॉपी करने के लिए सेट है। इस प्रकार यह परियोजना हर बार बनती है और कभी नहीं छोड़ी जाती है। बिल्ड ईवेंट में, यह भी सुनिश्चित करता है कि सभी गिट हुक जगह में हैं।

ध्यान दें कि यह एक सामान्य समाधान नहीं है, क्योंकि कुछ परियोजनाएं, निश्चित रूप से, बनाने के लिए कुछ भी नहीं है।


2

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

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

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

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


1

आप अपने हुक फ़ोल्डर को एक और गिट रिपॉजिटरी बना सकते हैं और इसे एक सबमॉड्यूल के रूप में लिंक कर सकते हैं ... मुझे लगता है कि आपके पास बहुत सारे सदस्य हैं और हुक नियमित रूप से बदल गए हैं।


1

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

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

दो विकल्प

क) मल्टी लिपियों

आप अपनी मदद के अंदर अपने हुक को कोड कर सकते हैं, और अपनी सही स्क्रिप्ट को कॉल करने के लिए, हुक की एक छोटी सी टुकड़ी को इस तरह से जोड़ सकते हैं:

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js

बी) एकल स्क्रिप्ट

एक कूलर विकल्प कई लोगों के बजाय उन सभी पर शासन करने के लिए सिर्फ एक स्क्रिप्ट जोड़ना है। तो, आप एक हुक / mysuperhook.go बनाते हैं और हर उस हुक को इंगित करते हैं जो आप चाहते हैं।

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)

पैरामीटर आपकी स्क्रिप्ट प्रदान करेगा कि किस हुक को ट्रिगर किया गया था, और आप इसे अपने कोड के अंदर अंतर कर सकते हैं। क्यों? उदाहरण के लिए, कभी-कभी आप कमिट और पुश के लिए एक ही चेक चलाना चाहते हैं।

और तब?

फिर, आप आगे कार्य करना चाहते हो सकता है, जैसे:

  • हुक को मैन्युअल रूप से जांचने के लिए ट्रिगर करें कि क्या सब कुछ एक कमिट या पुश से पहले ठीक है। यदि आप अपनी स्क्रिप्ट कहते हैं (विकल्प a या b) तो चाल चलेगी।
  • CI पर ट्रिगर को ट्रिगर करता है, इसलिए आपको CI के लिए समान चेक को फिर से लिखने की आवश्यकता नहीं है, यह सिर्फ कमिट और पुश ट्रिगर को बुलाएगा, उदाहरण के लिए। ऊपर वाले को इसे हल करना चाहिए।
  • बाहरी उपकरणों को कॉल करें, जैसे मार्कडाउन वैलिडेटर, या यम एलएलडी वेलेरेटर। आप syscalls कर सकते हैं और STDOUT और STDERR को संभालने की आवश्यकता है।
  • सुनिश्चित करें कि सभी डेवलपर्स के पास हुक स्थापित करने का एक सरल तरीका है, इसलिए सही हुक के साथ डिफ़ॉल्ट हुक को बदलने के लिए भंडार में एक अच्छी स्क्रिप्ट को जोड़ने की आवश्यकता है
  • कुछ वैश्विक सहायक हों, जैसे कि चेक को ब्लॉक करने और मास्टर शाखाओं को विकसित करने के लिए, इसे हर भंडार में जोड़ने के लिए नहीं। आप इसे वैश्विक स्क्रिप्ट के साथ एक और रिपॉजिटरी के द्वारा हल कर सकते हैं।

क्या यह सरल हो सकता है?

हां, गिट-हुक का प्रबंधन करने में आपकी मदद करने के लिए कई उपकरण हैं। उनमें से प्रत्येक एक अलग दृष्टिकोण से समस्या से निपटने के लिए तैयार है, और आपको उन सभी को समझने की आवश्यकता हो सकती है जो आपको या आपकी टीम के लिए सबसे अच्छा है। GitHooks.com हुकिंग के बारे में बहुत कुछ पढ़ने और आज उपलब्ध कई उपकरण प्रदान करता है।

आज तक, वहाँ 21 परियोजनाओं को सूचीबद्ध करने के लिए अलग-अलग रणनीतियों के साथ गिट हुक का प्रबंधन करना है। कुछ केवल एक ही हुक के लिए करते हैं, कुछ एक विशिष्ट भाषा के लिए, और इतने पर।

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

गिट हुक का उपयोग करना बिल्कुल शानदार है, लेकिन जिस तरह से उन्हें पेश किया जाता है वह केवल लोगों को इससे दूर करता है।


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

1

ग्रेडेल उपयोगकर्ताओं के लिए

मुझे इन स्क्रिप्ट्स को ग्रेडल प्रोजेक्ट्स के लिए बहुत उपयोगी लगा।

build.gradle

apply from: rootProject.file('gradle/install-git-hooks.gradle')

Gradle / स्थापित-Git-hooks.gradle

tasks.create(name: 'gitExecutableHooks') {
    doLast {
        Runtime.getRuntime().exec("chmod -R +x .git/hooks/");
    }
}
task installGitHooks(type: Copy) {
    from new File(rootProject.rootDir, 'pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}
gitExecutableHooks.dependsOn installGitHooks
clean.dependsOn gitExecutableHooks

पूर्व के लिए प्रतिबद्ध

.... your pre commit scripts goes here
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.