पुरानी दूरस्थ शाखाओं को गिट से हटा दें


80

जब मैं गिट में बैश आटोक्लेम्पशन का उपयोग करता हूं, तो यह मुझे पुराने रीमेक की शाखाएं दिखाता रहता है जो मेरे पास नहीं हैं। जब मैं ऐसा करता हूं तो git branch -laउन पुराने रीमोट और शाखाओं को दिखाता है, जबकि ऐसा git branch -lनहीं होगा। A ls .git/refs/remotes/भी उन्हें दिखाता है। हालाँकि, वे मेरे .it / config में मौजूद नहीं हैं और न ही जब वे चलते हैं तो उन्हें दिखाया जाता है git remote show

तो मैं उनसे कैसे छुटकारा पाऊंगा क्योंकि मेरी स्वतः पूर्ण सूची अभी बहुत लंबी है।

मैंने पहले ही कोशिश कर ली है:

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

मुझे इस तथ्य की भी जानकारी है कि मैं रेपो को फिर से क्लोन कर सकता हूं लेकिन यह सिर्फ धोखा है;;


नोट: a git remote rmnow (git 2.0.1, June 2014) पहले दूरस्थ ट्रैकिंग शाखाओं को हटा दें। पुरानी शाखाओं की सफाई से बचने में मदद करनी चाहिए। देखें नीचे मेरा उत्तर
VonC


यहाँ मेरा एक और जवाब है: stackoverflow.com/a/44129766/3835843
Arif

जवाबों:


142

यदि दूरस्थ दूरस्थ रिपॉजिटरी में शाखा को हटा दिया गया था, तो Git (स्थानीय) दूरस्थ-ट्रैकिंग शाखाओं को स्वचालित रूप से हटाता नहीं है। इसके अतिरिक्त, V2.0.1 से पहले रिमोट-ट्रैकिंग शाखाएं कुछ मामलों में डिलीट नहीं हुई थीं जब आपने रिमोट को अपने git config से हटा दिया था (देखें VonC का उत्तर)।

अपने दूरस्थ रिपॉजिटरी में से किसी एक के लिए बासी रिमोट-ट्रैकिंग शाखाएं (रिमोट रिपॉजिटरी में डिलीट की गई शाखाएं) हटाने के लिए

git remote prune <remote>

आदमी पृष्ठ का हवाला देने के लिए या git remote:

छटना

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

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

हालाँकि, आपके प्रश्न से ऐसा लगता है कि आपने मैन्युअल रूप से हटा दिया है .git/refs/remotes/theoldremote, इसलिए Git अब दूरस्थ रिपॉजिटरी के बारे में नहीं जानता है कि रिमोट-ट्रैकिंग शाखाएँ किससे संबंधित थीं। ऐसा नहीं है कि आप इसे कैसे करना चाहिए।

रिमोट रिपॉजिटरी को हटाने का सामान्य तरीका है

git remote rm <remote>

यह आपके से रिमोट को हटा देगा .git/config, और रिमोट-ट्रैकिंग शाखाओं को हटा देगा।

यदि आप केवल निर्देशिका को हटाते हैं .git/refs/remotes/, तो शाखाएँ पीछे रह जाएँगी। फिर आपको उन्हें मैन्युअल रूप से निकालने की आवश्यकता होगी:

git branch -rd <remote>/<branchname>

आपको -rदूरस्थ शाखा को हटाने के लिए विकल्प की आवश्यकता है ।


2
नहीं, यह बात नहीं है। यह कहता है fatal: 'kolichikov' does not appear to be a git repository
एलेक्स


यदि आपको यह धीमा लगता है, तो नए Git (2.0.1+ IIRC) पर अपग्रेड करें जहां यह तय किया गया है (100x से अधिक तेज)।
ओडिन्हो - वेलमॉन्ट

उपयोगकर्ताओं को ध्यान देने के लिए ध्यान दें: Git प्रलेखन कहता है " ज्यादातर मामलों में, उपयोगकर्ताओं को चलना चाहिए git gc, जो git prune कहते हैं। "। हालांकि ध्यान दें कि git gcसंगत नहीं है --dry-run
JYL

