Git: केवल एक रिमोट सेट करें?


132

जब मैं git remote -vअपने Git रिपॉजिटरी में से एक में चलाता हूं जिसमें एक रिमोट (s) कॉन्फ़िगर किया गया है, तो मैं देखता हूं कि प्रत्येक रिमोट में दोनों स्पेक्स और पुश स्पेक्स हैं:

$ git remote -v
<remote-name> ssh://host/path/to/repo (fetch)
<remote-name> ssh://host/path/to/repo (push)

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


4
@ नहीं, नहीं, आप नहीं कर सकते। कोई निर्दिष्ट URL नहीं होने के कारण, पुश URL URL का उपयोग करेगा।
योयो

जवाबों:


191

मुझे नहीं लगता कि आप पुश URL को हटा सकते हैं , आप केवल पुल URL के अलावा कुछ और होने के लिए इसे ओवरराइड कर सकते हैं । इसलिए मुझे लगता है कि आपको जो निकटतम मिलेगा वह कुछ इस तरह है:

$ git remote set-url --push origin no-pushing
$ git push
fatal: 'no-pushing' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

आप पुश URL सेट कर रहे हैं no-pushing, जब तक, आपके पास अपनी कार्यशील निर्देशिका में समान नाम का फ़ोल्डर नहीं है, git का पता लगाने में सक्षम नहीं होगा। आप अनिवार्य रूप से एक स्थान का उपयोग करने के लिए गिट मजबूर कर रहे हैं जो मौजूद नहीं है।


14
हाँ, आपको लगता है कि "git रिमोट सेट-url --delete --push। *" ट्रिक करेगा, लेकिन यदि आप पुश url को हटाते हैं तो यह वापस url में आ जाता है।
योयो

6
मैं व्यक्तिगत रूप से ' डिसलाइड ' जैसी किसी चीज़ का उपयोग अधिक पसंद करता हूं । लेकिन यह सिर्फ स्वाद की बात है।
पियरे-ओलिवियर वेर्स

@ पियरे-ओलिवियरवेयर 'डोनटश' के बारे में क्या ? ' :)
अली शाकिबा

FYI करें, ऐसा करने के बाद आपकी git config फाइल इस तरह दिखनी चाहिए: (नए पुशुरल विकल्प पर ध्यान दें ) [रिमोट " ओरिजिनल "] लाने के लिए = + refs / heads / *: refs / remotes / origin / * url = ssh // // host / पाथ / टू / रेपो पुशुरल = एसश: // होस्ट / नो-पुशिंग / रेपो
जयविलियम्स

1
इसी तरह @ पियरे-ओलिवियरवेयर्स के साथ, मैं गया git remote set-url --push origin -- --read-only--- --प्रमुख डैश के साथ एक नाम की अनुमति देने के लिए अतिरिक्त ध्यान दें । यह मुझे अधिक पठनीय लगा।
lindes

13

पुश URL को कुछ अमान्य (जैसे git remote set-url --push origin DISABLED) में बदलने के अलावा , कोई भी उपयोग कर सकता हैpre-push हुक का ।

रोकने के लिए एक त्वरित तरीका हुक होने के git pushलिए सिमलिंक /usr/bin/falseकरना है:

$ ln -s /usr/bin/false .git/hooks/pre-push
$ git push
error: failed to push some refs to '...'

हुक का उपयोग करने पर यदि वांछित हो तो धकेलने के अधिक बारीक नियंत्रण की अनुमति देता है। .git/hooks/pre-push.sampleवर्क-इन-प्रोग्रेस को आगे बढ़ाने से रोकने के तरीके के उदाहरण के लिए देखें ।

किसी विशिष्ट शाखा की ओर धकेलने से रोकने के लिए या किसी एक शाखा में धकेलने को सीमित करने के लिए, यह एक उदाहरण हुक में है:

$ cat .git/hooks/pre-push
#!/usr/bin/sh

# An example hook script to limit pushing to a single remote.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If this script exits with a non-zero status nothing will be pushed.

remote="$1"
url="$2"

[[ "$remote" == "origin" ]]

कई रीमेक के साथ एक टेस्ट रेपो:

$ git remote -v
origin  ../gitorigin (fetch)
origin  ../gitorigin (push)
upstream        ../gitupstream (fetch)
upstream        ../gitupstream (push)

पुश करने originकी अनुमति है:

$ git push origin
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 222 bytes | 222.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../gitorigin
 * [new branch]      master -> master

किसी अन्य रिमोट पर पुश करने की अनुमति नहीं है:

$ git push upstream
error: failed to push some refs to '../gitupstream'

ध्यान दें कि pre-pushहुक स्क्रिप्ट को संशोधित किया जा सकता है, अन्य बातों के अलावा, स्टेंडर को एक संदेश प्रिंट करें जिसमें कहा गया है कि पुश अक्षम कर दिया गया है।


अच्छा विचार! अधिक विस्तृत स्क्रिप्ट के बिना आप सभी रीमोट के लिए पुश अक्षम कर देंगे।
v01pe

1
@ v01pe हाँ। मैंने एक उदाहरण स्क्रिप्ट शामिल करने के लिए उत्तर अपडेट किया है। यह वास्तव में एक एकल शाखा को धक्का फिल्टर करने के लिए बहुत जरूरत नहीं है। एक शेल ऑनलाइनर करेगा।
रोडोल्फो कारवाल्हो

4

सामान्य बयान "गिट एक गैर-नंगे भंडार पर धकेलने से इनकार करेगा" सच नहीं है। यदि आप एक ही शाखा पर होने वाले परिवर्तनों को दूरस्थ रिपॉजिटरी के चेक-आउट कार्य निर्देशिका के रूप में करने का प्रयास कर रहे हैं, तो गिट केवल एक गैर-नंगे रिमोट रिपॉजिटरी में धकेलने से इंकार करेगा।

यह उत्तर एक सरल व्याख्या देता है: https://stackoverflow.com/a/2933656/1866402

(मैं इसे एक उत्तर के रूप में जोड़ रहा हूं क्योंकि मेरे पास अभी तक टिप्पणियां जोड़ने के लिए पर्याप्त प्रतिष्ठा नहीं है)


एक नंगे रिपॉजिटरी की परिभाषा के अनुसार कोई चेक-आउट कार्यशील निर्देशिका नहीं है। आप हालांकि उस पर एक विशेष शाखा को धक्का दे सकते हैं,
एड Randall

1

यदि आपके पास पहले से ही एक रिमोट सेट अप है और आप अपने आप को कुछ ऐसा करने से रोकना चाहते हैं जैसे गलती से सीधे धक्का देना masterया release/production, तो आप इस उपयोग को रोक सकते हैं git config

# prevent pushing to branch: master
$ git config branch.master.pushRemote no_push

# prevent pushing to branch: release/production
$ git config branch.release/production.pushRemote no_push

रिकॉर्ड के लिए, no_pushएक विशेष नाम नहीं है। यह केवल किसी भी नगण्य शाखा का नाम है। तो आप उपयोग कर सकते हैं$ git config branch.master.pushRemote create_a_pr_and_do_not_push_directly_to_master और यह ठीक काम करेगा।

अधिक जानकारी: git-config pushRemote


0

यदि आपके पास रिपॉजिटरी पर नियंत्रण है, तो आप अनुमतियों का उपयोग करके इसे प्राप्त कर सकते हैं। रिपॉजिटरी लाने वाले उपयोगकर्ता के पास मास्टर रिपॉजिटरी पर लिखने की अनुमति नहीं होनी चाहिए।


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