आप Git से अमान्य दूरस्थ शाखा संदर्भ कैसे निकाल सकते हैं?


731

मेरे वर्तमान रेपो में मेरे पास निम्न आउटपुट हैं:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

मैं remotes/public/masterशाखा सूची से हटाना चाहता हूं :

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

इसके अलावा, उत्पादन git remoteअजीब है, क्योंकि यह सूचीबद्ध नहीं है public:

$ git remote show 
origin

मैं शाखा सूची से 'रिमोट / पब्लिक / मास्टर' कैसे हटा सकता हूं?

अद्यतन, git pushकमांड की कोशिश की :

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

31
आपके परिदृश्य में काम किया git remote prune [remote-name]या git fetch -p [remote-name]नहीं? इसके साथ करना git gcबहुत अधिक बलशाली होता है जो सामान्य रूप से आवश्यक होता है।
rjmunro

6
git remote prune [remote-name]git svn के साथ काम नहीं करेगा, हालांकि न तो करता है git gc... git branch -rd origin/nameहालांकि काम नहीं करता है। @ कैसी, आपको शायद दूसरे उत्तर का चयन करना चाहिए-यह थोड़ा कम खतरनाक है।
n

4
मुझे यह सवाल बहुत पसंद है। लगभग हर महीने वापस आ रहा है
ऑलुकमैन

संबंधित, यदि कोई लक्ष्य नहीं है तो: स्थानीय और दूरस्थ रूप से एक Git शाखा हटाएं

2
भविष्य में n00b गीटर त्रुटि से बचने के लिए, मैं एक अलग उदाहरण शाखा का उपयोग करने की सलाह देता हूं master... खासकर जब रिमोट पर हटा रहा हो।
फरारी

जवाबों:


743

आपको एक सफाई की आवश्यकता हो सकती है:

git gc --prune=now

या आपको एक प्रून की आवश्यकता हो सकती है:

git remote prune public

छटना

<नाम> के तहत सभी बासी ट्रैकिंग शाखाओं को हटाता है। इन बासी शाखाओं को पहले से ही हटाए गए दूरस्थ रिपॉजिटरी से <name> द्वारा संदर्भित किया गया है, लेकिन अभी भी "रीमोट्स / <name>" में स्थानीय रूप से उपलब्ध हैं।

--Dry-run विकल्प के साथ, रिपोर्ट करें कि कौन सी शाखाएँ छंट जाएँगी, लेकिन वास्तव में उन्हें prune नहीं करें।

हालाँकि, ऐसा प्रतीत होता है कि इनको पहले से साफ किया जाना चाहिए था

git remote rm public 

rm

<Name> नाम का रिमोट निकालें। दूरस्थ के लिए सभी दूरस्थ ट्रैकिंग शाखाएँ और कॉन्फ़िगरेशन सेटिंग्स हटा दी जाती हैं।

तो हो सकता है कि आपने अपनी कॉन्फिग फाइल को हाथ से एडिट किया हो और ऐसा नहीं हुआ हो, या आपको विशेषाधिकार की समस्या हो।

शायद उसे फिर से चलाएं और देखें कि क्या होता है।


सलाह प्रसंग

यदि आप संशोधन लॉग में एक नज़र डालते हैं , तो आप ध्यान देंगे कि मैंने अधिक "सही" तकनीकों का सुझाव दिया है, जो कि किसी भी कारण से उनके भंडार पर काम नहीं करना चाहता था।

मुझे संदेह था कि ओपी ने कुछ ऐसा किया है जिससे उनके पेड़ को असंगत स्थिति में छोड़ दिया गया है, जिसके कारण यह अजीब तरह से व्यवहार करता है, और git gccruft के पीछे बाएं को ठीक करने के लिए आवश्यक था।

आमतौर पर git branch -rd origin/badbranch एक स्थानीय ट्रैकिंग शाखा के लिए, या git push origin :badbranchकिसी दूरस्थ शाखा के लिए पर्याप्त है , और आमतौर पर आपको कॉल करने की आवश्यकता नहीं होगीgit gc


4
मैं शाखा को दूरस्थ रूप से हटाना नहीं चाहता। मुझे लगता है कि एक सूक्ष्म अंतर है।
cmcginty

2
एर, सवाल प्रभावी रूप से पूछ रहा है "मैं एक दूरस्थ शाखा को कैसे हटाऊं"। उन रास्तों क्या है।
केंट फ्रेड्रिक