git branch -rd <remote>/<branchname>वही था जिसकी मुझे तलाश थी। धन्यवाद!
एंटोनी कोलसन

16

मैं उपयोग करता हूं

git push origin :remote_branch

सर्वर से एक शाखा को हटाने के लिए।

git remote prune origin

दूरस्थ संदर्भों को हटाने के लिए जो सर्वर पर मौजूद नहीं हैं


नहीं, यह बात नहीं है। यह कहता हैfatal: 'kolichikov' does not appear to be a git repository
एलेक्स

1
एलेक्स, आपको रिपॉजिटरी फोल्डर के अंदर कमांड को अपने होम फोल्डर में नहीं
चलाना है

6

ध्यान दें: जबकि git दूरस्थ prune का उत्तर है, पता है कि, git 2.0.1 (25 जून, 2014) से git remote rm शुरू होकर, दूरस्थ ट्रैकिंग शाखाओं को हटाकर शुरू होता है
तो उम्मीद है, एक के बाद एक पुरानी शाखाओं को साफ करने के लिए नहीं होना चाहिए git remote rm

जेन्स लिंडस्ट्रॉम द्वारा प्रतिबद्ध b07bdd3 देखें ( jensl)

remote rm: अंतिम के रूप में दूरस्थ कॉन्फ़िगरेशन हटाएं

रिमोट को हटाते समय, रिमोट कॉन्फ़िगरेशन को हटाने से पहले रिमोट-ट्रैकिंग शाखाओं को हटा दें।
इस तरह, यदि रिमोट-ट्रैकिंग शाखाओं को हटाते समय ऑपरेशन विफल हो जाता है या समाप्त हो जाता है, तो ऑपरेशन को पूरा करने के लिए कमांड को फिर से चलाया जा सकता है


लेकिन अगर आपको करना है, तो एक सरल git fetchकाफी हो सकता है, बशर्ते आपने पहले सेट किया हो

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true

यह भी देखें github.com/git/git/commit/…
VONC

4

इसे हटाने के लिए एक शाखा में कुछ भी न डालें :

git push remote :remote_branch

यह डॉक्स में कहीं है लेकिन यह वास्तव में स्पष्ट नहीं है।

या मैंने आपके प्रश्न को गलत समझा?


2
"यह डॉक्स में कहीं है लेकिन यह वास्तव में स्पष्ट नहीं है।" ऐसा हैgit
mnagel

"रिमोट" से मेरा मतलब आपके रिमोट रिपॉजिटरी नाम से है। जैसे कि "उत्पत्ति" या जो भी हो। लेकिन मैं यह सोचना शुरू कर रहा हूं कि आपके पास रिमोट ब्रांच को हटाने के अलावा कुछ और था।
अरगैर

कुछ और इस तरह से: stackoverflow.com/questions/1072171/…
arager

4

ठीक है, मैं समझ गया। समस्या यह थी कि रीमोट अब मौजूद नहीं हैं, लेकिन वे कहीं न कहीं गिट डेटाबेस में हैं। मैंने रीमोट्स को फिर से जोड़ा, फिर किया

git remote prune theremote
git remote rm theremote
git gc --prune=now

इसके बाद वे सूची से गायब हो जाते हैं। किसी तरह मैंने अनुमान लगाने से पहले उन्हें सही ढंग से नहीं हटाया।


मैंने सूत्रों के एक समूह से सब कुछ करने की कोशिश की, और केवल एक चीज जो काम की थी वह थी समस्या को फिर से जोड़ना और फिर उसे हटा देना। धन्यवाद!
jc00ke

0

जब रिमोट सर्वर को डिलीट किया गया था, तब भी मैं भ्रमित हो रहा था जब मैं भाग रहा था तब भी दिखाई दे रहा था:

$ git branch --all

निम्न आदेश ने इसे मेरे लिए तय किया (git संस्करण 2.25.0 पर):

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