पुश पुश त्रुटि: चेक आउट शाखा को अपडेट करने से इनकार करना


196

मैंने कुछ मर्ज संघर्षों को हल किया है, फिर अपने परिवर्तनों को धक्का देने की कोशिश की और निम्नलिखित त्रुटि प्राप्त की:

c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Development/GIT_Repo/Project
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'

क्या किसी को पता है कि इस त्रुटि का कारण क्या हो सकता है?


3
डुप्लिकेट किया गया: stackoverflow.com/questions/2816369/…
cregox

6
वास्तव में अब आपके पास Git 2.3.0 (फरवरी 2015) और git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309
VonC

जवाबों:


229

कारण: आप एक नॉन-बेयर रिपोजिटरी पर जोर दे रहे हैं

दो प्रकार के रिपॉजिटरी हैं: नंगे और गैर-नंगे

बेयर रिपॉजिटरी में काम की कॉपी नहीं होती है और आप उन्हें धक्का दे सकते हैं। Github में आपको मिलने वाले रिपॉजिटरी के प्रकार हैं! यदि आप नंगे भंडार बनाना चाहते हैं, तो आप उपयोग कर सकते हैं

git init --bare

तो, संक्षेप में, आप एक गैर-नंगे भंडार में धकेल नहीं सकते(संपादित करें: ठीक है, आप किसी रिपॉजिटरी की वर्तमान में चेक की गई शाखा को नहीं धकेल सकते हैं। नंगे रिपॉजिटरी के साथ, आप किसी भी शाखा में धकेल सकते हैं क्योंकि किसी की भी जाँच नहीं की जाती है। हालांकि, संभव है, गैर-नॉन रिपॉजिटरी में धकेलना आम नहीं है।) । आप क्या कर सकते हैं, दूसरे भंडार से लाना और मर्ज करना है। यह है pull requestकि आप गितूब कार्यों में कैसे देख सकते हैं। आप उन्हें आप से खींचने के लिए कहते हैं, और आप उनमें जोर-जबरदस्ती नहीं करते हैं।


अद्यतन : इस बात को इंगित करने के लिए वॉनसी के लिए धन्यवाद, नवीनतम गिट संस्करणों में (वर्तमान में 2.3.0), गैर-नंगे भंडार के चेक आउट शाखा को धकेलना संभव है । फिर भी, आप अभी भी एक गंदे काम करने वाले पेड़ को धक्का नहीं दे सकते हैं , जो वैसे भी एक सुरक्षित संचालन नहीं है।


1
हाँ! यह सही है धन्यवाद! जैसा कि मेरे पास करने के लिए लगभग एक लाख चीजें हैं, मैंने आकस्मिक रूप से काम करने वाली निर्देशिका को क्लोन किया है .... दोह!
फंकी

25
वास्तव में, आप एक गैर-नंगे भंडार को बस ठीक से धकेल सकते हैं, आप अभी उस एक शाखा को धक्का नहीं दे सकते हैं जिसे वर्तमान में चेक आउट किया गया है
आदमी

1
वास्तव में दर्जनों अन्य परिदृश्य हैं। उदाहरण के लिए, मेरे कुछ रिपॉजिटरी सिर्फ मेरे वर्कस्टेशन और मेरे लैपटॉप पर हैं (कोड नहीं, लेकिन नोट्स जो मैं लेता हूं)। प्रत्येक पर मेरी दो शाखाएँ हैं, "वर्कस्टेशन" और "लैपटॉप"। वर्कस्टेशन पर, मैं केवल "वर्कस्टेशन" की जांच करता हूं, और मैं केवल लैपटॉप (और इसके विपरीत) पर "वर्कस्टेशन" शाखा को धक्का देता हूं।
कहीं नहीं आदमी

8
वास्तव में अब आपके पास Git 2.3.0 (फरवरी 2015) और git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309
VonC

1
@ एस्सेली आपका क्लोन नंगे नहीं है, जबकि जीथब पर कॉपी। इसलिए, जब दोनों क्लोनों का सारा इतिहास है, तो जीथब पर कॉपी की कोई जांच नहीं की गई है, लेकिन आपकी कॉपी आपको काम करने की अनुमति देती है!
शहबाज

115

मैंने पहले इस समस्या को हल करके यह बताया कि रिमोट की कुछ भी जाँच नहीं की गई थी (यह वास्तव में माना नहीं गया था), और फिर उसे नंगे कर दिया:

$ git config --bool core.bare true

उसके बाद गिट पुश ने ठीक काम किया।


3
यह वन-लाइनर फिक्स है जिसकी मुझे तलाश थी .. लेकिन शायद नंगे-नंगे रेपो की तरह समझाएं जैसे @shahbaz जवाब
Mr5o1

