Git दूरस्थ URL बदलने के बाद रिमोट अस्वीकृत (उथला अपडेट की अनुमति नहीं)


164

मेरे पास Git संस्करण नियंत्रण के तहत एक परियोजना है जो मैंने सर्वर और मेरे स्थानीय कंप्यूटर दोनों पर काम किया है। मैं मूल रूप से दूरस्थ मूल को अपने स्थानीय कंप्यूटर के रूप में सेट करता था, लेकिन अब मैं इसे बिटबकेट में बदलना चाहूंगा।

सर्वर पर मैंने कमांड का उपयोग किया

git remote set-url origin bitbucket_address

लेकिन अब जब मैं अपने प्रोजेक्ट को आगे बढ़ाने की कोशिश करता हूं तो मुझे त्रुटि मिलती है

 ! [remote rejected] master -> master (shallow update not allowed)

यह क्या कारण है और मैं इसे कैसे ठीक करूं?


3
आपने अपना स्थानीय संस्करण कैसे क्लोन किया? git clone --depth?
साशा वुल्फ

यह कुछ समय पहले था और मुझे याद नहीं आ रहा है। क्या पता लगाने का कोई तरीका है?
rwolst

2
shallowआप के .gitफोल्डर में एक फाइल होनी चाहिए ।
साशा वुल्फ

हां, मैं एक shallowफाइल देख सकता हूं ।
rwolst

एक समाधान के लिए stackoverflow.com/a/50996201 देखें, जो गायब इतिहास (या फिर से लिखता है) के इतिहास
caw

जवाबों:


329

जैसा कि लगता है कि आपने git clone --depth <number>अपने स्थानीय संस्करण को क्लोन करने के लिए उपयोग किया है। यह एक उथले क्लोन में परिणाम है । इस तरह के क्लोन की एक सीमा यह है कि आप इसे एक नए भंडार में धकेल नहीं सकते हैं ।

अब आपके पास दो विकल्प हैं:

  1. यदि आपको वर्तमान या लापता इतिहास की परवाह नहीं है, तो इस प्रश्न पर एक नज़र डालें
  2. यदि आप अपना पूरा इतिहास रखना चाहते हैं, तो पढ़ना जारी रखें:

तो, आप अपना इतिहास, एह रखना चाहते हैं? इसका मतलब है कि आपको अपनी रिपॉजिटरी को अनशॉल करना होगा। ऐसा करने के लिए आपको अपने पुराने रिमोट को फिर से जोड़ना होगा।

git remote add old <path-to-old-remote>

उसके बाद हम git fetchपुराने रिमोट से शेष इतिहास प्राप्त करने के लिए उपयोग करते हैं (जैसा कि इस उत्तर में सुझाया गया है )।

git fetch --unshallow old

और अब आपको अपने नए दूरस्थ भंडार में धकेलने में सक्षम होना चाहिए।


नोट : अपने क्लोन को खोल देने के बाद आप फिर से पुराने रिमोट को हटा सकते हैं।


45
क्या होगा अगर मैंने एक किक-स्टार्ट प्रोजेक्ट को क्लोन किया और मुझे पूरे इतिहास की आवश्यकता नहीं है / चाहिए? क्या इससे बचने का कोई तरीका है?
इटमार

9
@itamar यह पूरी तरह से वैध नए प्रश्न के लिए एक अच्छा उदाहरण है। आप इस प्रश्न को संदर्भ के लिए लिंक कर सकते हैं।
साशा वुल्फ

14
नए सवाल के रूप में पूछा stackoverflow.com/questions/29748197/…
itamar

2
ध्यान दें कि git fetch --unshallowपूरे रेपो के बजाय केवल एक निश्चित शाखा को फिर से खोलने के लिए एक refspec ले सकते हैं। जैसे:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
१४:०१

5
यदि आप एक रेपो पर जोर दे रहे हैं, जो कि आप जिस भी रेपो से क्लोन कर रहे हैं, उससे थोड़ा पीछे है, एक ऑल-न्यू रेपो का निर्माण नहीं कर रहा है, तो यह पर्याप्त है कि आपका स्थानीय संदर्भ दूरस्थ संदर्भ को जोड़ने के लिए पर्याप्त गहरा है। इसलिए यदि आप origin/masterइसे एडिट करते oldrepo/masterसमय आपके सामने से 20 कमिट करते हैं clone --depth 1, और आपने 17 लोकल कमिट किए हैं, तो यह आपके लिए पर्याप्त है git fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master(किसी भी एक गलती के लिए माफी), और फिर आप git push oldrepo masterबिना घटना के कर सकते हैं (1.9.0 या नए git की आवश्यकता हो सकती है)।
क्लैके

28

यदि आपका रेपो है origin, और मूल रेपो है upstream:

git fetch --unshallow upstream

यह मेरे लिए काम करता है, और काफी आसान है तो शीर्ष मतदान जवाब।
Maosheng वैंग

11

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

  • पहले (रूट) कमिटमेंट के साथ एक इंटरेक्टिव रीबेस शुरू करें

    git rebase --interactive --root
    
  • फ़ाइल को सहेजने और बंद pickकरने के लिए प्रारंभिक प्रतिबद्ध (ओं) को बदलें edit

    यदि आपने रेपो को 1 से अधिक गहराई के साथ क्लोन किया है, तो आपको उन सभी कमिटों के लिए भी ऐसा करने की आवश्यकता हो सकती है। या, वैकल्पिक रूप से, fixupइंटरेक्टिव रिबेस के दौरान इन सभी के लिए निष्पादित करें ।

  • इसे एक नियमित, अनचाहे कमिट के साथ कमिट करें

    git commit --amend --no-edit
    

    यह कमिट आईडी भी बदल देगा और आपको इस प्रारंभिक कमिट में सह-लेखक के रूप में जोड़ देगा।

  • अपने छूट को खत्म करने के लिए मत भूलना

    git rebase --continue
    

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

9

यदि आप नए रेपो को आगे बढ़ाना चाहते हैं, तो आप यह कोशिश कर सकते हैं:

  • पहले old git folderअपने वर्तमान रेपो से निकालें ,sudo rm -rf .git
  • इसके बाद गिट को दोबारा इनिशियलाइज़ करें git init
  • फिर नया रिमोट रेपो जोड़ें git remote add your-new-repo
  • फिर इसे पुश करें।

मुझे यह एक बेहतर उपाय लगा, क्योंकि इसके लिए पुराने को पुश की आवश्यकता नहीं है। कभी-कभी बॉयलर के साथ ऐसा हो सकता है।
rnpd


@NachPD मुझे यकीन नहीं है कि आपका क्या मतलब है, जब आप कहते हैं कि दूसरे समाधान के लिए "पुराने के लिए एक धक्का" की आवश्यकता है। क्या आपका मतलब पुश की बजाय एक भ्रूण है? क्योंकि इसमें पुश की आवश्यकता नहीं होती है।
साशा वुल्फ

0

अगर लाने - छोड़ने का काम नहीं करता है। आपकी शाखा के साथ कुछ समस्याएं होनी चाहिए। इसे पुश करने से पहले निम्न कमांड के साथ इसे ठीक करें।

git filter-branch -- --all

केवल तभी से करें --unshallow तब तक काम नहीं करता है जब तक कि सुरक्षा चिंता का विषय नहीं है।

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