मास्टर शाखा में रोकें


84

(सरलता के लिए) मेरी एक masterशाखा है और devमेरे गिट-रेपो में। मैं यह सुनिश्चित करना चाहता हूं कि masterशाखा हमेशा काम कर रही है, इसलिए मेरे द्वारा किए जाने वाले सभी कार्य devशाखा में होने चाहिए ।

हालाँकि, जब मैं मर्ज के साथ अपने परिवर्तनों को मिलाता हूं, तो मैं शाखा --no-ffमें रहना चाहता हूं master, और बस इसमें काम करना जारी रखता हूं (क्योंकि मैं अपनी devशाखा की जांच करना भूल जाता हूं )।

क्या मैं masterशाखा के लिए एक नियम रख सकता हूं , जिसमें कहा गया है कि मैं कमिट नहीं कर सकता हूं, और तेजी से आगे विलय कर सकता हूं, लेकिन केवल --no-ffदूसरी शाखा से विलय होता है?

यह निजी होस्टेड रिपॉजिटरी के लिए काम करना चाहिए (एर्गो नॉट जीथहब और बिटबकेट)।


4
"तेजी से आगे बढ़ना" कोई बात नहीं है। कमिट सिर्फ कमिटमेंट हैं, git commitएक नया बनाते हैं, कोई तेजी से आगे बढ़ने वाला नहीं है। ऐसा लगता है कि आप बस सामान्य आवागमन को रोकना चाहते हैं जब वर्तमान शाखा होती है master, जिस स्थिति में, pre-commitहुक में देखें।
torek

जवाबों:


154

हाँ यह संभव है। आपको प्री-कमिट हुक बनाना होगा जो मास्टर ब्रांच में आने वाले रिजेक्ट्स को खारिज करता है। जब आप मर्ज कमांड को कॉल करते हैं , तो Git प्री-कमिट हुक को कॉल नहीं करता है , इसलिए यह हुक केवल नियमित कमिट्स को खारिज कर देगा।

  1. अपने भंडार पर जाएँ।
  2. निम्नलिखित सामग्री के साथ फ़ाइल .git / हुक / पूर्व- बनाएं :

    #!/bin/sh
    
    branch="$(git rev-parse --abbrev-ref HEAD)"
    
    if [ "$branch" = "master" ]; then
      echo "You can't commit directly to master branch"
      exit 1
    fi
    
  3. इसे निष्पादन योग्य बनाएं ( विंडोज पर आवश्यक नहीं ):

    $ chmod +x .git/hooks/pre-commit
    

तेज़- फ़ॉर - मर्ज को अक्षम करने के लिए आपको अपने .git / config फ़ाइल में निम्न विकल्प भी जोड़ना होगा :

[branch "master"]
    mergeoptions = --no-ff

यदि आप अपने रिमोट पर मास्टर शाखा की रक्षा करना चाहते हैं, तो इस उत्तर की जांच करें: गिट पर मास्टर शाखा तक पहुंच कैसे प्रतिबंधित करें


यह बिल्कुल वैसा ही दिखता है जैसा मुझे चाहिए - क्या यह विंडोज में भी काम करता है?
रासमस बॉक्कगार्ड

2
@ RasmusB Rkgaard हाँ यह होगा: हुक के लिए बैश स्क्रिप्ट की व्याख्या Git bash द्वारा विंडोज के लिए Git में शामिल की जाएगी। (आपको सिर्फ चामोद कदम की आवश्यकता नहीं है)
VONC

नोट: आप अपने आप masterको प्री-पुश हुक में दूरस्थ शाखा में धकेलने से भी रोक सकते हैं । ex: gist.github.com/aaronhoffman/ffbfd36928f9336be2436cffe39feaec
हारून हॉफमैन

4
प्रोजेक्ट रिपॉजिटरी में इन नियमों या अन्य गिट हुक को जोड़ने का तरीका खोजने वाले किसी भी व्यक्ति के लिए अच्छा है, इस सरल npm पैकेज की जांच करें: github.com/kilianc/sared-git-hooks , क्योंकि आप कुछ भी शामिल नहीं कर सकते हैं जो इसके अंतर्गत है। रिपोजिटरी में .IT डायरेक्टरी।
जॉर्ज दिमित्रिदिस

9
इसके अलावा, यह केवल हमारे स्थानीय git रेपो के लिए है, हम सभी डेवलपर्स के लिए अलग-अलग git repos में नियमों को कैसे लागू कर सकते हैं बिना उन्हें मैन्युअल रूप से .it निर्देशिका की सामग्री को बदलने के?
अलेक्जेंडर मिल्स

13

आप ऐसा करने के लिए पूर्व-प्रतिबद्ध उपयोगिता का उपयोग कर सकते हैं । इसमें एक बिल्ट इन no-commit-to-branchहुक है जो एक या अधिक शाखाओं में आने से रोकने के लिए इस्तेमाल किया जा सकता है।

सेट अप

मूल सेटअप प्रक्रिया है:

  • पाइप या काढ़ा ( https://pre-commit.com/#install पर निर्देश ) का उपयोग करके स्थापित करें
  • .pre-commit-config.yamlअपनी परियोजना की जड़ में एक फ़ाइल बनाएँ (पहले मसौदे के लिए नीचे देखें)
  • अपने git config में हुक लगाकर चलाएं pre-commit install

शाखाओं की सुरक्षा के लिए बुनियादी विन्यास

यहाँ एक बुनियादी विन्यास है जिसमें सिर्फ no-commit-to-branchहुक शामिल है:

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master']

यदि आप कई शाखाओं की सुरक्षा करना चाहते हैं, तो आप --branchतर्क सूची में कई args शामिल कर सकते हैं :

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master', '--branch', 'staging']

क्या यह सब खत्म नहीं हुआ है?

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


7

यह समझदारी से इसे विश्व स्तर पर स्थापित कर सकता है

git config --global core.hooksPath ~/githooks

और pre-commitउस निर्देशिका में उस फ़ाइल को ले जाना


क्या होगा अगर मेरे पास कई रिपॉजिटरी हैं - क्या यह उन सभी को प्रभावित नहीं करेगा?
रासमस बोकगार्ड

1
और यही है कि आप ज्यादातर मामलों में क्या कर सकते हैं
मिशेल सैमिया

कहो कि मेरे पास यह अजीब परियोजना है, जहां उनका नाम बदल दिया masterगया है Production- क्या अपवाद किए जा सकते हैं?
रासमुस बाकगार्ड

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