1
मैं इस विषय को फिर से लिखूंगा यदि यह अधिक स्पष्ट है कि मैं क्या पूछ रहा हूं, लेकिन कमांड वास्तव में बताती है कि मेरी समस्या क्या है।
cmcginty

40
git gcयहाँ जरूरत नहीं है, लेकिन git remote pruneमुझे मैन्युअल रूप से चीजों को हटाने की तुलना में अधिक सुरक्षित महसूस होता है git branch -rd, क्योंकि git यह सत्यापित कर रहा है कि कौन सी दूरस्थ शाखाएं हैं।
माइक सेपलोविट्ज

3
यह मेरे लिए काम नहीं किया - 'गिट शाखा -rd' ने ठीक काम किया, हालांकि।
dsummersl

683

आपको बस इतना करना है

git fetch -p

यह आपकी सभी स्थानीय शाखाओं को हटा देगा जो दूरस्थ रूप से हटा दी गई हैं।

यदि आप 1.8.5+ git पर हैं, तो आप इसे स्वचालित रूप से सेट कर सकते हैं

git config fetch.prune true

या

git config --global fetch.prune true

7
यह वही है जिसकी मैं तलाश कर रहा था - यह प्रश्न आम परिदृश्य की तुलना में अधिक जटिल परिदृश्य का वर्णन कर रहा है।
rjmunro 12

22
मैं स्थानीय शाखाओं को हटाने के लिए एक रास्ता खोज रहा हूँ जहाँ संगत रिमोट हटा दिया गया है, लेकिन यह मेरे लिए काम नहीं करता है। कोई विचार क्यों?
जैकोक्रॉन

11
यह दूरस्थ / मूल में सूचीबद्ध शाखाओं को हटाता है लेकिन स्थानीय ट्रैकिंग शाखाओं को नष्ट नहीं करता है, जो कि उतना ही महत्वपूर्ण है।
ब्लूराजा - डैनी पफ्लुघोफ्ट

@Cupcake चूंकि आपने मेरा पहला संपादन वापस नहीं किया है (जो कि Git 1.8.5+ के बारे में गलत जानकारी तय कर रहा था), आपने अब इसे गलत बना दिया है। मेरा दूसरा संपादन यह तय कर रहा था कि जो मैंने डाला था वह गलत था, जो अब फिर से है (आपके रोलबैक के साथ)। कृपया आगे बढ़ें और मूल को संपादित करने के लिए एक और संपादन करें। धन्यवाद।
ferventcoder

@ferventcoder I ने आपके अंतिम संपादन को डबल चेक किया, और उसे वापस रोल किया। अगर वह इसे पसंद नहीं करता तो ओपी फिर से रोलबैक कर सकता है। धन्यवाद।

319
git push public :master

यह masterकेंट फ्रेड्रिक के रूप में नामित दूरस्थ शाखा को हटा देगा ।

दूरस्थ-ट्रैकिंग शाखाओं को सूचीबद्ध करने के लिए:

git branch -r

दूरस्थ ट्रैकिंग शाखा को हटाने के लिए:

git branch -rd public/master

6
इससे मुझे एक git-svn दूरस्थ भूत शाखा को हटाने में मदद मिली।
निक

9
git branch -rd removed_remote/branchमेरे लिए काम किया, जबकि git gc --prune=nowबेकार था।
राच्यमौर्यल

2
मैं git pruneकिसी भी मुद्दे के बिना उपयोग करने में सक्षम रहा हूं , लेकिन मेरे सह-कार्यकर्ता जिन्होंने हमारे मुख्य रेपो ** COULD ONLY ** का उपयोग किया है- git branch -rd public/masterअपने पर्यावरण को साफ करने के लिए -स्टाइल समाधान का उपयोग करें ।
हाबिल

3
git branch -rd public/masterजो मुझे याद आ रहा था। मेरे पास था heroku/masterऔर herkou/master... लोल वूप्स
आरोन

@rchampourlier 100% बेकार नहीं है - अगर आपका git रेपो बड़ा है, तो अप्रयुक्त शाखाओं को हटाने से कुछ स्थितियों में बहुत सारे डिस्क स्थान खाली हो सकते हैं।
पेटेर - मोनिका

159

आपको बस इतना करना है

$ git branch -rd origin/whatever 

यह इत्ना आसान है। यहाँ gc को कॉल करने का कोई कारण नहीं है।