यह परिवर्तन इतिहास को धकेलने की अनुमति देगा, लेकिन उन परिवर्तनों को गैर-नंगे रेपो में परिलक्षित नहीं किया जाएगा।
jhill515

आप करेंगे git config core.bare falseऔर git reset --hard ?
विमान

1
जब आप इसे धकेलते हैं तो रिमोट के ऊपर उल्लेख नहीं किया जाएगा।
user1097111

46

सारांश

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

चूंकि नंगे रिपॉजिटरी की कभी कोई शाखा नहीं है, इसलिए आप हमेशा नंगे रिपॉजिटरी की किसी भी शाखा में जा सकते हैं।

समस्या की शव परीक्षा

जब एक शाखा की जाँच की जाती है, तो कमिटिंग अपने माता-पिता के रूप में वर्तमान शाखा के प्रमुख के साथ एक नई प्रतिबद्धता जोड़ देगा और शाखा के प्रमुख को उस नई प्रतिबद्ध होने के लिए स्थानांतरित करेगा।

इसलिए

A ← B
    ↑
[HEAD,branch1]

हो जाता है

A ← B ← C
        ↑
    [HEAD,branch1]

लेकिन अगर कोई उस शाखा में घुस सकता है, तो उपयोगकर्ता खुद को इस बात से अवगत कराएगा कि हेड मोड अलग क्या है:

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

अब उपयोगकर्ता अब शाखा 1 में नहीं है, बिना स्पष्ट रूप से किसी अन्य शाखा की जांच करने के लिए कहा गया है। इससे भी बदतर, उपयोगकर्ता अब किसी भी शाखा के बाहर है , और कोई भी नई प्रतिबद्धता बस झूलती रहेगी :

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

हाइपोथेटिक रूप से, यदि इस बिंदु पर, उपयोगकर्ता एक और शाखा की जांच करता है, तो यह झूलती हुई प्रतिबद्धता गिट के कचरा कलेक्टर के लिए उचित खेल बन जाता है ।


मैं में एक सा विस्तार stackoverflow.com/questions/2816369/...
कहीं मनुष्य

21

रेपो / निर्देशिका में cd जो आप दूरस्थ मशीन पर धकेल रहे हैं और दर्ज करें

$ git config core.bare true

यह काम नहीं करता। इसमें धकेलने के बाद भंडार खाली हो जाता है।
सोरेन

जैसा कि ऊपर jhil515 द्वारा कहा गया है, गैर-नंगी फाइलें केवल डेटाबेस से अपडेट नहीं की जाती हैं।
डेनिस कजिनो

20

मेरे लिए, निम्नलिखित ने चाल चली:

git config --global receive.denyCurrentBranch updateInstead

मैंने अपने विंडोज 10 डेस्कटॉप और मेरे विंडोज 10 लैपटॉप के बीच सिंक करने के लिए Git का उपयोग करके ड्राइव F :, लगभग पूरी तरह से सेट किया है। मैंने दोनों मशीनों पर उपरोक्त कमांड चलाना शुरू किया।

पहले मैंने डेस्कटॉप की एफ ड्राइव को नेटवर्क पर साझा किया। तब मैं इसे चलाकर अपने लैपटॉप पर क्लोन कर सकता था:

F: git clone 'file://///DESKTOP-PC/f'

दुर्भाग्य से, सभी फाइलें मेरे लैपटॉप पर "F: \ f \" के तहत समाप्त हुईं, सीधे F: \ के तहत नहीं। लेकिन मैं उन्हें मैन्युअल रूप से काटने और पेस्ट करने में सक्षम था। Git ने फिर भी नए स्थान से काम किया।

फिर मैंने लैपटॉप पर फाइलों में कुछ बदलाव करने, उन्हें कमिट करने और उन्हें डेस्कटॉप पर वापस लाने की कोशिश की। जब तक मैंने ऊपर बताई गई git config कमांड नहीं चलाई, तब तक काम नहीं किया।

ध्यान दें कि मैंने इन सभी कमांड को विंडोज पॉवरशेल के भीतर से, दोनों मशीनों पर चलाया।

अद्यतन: मेरे पास अभी भी कुछ मामलों में परिवर्तन को धकेलने के मुद्दे थे। मैंने अंत में केवल इसके बजाय परिवर्तनों को खींचना शुरू कर दिया है, कंप्यूटर पर निम्नलिखित रन करके मैं नवीनतम कमिट (ओं) को खींचना चाहता हूं:

git pull --all --prune


1
मैं इस स्थानीय git config receive.denyCurrentBranch updateInstead
प्रतिनिधि प्रतिनिधि

14

जैसा कि पहले से ही एक मौजूदा भंडार है, चल रहा है

git config --bool core.bare true

दूरदराज के भंडार पर पर्याप्त होना चाहिए

