रिमोट रिपॉजिटरी में रीसेट को पुश करने के लिए कैसे मजबूर करें?


94

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

इसलिए अपने स्थानीय भंडार पर, मैंने नवीनतम टैग के लिए रीसेट किया git reset --hard (Tag)। मास्टर शाखा अब मेरे स्थानीय भंडार पर सही है। अब जब मैं दूरस्थ रिपॉजिटरी में बदलावों को आगे बढ़ाने की कोशिश करता git push origin masterहूं, तो मुझे एक त्रुटि मिलती है:

To (REMOTE GIT REPOSITORY LOCATION)
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

इसलिए चारों ओर देखने के बाद मुझे --forceविकल्प का पता चला । इसलिए मैंने रिमोट रिपॉजिटरी पर एक बल दिया git push --force origin master, और मुझे अभी भी एक त्रुटि मिली:

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To (REMOTE GIT REPOSITORY LOCATION)
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'

मैं मास्टर पर एक पुल नहीं कर सकता, क्योंकि इसमें विकास कोड शामिल है जो मास्टर पर नहीं हो सकता।


3
मुझे लगता है कि संदेश का मतलब है कि आपके पास गैर-फास्ट-फॉरवर्ड पुश करने के अधिकार नहीं हैं।
svick

3
आप सही थे, धन्यवाद। रिमोट पर रिपॉजिटरी के लिए कॉन्फिगर फाइल में denyNonFastforwards = true। मैंने इसे असत्य में बदल दिया, मेरे परिवर्तनों को धक्का दे दिया और फिर इसे सत्य में बदल दिया। मदद के लिए फिर से सभी को धन्यवाद।
सैमवेल

2
@samwell कृपया svick के उत्तर को स्वीकार करें
hultqvist

@samwell ने svick का जवाब आपके लिए दिया या नहीं?
सोंगो

उन लोगों के लिए, जिन्हें samwell की तरह denyNonFastForwards को अक्षम करने के बारे में विवरण की आवश्यकता है, और अधिक निर्देश यहां दिए जा सकते हैं: stackoverflow.com/a/43721579/2073804
ron190

जवाबों:


152

संदेश का मतलब है कि आपको गैर-फास्ट-फॉरवर्ड पुश करने की अनुमति नहीं है।

आपके दूरस्थ रिपॉजिटरी denyNonFastforwards = trueमें इसके विन्यास में सबसे अधिक संभावना है। यदि आप इसे बदलते हैं, git push --forceतो काम करना चाहिए।

सेटिंग को बदलने के लिए, आपको दूरस्थ रिपॉजिटरी के साथ मशीन तक पहुंच की आवश्यकता है। वहां से, करते हैं git config receive.denynonfastforwards false


1
क्या आप git configसर्वर के लिए कर सकते हैं ? या शायद आप उस रूपक का उपयोग कर रहे थे। इन विचारों के साथ खेलने के लिए मैंने /opt/git(मेरे गिट सर्वर स्पेस) में एक टेस्ट रेपो बनाया और फिर मैंने इस सेटिंग को संशोधित किया /opt/git/the_repo/the_repo.git/config। लेकिन एक बार git push --force origin SHA:branchआवश्यकतानुसार काम कर लिया।
हांकका

4
त्रुटि संदेश में एक पंक्ति होगी जो "त्रुटि के साथ शुरू होती है: कुछ रेफरी को <आपके रिपॉजिटरी>" में धकेलने में विफल रही है, जहां <आपका रिपॉजिटरी> पथ अंत में है। यह एक निर्देशिका है, जिसमें "config" नामक एक फ़ाइल है। यह "कॉन्फ़िगर" फ़ाइल वह जगह है जहाँ आप denyNonFastforwards = false
emery

1
@ एमरी की टिप्पणी मूल्यवान है। कभी-कभी सर्वर पर मौजूद फोल्डर का मूल सेट कुछ इस तरह से होता है जैसे /srv/git/repo.git। यह वह कॉन्फ़िगरेशन है जिसमें denyNonFastForwards सेट है, एप्लिकेशन फ़ोल्डर नहीं।
एलिय्याह लिन