1
आप "पुश" कैसे करते हैं जो गिथब को हटाते हैं?
तुफिर

14
@Thufir यह सवाल क्या था के बारे में नहीं है। यह प्रश्न उन स्थितियों के लिए विशिष्ट था जब आपके पास स्थानीय रेपो में एक अमान्य दूरस्थ संदर्भ होता है, लेकिन वह शाखा दूरस्थ सर्वर पर मौजूद नहीं होती है। आपके प्रश्न का उत्तर $ git पुश ओरिजिन है: जो भी हो
jpswain

हां, अगर रिमोट रेपो पर कुछ होता है, जहां एक शाखा को हटा दिया जाता है, लेकिन आपके पास अभी भी अपनी स्थानीय मशीन पर उस दूरस्थ शाखा का संदर्भ है, तो आपको इसे साफ करने के लिए अपने मूल उत्तर में क्या करना होगा।
jpswain

6
यदि आपके पास एक बड़ा क्लीनअप काम है (बहुत सारे झूलने के उपाय), तो आप बस कुछ के साथ सभी दूरस्थ शाखाओं को हटा सकते हैं, जैसे कि git branch -rd $(git branch -r)फिर एक वैध काम कर रहे हैं।
नोबार

मेरी स्थिति यह थी कि मैंने git config -eअपने रिमोट का नाम बदल दिया था । मैंने रिमोट mineका नाम बदल दिया origin। फिर, यह समाधान था जिसने मेरे लिए सबसे अच्छा काम किया:git branch -rd $(git branch -r | grep 'mine/')
स्टीवन लू

70

git gc --prune=now वह नहीं है जो आप चाहते हैं।

git remote prune public

या git remote prune origin# यदि दूरस्थ स्रोत को thats

तुम क्या चाहते हो


6
@ कैसी $ git gc # के लिए एक डिफ्रैगमेंट पसंद करती है git फाइल्स के लिए रेस्पिरेटरी $ git रिमोट प्र्यून ओरिजिन को गति देने के लिए # "git ब्रांच -r। Grep ओरिजिन" के साथ दिखाई देने वाली बासी रिमोट ब्रांच को डिलीट कर देगा। Thats क्या सवाल पूछ रहा है मुझे विश्वास है। इसलिए, कमांड पूरी तरह से अलग हैं।
जुगनू जू

29

रेफरी पैक होने पर स्वीकृत उत्तर मेरे लिए काम नहीं करता था। यह हालांकि करता है:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

मेरे लिए काम किया। नियमित git शाखा -d काम नहीं कर रहा था, उस त्रुटि को लौटाया है जो शाखा मौजूद नहीं है, क्योंकि मैंने "मूल" नामक मूल को हटा दिया है, जो गलती से, सीधे .it / config फ़ाइल में बनाया गया था।
micrub

यह वह विधि है जिसका उपयोग मुझे उन शाखाओं को हटाने के लिए करना था जो अनजाने में मेरे .it / config (जिसे एक असंबंधित भ्रष्टाचार के कारण पुनर्निर्माण किया जाना था) से हटा दिया गया था। यह बहुत बुरा है यह उत्तर अब तक श्रृंखला के नीचे था कि मैंने इसे लंबे समय तक नोटिस नहीं किया था जब तक कि मुझे समाधान नहीं मिला और इसे स्वीकार किए गए उत्तर में जोड़ दिया गया!
तारानकी

यह वही है जो मुझे svn2git का उपयोग करने के बाद की आवश्यकता है। बहुत सारे रीमोट / svn / * ब्रांच थे। पहले एक फर्जी 'svn' रिमोट बनाना था।
सैम

7

मेरे मामले में मैं उन प्रविष्टियों को हटाने की कोशिश कर रहा था, जिन्हें में सहेजा गया था .git/packed-refs। आप इस सादे पाठ फ़ाइल को संपादित कर सकते हैं और उसमें से प्रविष्टियाँ हटा सकते हैंgit br -D स्पर्श करना नहीं जानते (कम से कम 1.7.9.5 वर्जन में)।

मुझे यह समाधान यहां मिला: https://stackoverflow.com/a/11050880/1695680


वाह, इससे मुझे मदद मिली। मेरे सहयोगी ने कोशिश की, वी.एस. को पुनरारंभ करें, अपने कंप्यूटर को फिर से शुरू करें कुछ भी काम नहीं किया, उसने अपना स्थानीय रेपो हटा दिया और इस से छुटकारा पाने के लिए सब कुछ खींच लिया :)
Esen

