Git push gerrit क्यों होता है HEAD: git पुश ओरिजिन मास्टर के बजाय refs / for / Master का उपयोग किया जाता है


148

मैंने अभी-अभी जेरिट का उपयोग करना शुरू किया है और मैं जानना चाहता हूं कि हमें करने की git push gerrit HEAD:refs/for/masterबजाय करने की आवश्यकता क्यों हैgit push origin master

यदि मैं कहूं तो git push origin masterमुझे त्रुटि मिलेगी! [remote rejected] master -> master (prohibited by Gerrit)

जवाबों:


259

गेरिट के लिए प्रलेखन, विशेष रूप से "पुश चेंजेस" सेक्शन, यह बताता है कि आप " refs/for/'branch'किसी भी Git क्लाइंट टूल का उपयोग करके जादुई रेफरी " को धक्का देते हैं ।

निम्न चित्र इंट्रो से जेरिट के लिए लिया गया है । जब आप गेरिट को धक्का देते हैं, तो आप करते हैं git push gerrit HEAD:refs/for/<BRANCH>। यह आपके परिवर्तनों को स्टेजिंग क्षेत्र (आरेख, "लंबित परिवर्तन") में धकेलता है । गेरिट के पास वास्तव में एक शाखा नहीं है जिसे बुलाया जाता है <BRANCH>; यह गिट क्लाइंट के लिए निहित है।

आंतरिक रूप से, Gitit और SSH स्टैक के लिए Gerrit का अपना कार्यान्वयन है। यह इसे "जादुई" refs/for/<BRANCH>रिफ प्रदान करने की अनुमति देता है ।

जब इन नामस्थानों में से एक में रेफरी बनाने के लिए एक पुश अनुरोध प्राप्त होता है, तो जेरिट डेटाबेस को अपडेट करने के लिए अपना तर्क करता है, और फिर क्लाइंट को ऑपरेशन के परिणाम के बारे में बताता है। एक सफल परिणाम क्लाइंट को यह विश्वास दिलाने का कारण बनता है कि गेरिट ने रेफ बनाया है, लेकिन वास्तव में गेरिट ने रेफ को बिल्कुल नहीं बनाया है। [ लिंक - गेरिट, "ग्रिट्टी डिटेल्स" ]।

जेरिट वर्क

एक सफल पैच के बाद (यानी, पैच को जेरिट के पास धकेल दिया गया, [इसे "लंबित परिवर्तन" मंचन क्षेत्र में डाल दिया गया], समीक्षा की गई और समीक्षा पास हो गई), गेरिट ने "लंबित परिवर्तन" से परिवर्तन को "में" धकेल दिया ऑथरिटिव रिपॉजिटरी ", यह गणना करती है कि किस शाखा ने उसे उस जादू के आधार पर धकेल दिया है जब आपने उसे धक्का दिया था refs/for/<BRANCH>। इस तरह, सफलतापूर्वक समीक्षा की गई पैच सीधे सही शाखाओं से खींचे जा सकते हैं Authoritative Repository


जिज्ञासा से बाहर, वास्तव में क्या होता है अगर आप "गिट पुश ओरिजिन" जैसा कुछ करते हैं? मैंने इसकी कोशिश की और कहीं भी बदलाव नहीं देख सकता, इस प्रकार प्रश्न। लेकिन यह स्वाभाविक रूप से मेरे स्थानीय लॉग में मौजूद है।

1
@Pintolaranja मैंने वही किया। आप सही हैं, गेरिट ऐसी स्थिति को "हैंडल" करता है, लेकिन यह कोई बदलाव नहीं करता है। तो वास्तव में, यह इसे बिल्कुल भी नहीं संभालता है। जो वास्तव में मुझे परेशान करता है, क्योंकि यह वास्तव में बेवकूफी है। उपयोगकर्ता को कुछ करने की अनुमति क्यों दें, कि गेरिट ठीक से संभाल नहीं पा रहा है?
ट्रेडर

1
@ वल्ब हाँ। तीर कमान के स्रोत और गंतव्य को इंगित करते हैं, इसके परिणामस्वरूप कोई भी बाद का डेटा प्रवाह नहीं। उदाहरण के लिए डेवलपर 1 को आधिकारिक रिपॉजिटरी में लाने का मुद्दा है, न कि दूसरे तरीके से
गैरेथ

5
@trejder यह अनुमति देता है कि क्योंकि गेरिट आपको कुछ खातों को समीक्षा को बायपास करने के लिए कॉन्फ़िगर करने की अनुमति देता है। डिफ़ॉल्ट शाखा पर जोर देकर आप प्रभावी रूप से कह रहे हैं "मैं इस बदलाव को बिना समीक्षा के मर्ज करना चाहता हूं।" यदि आपको ऐसा करने की अनुमति नहीं है, तो पुश विफल हो जाता है।
होन्शेल

4
या आप गेरिट का उपयोग नहीं कर सकते हैं और इस उल्लसित गंदगी से पूरी तरह से बच सकते हैं।
C जॉनसन

57

जीआईटी पुश कमांड को पूरी तरह से निर्दिष्ट करने से बचने के लिए आप वैकल्पिक रूप से अपनी गिट विन्यास फाइल को संशोधित कर सकते हैं:

[remote "gerrit"]
    url = https://your.gerrit.repo:44444/repo
    fetch = +refs/heads/master:refs/remotes/origin/master
    push = refs/heads/master:refs/for/master

अब आप बस:

git fetch gerrit
git push gerrit

यह गेरिट के अनुसार है


1
मुझ से +1! यह remote.origin.pushहर तरह से टाइप / पेस्ट करने के बजाय मेरे लिए इस हार्ड-कोडेड होने का तरीका है !
दावेन

7
@ सीनमर्फी आप 'मास्टर' के उदाहरणों को '*' से बदलकर इसे और सामान्य बना सकते हैं ताकि 'git push gerrit TopicBranch' जैसा भी काम हो जाए।
डेविड डोरिया

इसके अलावा, अगर जेरिट आपका एकमात्र रिमोट है, तो आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है। मैं बस करता हूं git fetchऔर git pushऊपर उल्लिखित config @DavidDoria के साथ।
बेरनक

push = refs / heads / *: refs / for / * सभी शाखाओं के लिए है
विक्टर चोय

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