2012-05-05 14 views
110

मैं सिर्फ Gerrit का उपयोग प्रारंभ कर के स्थान पर प्रयोग और मुझे पता है कि क्यों हम बजाय git push origin masterGit धक्का Gerrit HEAD क्यों है: refs/के लिए/मास्टर Git धक्का मूल मास्टर

कर रहा हैं की git push gerrit HEAD:refs/for/master करने की जरूरत है चाहता हूँ ऐसा git push origin master मैं ! [remote rejected] master -> master (prohibited by Gerrit)

उत्तर

203

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

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

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

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

The Gerrit workflow

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

+6

यह एक सुंदर जवाब है। धन्यवाद :) – Shrayas

+0

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

+1

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

37

ताकि पूरी तरह से Git धक्का आदेश आप वैकल्पिक रूप से अपना Git कॉन्फ़िग फ़ाइल को संशोधित कर सकता है निर्दिष्ट करने के लिए होने से बचने के लिए: अब

[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 

यह Gerrit

के अनुसार है
+1

+1 से +1! यह हर बार टाइप/पेस्ट करने के बजाय मेरे 'remote.origin.push' के लिए यह कड़ी-कोडित है। – DaoWen

+0

एक आकर्षण की तरह काम करता है –

+5

@ सेनमुर्फी आप 'मास्टर' के उदाहरणों को '*' के साथ बदलकर इसे अधिक सामान्य बना सकते हैं ताकि 'गिट पुश गेरिट टॉपिक ब्रंच' जैसी कुछ भी काम करेगी। –

संबंधित मुद्दे