1
आज मैंने झुकाया कि यह पैक्ड-रेफ्स फ़ाइल के हिस्से के रूप में बनाई गई है git gc, जब यह आपके कॉम्पटिट्स को एक उच्च-संपीड़ित संग्रह में पैक करता है, यह संदर्भों को एक सादे पाठ फ़ाइल में ले जाता है, संभवतः अनुकूलन उद्देश्यों के लिए; मुझे उम्मीद है कि git के भविष्य के संस्करण git br -D ...refs को पैक कर सकते हैं ।
थोरसुमोनर


3

मुझे इस बारे में जानकारी नहीं थी git branch -rd, इसलिए जिस तरह से मैंने अपने लिए इस तरह के मुद्दों को हल किया है वह है कि मैं अपने रेपो को रिमोट रेपो के रूप में समझूं और रिमोट डिलीट करूं। git push . :refs/remotes/public/master। यदि अन्य तरीके काम नहीं करते हैं और आपके पास कुछ अजीब संदर्भ हैं जिनसे आप छुटकारा पाना चाहते हैं, तो यह कच्चा तरीका अचूक है। यह आपको किसी भी प्रकार के संदर्भ को हटाने (या बनाने) की सटीक सटीकता देता है।


2

केवल थोड़ा संबंधित है, लेकिन अभी भी उसी स्थिति में सहायक हो सकता है जैसा कि हमारे पास था - हम अपने रिमोट रिपॉजिटरी के लिए नेटवर्क फाइल शेयर का उपयोग करते हैं। पिछले सप्ताह चीजें काम कर रही थीं, इस हफ्ते हमें त्रुटि मिल रही थी "रिमोट मूल ने रेफरी के लिए शाखा रेफरी / प्रमुख / मास्टर का विज्ञापन नहीं किया। यह रेफ रिमोट में मौजूद नहीं हो सकता है या अनुमति सेटिंग्स द्वारा छिपाया जा सकता है"

लेकिन हमारा मानना ​​था कि भ्रष्ट चीजों के लिए कुछ भी नहीं किया गया था। एनएफएस स्नैपशॉट्स करता है इसलिए मैंने प्रत्येक "पिछले संस्करण" की समीक्षा की और देखा कि तीन दिन पहले, रिपॉजिटरी के एमबी में आकार 282 एमबी से 33 एमबी हो गया था, और अब लगभग 1,403 नई फाइलें और 300 फ़ोल्डर्स मौजूद थे। मैंने अपने सहकर्मियों को समझा और उस दिन एक धक्का देने की कोशिश की थी - फिर उसे रद्द कर दिया।

मैंने उस तिथि से ठीक पहले इसे पुनर्स्थापित करने के लिए एनएफएस "रिस्टोर" कार्यक्षमता का उपयोग किया और अब फिर से ठीक काम कर रहा है। मैं पहले की कोशिश की कोशिश की, नहीं मदद करने के लिए लगता है। हो सकता है कि हार्सर क्लीनअप ने काम किया हो।

आशा है कि यह एक दिन किसी और की मदद कर सकता है!

नीलकंठ


2

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। किसी भी उत्तर ने मदद नहीं की। मेरे मामले में, मुझे स्थायी रूप से दिखाने वाले दो हटाए गए रिमोट रिपॉजिटरी थे।

मेरा अंतिम विचार यह था कि इसके सभी संदर्भों को हाथ से हटा दिया जाए।

मान लीजिए कि रिपॉजिटरी को "रेपो" कहा जाता है। मैंने किया:

find .git -name Repo 

इसलिए, मैंने .गित फ़ोल्डर से संबंधित फ़ाइलों और निर्देशिकाओं को हटा दिया ( यह फ़ोल्डर आपके रेल एप्लिकेशन या आपके कंप्यूटर https://stackoverflow.com/a/19538763/6638513 पर पाया जा सकता है )।

फिर मैंने किया:

grep Repo -r .git

इसमें कुछ टेक्स्ट फाइलें मिलीं जिनमें मैंने संबंधित पंक्तियों को हटा दिया था। अब, सब कुछ ठीक लग रहा है।

आमतौर पर, आपको इस नौकरी को छोड़ देना चाहिए।

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