1
@salimi यदि आपके पास सर्वर तक पहुंच नहीं है, तो आपको सर्वर व्यवस्थापक से संपर्क करने की आवश्यकता है और उन्हें अस्थायी रूप से बंद कर देना चाहिए ताकि आप धक्का पर मजबूर कर सकें और फिर इसे वापस चालू कर सकें। हालांकि ऐसा होने की संभावना नहीं है। यह आपके स्वयं के होस्टिंग टीम के साथ आंतरिक वातावरण में अधिक सामान्य हो सकता है।
एलिजा लिन

1
यह शुरू में निराशाजनक है, लेकिन इसकी सुंदरता यह है: रिमोट डिफ़ॉल्ट रूप से पूरी तरह से संरक्षित है, और यदि आप डेवलपर के रूप में जानबूझकर और सही ढंग से विद्रोह कर रहे हैं, तो आप खतरनाक व्यवहार की अनुमति देने के लिए इस कॉन्फ़िगरेशन को ओवरराइड कर सकते हैं। रिबासिंग कुछ ऐसा है जो प्रत्येक उपयोगकर्ता को पता होना चाहिए कि कैसे करना है - और पता है कि कब नहीं करना है। doc1 doc2
मूडबूम

15

रिमोट गैर-फास्ट-फॉरवर्ड की अनुमति नहीं देता है।

आपका सबसे अच्छा विकल्प उन git revertसभी कमिट्स में से है जो भविष्य में और अधिक सावधान नहीं होना चाहिए।

git revert [commit]एक नई प्रतिबद्ध बनाएगा जो कुछ भी [commit]किया था उसे पूर्ववत करता है ।


यह रिमोट रिपॉजिटरी पर कुछ सेटिंग्स थी जिसने सभी गैर-फास्ट-फॉरवर्ड परिवर्तनों को अवरुद्ध कर दिया था।
सैमवेल

यदि आप ऐसा करते हैं और पुन: लागू करने की आवश्यकता होती है तो इतिहास को केवल कोड परिवर्तन में वापस नहीं लाया जाता है, और आप चेरी को कमिट या मर्ज लेने में सक्षम नहीं होंगे
mtpultz

12

निम्नलिखित शैली में बल पुश को स्थायी रूप से सक्षम करने के लिए कदम

git push -f myrepo my-branch

अपने दूरस्थ रिपॉजिटरी में ".गित" में समाप्त होने वाले फ़ोल्डर में "कॉन्फ़िगर" नाम की फ़ाइल को संपादित करें

असफल पुश से git की कमांड-लाइन आउटपुट में, उस लाइन को देखें जो कुछ ऐसा कहती है:

error: failed to push some refs to 'ssh://user@some-remote-server.mycompany.com/srv/git/myrepo.git

फिर

ssh user@some-remote-server.mycompany.com
cd /srv/git/myrepo.git
vi config

"DenyNonFastforwards" को असत्य पर सेट करें

"कॉन्फ़िगर" में, सेट करें

[receive]
        denyNonFastforwards = false

अब आप -f के साथ अपनी स्थानीय मशीन से धक्का दे सकते हैं

git push -f myrepo my-branch

SSH के नंगे गिट रेपो तक पहुँच के बिना यह कैसे करें?
व्लादिमीर वुकानैक

शायद रिच कमांड के रूप में git रिवर्ट कमांड का उपयोग करते हैं? यदि आप पहले रेपो की वर्तमान स्थिति का बैकअप लेते हैं, तो आप अभी भी आगे बढ़ने में अपने कोड को मर्ज कर सकते हैं।
एमरी

git revertजब आप मर्ज होते हैं, तो यह जटिल होता है। अधिक जटिल होने के लिए मेरे मामले में 3 मर्ज हैं, जिनमें से एक बहुत पुरानी ~ 20 प्रतिबद्ध विकसित होने से विचलित है, दूसरा मास्टर से एक प्रकार का मर्ज है - बदसूरत नरक के रूप में।
व्लादिमीर वुकानैक

1
हो सकता है कि समाधान वांछित स्थिति, बैकअप (स्‍टैश) पर रीसेट हो, फिर से खींचे, और बैकअप (स्‍टेश) लागू करें।
व्लादिमीर वुकानैक

1
mrW आप अभी भी उस कोड आधार को मर्ज कर सकते हैं जिसे आप एक उल्टे / खींचे गए कोड आधार के ऊपर चाहते हैं
एमरी

11

-fध्वज का उपयोग करने का प्रयास करें और इसे दूरस्थ शाखा के नाम के बाद डालें।