Core.bare प्रलेखन से

अगर सच (नंगे = सच्चे), रिपॉजिटरी को माना जाता है कि वह बिना किसी काम के डायरेक्टरी से जुड़ा हुआ है। यदि यह मामला है तो कई कमांड्स को काम करने वाली निर्देशिका की आवश्यकता होती है, जैसे कि git-add या git-merge (लेकिन आप इसे पुश करने में सक्षम होंगे)।

जब रिपॉजिटरी बनाई जाती है तो यह सेटिंग स्वचालित रूप से गिट-क्लोन या गिट-इनिट द्वारा अनुमान लगाया जाता है। डिफ़ॉल्ट रूप से एक रिपॉजिटरी जो "/.it" में समाप्त होती है, उसे नंगे (नंगे = झूठे) नहीं माना जाता है, जबकि अन्य सभी रिपॉजिटरी को नंगे (नंगे = सच्चे) माना जाता है।


12

TLDR

  1. खींचो और फिर से धक्का git pull &&& git push:।
  2. फिर भी एक समस्या है? विभिन्न शाखा में धकेलें: git push origin master:fooऔर इसे दूरस्थ रेपो पर मर्ज करें।
  3. वैकल्पिक रूप से पुश को जोड़कर मजबूर करें -f( denyCurrentBranchअनदेखा करने की आवश्यकता है)।

मूल रूप से त्रुटि का मतलब है कि आपका रिपॉजिटरी दूरस्थ कोड के साथ अद्यतित नहीं है (इसका सूचकांक और कार्य ट्री आपके द्वारा पुश किए गए के साथ असंगत है)।

आम तौर पर आपको pullपहले हाल के बदलावों को प्राप्त करना चाहिए और pushइसे फिर से करना चाहिए ।

यदि मदद नहीं करेगा, तो विभिन्न शाखा में धकेलने का प्रयास करें, जैसे:

git push origin master:foo

फिर इस शाखा को मास्टर के साथ दूरस्थ रिपॉजिटरी में वापस मर्ज करें।

यदि आपने कुछ अतीत को जानबूझकर बदल दिया है git rebaseऔर आप अपने परिवर्तनों के साथ रेपो को ओवरराइड करना चाहते हैं, तो आप संभवतः पुश -f/ --forceपैरामीटर जोड़कर जोर लगाना चाहते हैं (यदि आप ऐसा नहीं करते हैं तो अनुशंसित नहीं rebase)। यदि फिर भी काम नहीं करेगा, तो आपको एक git संदेश के माध्यम से सुझाए गए रिमोट पर सेट receive.denyCurrentBranchकरना होगा ignore:

git config receive.denyCurrentBranch ignore

3

हो सकता है कि आपका रिमोट रेपो उस शाखा में हो जिसे आप पुश करना चाहते हैं। आप अपने रिमोट मशीन में एक और शाखा की जांच करने की कोशिश कर सकते हैं। मैंने ऐसा किया, इससे त्रुटि गायब हो गई, और मैंने सफलता को अपने दूरस्थ रेपो में धकेल दिया। ध्यान दें कि मैं gshub.com के बजाय अपने स्वयं के सर्वर को जोड़ने के लिए ssh का उपयोग करता हूं।


1

मेरे पास यह त्रुटि है क्योंकि गिट रेपो (गलती से) एक ही स्थान पर दो बार आरंभीकृत किया गया था: पहले एक गैर-नंगे रेपो के रूप में और कुछ ही समय बाद एक नंगे रेपो के रूप में। क्योंकि .it फ़ोल्डर रहता है, मान लेता है कि रिपॉजिटरी गैर-नंगे है। .Git फ़ोल्डर और वर्किंग डायरेक्टरी डेटा को हटाकर समस्या को हल किया गया।


1
मेरी स्थिति में, यह मामला था। .gitरिमोट पर फ़ोल्डर को हटाने से मुझे प्रारंभिक प्रतिबद्ध को धक्का देने की अनुमति मिली।
टिमरोह

0

मुझे यह त्रुटि तब हुई जब मैं प्रोजिट पढ़ते समय चारों ओर खेल रहा था। मैंने एक स्थानीय रिपॉजिटरी बनाई, फिर उसी फाइल सिस्टम पर इसे दूसरे रेपो में लाया, एडिट किया और पुश करने की कोशिश की। नोव्हरमैन के उत्तर को पढ़ने के बाद, "रिमोट" निर्देशिका में जाने के लिए एक त्वरित सुधार था और अस्थायी रूप से एक और प्रतिबद्ध जांच करें, उस निर्देशिका से धक्का दें जिसमें मैंने बदलाव किया है, फिर वापस जाएं और सिर को वापस मास्टर पर रख दें।

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