git push origin master -f


1
नहीं, यह भी काम नहीं किया। मैंने भी कोशिश की git push -f origin masterऔर वही नतीजा। दोनों बार मैंने कोशिश की कि मुझे त्रुटि संदेश का दूसरा संस्करण मिला।
samwell

2

आपको तेज़ी से आगे नहीं बढ़ने वाले पुश पुश की अनुमति नहीं है।

  1. यदि रिमोट GitHub है, तो https://github.com/$USER/$REPO/settings/branchesविचाराधीन शाखा को अन-प्रोटेक्ट करें।

    यहां छवि विवरण दर्ज करें

    आपको ऐसा करने के लिए रेपो का प्रशासन होना चाहिए।

  2. यदि रिमोट आपका खुद का गिट सर्वर है, तो git config receive.denynonfastforwards falseवहां दौड़ें ।


ज्ञात हो कि Git Hub Enterprise उदाहरणों के लिए, डिफ़ॉल्ट शाखा (आमतौर पर "मास्टर") पर धकेल दिया जाता है, जिसे उदाहरण-स्तर पर अक्षम किया जा सकता है। इसका मतलब है कि भले ही "मास्टर" संरक्षित नहीं है, और भले ही आप साइट-व्यवस्थापक हों, आप डिफ़ॉल्ट शाखा में बल-पुश करने में सक्षम नहीं होंगे। मान लें कि आपके पास अनुमतियाँ हैं, तो आप अस्थायी रूप से डिफ़ॉल्ट शाखा को किसी अन्य चीज़ पर स्विच करके, अपना बल-पुश करके और फिर वापस स्विच करके इसे प्राप्त कर सकते हैं।
क्रिस्टोफर हंटर

2

इसके आसपास का सबसे अच्छा तरीका दूरस्थ शाखा को हटाना और उसे फिर से भेजना है:

git push origin master --delete
git push origin master

0

समस्या तब होती है क्योंकि PULL के लिए वर्तमान शाखा ठीक से कॉन्फ़िगर नहीं की गई है । पहले जांचें कि क्या अपस्ट्रीम शाखा का उपयोग करके खींचने के लिए ठीक से कॉन्फ़िगर किया गया है - git remote show origin। आप इसे अनुभाग के अंतर्गत पा सकते हैं - स्थानीय शाखाएँ 'गिट पुल' के लिए कॉन्फ़िगर की गई हैं :। यदि नहीं, तो इसका उपयोग करके कॉन्फ़िगर करें:

git config branch.MYBRANCH.merge refs/heads/MYBRANCH

स्थान धारक के लिए उपयुक्त शाखा का नाम दें - MYBRANCH


0

मैं अपने रिमोट रेपो को रीसेट करने के लिए कमांड के इस समूह का उपयोग कर रहा हूं, यह आपके स्थानीय रेपो को फिर से इनिशियलाइज़ करेगा और आपके रिमोट रेपो के साथ फिर से जुड़ जाएगा।

मुझे लगता है कि यह तरीका आपके मामले में काम नहीं करेगा, लेकिन किसी और के लिए उपयोगी हो सकता है

स्रोत फ़ोल्डर में जाएं फिर कमांड चलाएं: ध्यान दें कि https://github.com/*.gitआपका रिमोट रेपो लिंक है

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**


0

मेरे लिए, @svick का संकेत सही दिशा में बताया गया है। चूँकि मैं जिस git सर्वर को संशोधित करना चाहता था वह वास्तव में मेरा बॉक्स है, मैंने इसमें लॉग इन किया और git config --global receive.denynonfastforwards falseएक मजबूर गैर-एफएफ पुश स्वीकार करने के लिए सभी रिपॉजिट को बदलने का काम किया । बॉक्स से बाहर काम नहीं किया। मैंने जो पाया वह यह था कि पहले से ही कॉन्फ़िगर में receive.denynonfastforwards=trueसेट था , और इसे मिटाया नहीं जा सकता था git config --global --unset receive.denynonfastforwardsvi configहालांकि, रेपो में मैन्युअल रूप से संपादन करना ( ) काम किया।


0

मैंने मास्टर शाखा को संरक्षित और डिफ़ॉल्ट रूप से हटाकर हल कर दिया है जो कि रिपॉजिटरी की स्थापना में प्रस्तावित शाखा नियमों से अधिक है।

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