मैं आमतौर पर एक सवाल का जवाब नहीं देता, जिसमें पहले से ही 16 उत्तर हैं, लेकिन अन्य सभी उत्तर गलत हैं, और सही उत्तर इतना सरल है। प्रश्न कहता है, "क्या सभी ट्रैकिंग शाखाओं को हटाने का एक सरल तरीका है जिसका दूरस्थ समकक्ष अब मौजूद नहीं है?"
यदि "सरल" का अर्थ है उन सभी को एक बार में हटाना, न कि नाजुक, खतरनाक नहीं है, और उन उपकरणों पर निर्भरता के बिना, जो सभी पाठकों के पास नहीं होंगे, तो सही उत्तर है: नहीं।
कुछ उत्तर सरल हैं, लेकिन वे नहीं करते जो पूछा गया था। अन्य लोग वही करते हैं जो पूछा गया था, लेकिन सरल नहीं हैं: सभी टेक्स्ट-हेरफेर कमांड या स्क्रिप्टिंग भाषाओं के माध्यम से जीआईटी आउटपुट को पार्स करने पर भरोसा करते हैं, जो हर सिस्टम पर मौजूद नहीं हो सकता है। उसके शीर्ष पर, अधिकांश सुझाव चीनी मिट्टी के बरतन आदेशों का उपयोग करते हैं, जिनके उत्पादन को स्क्रिप्ट द्वारा पार्स करने के लिए डिज़ाइन नहीं किया गया है ("चीनी मिट्टी के बरतन" मानव ऑपरेशन के लिए इच्छित आदेशों को संदर्भित करता है; लिपियों को निचले स्तर के "प्लंबिंग" कमांड्स) का उपयोग करना चाहिए।
आगे की पढाई:
यदि आप इसे सुरक्षित रूप से करना चाहते हैं, तो प्रश्न में उपयोग के मामले के लिए (कचरा इकट्ठा करने वाली ट्रैकिंग शाखाएं जो सर्वर पर हटा दी गई हैं, लेकिन अभी भी स्थानीय शाखाओं के रूप में मौजूद हैं) और केवल उच्च-स्तरीय गिट कमांड के साथ, आपके पास है
git fetch --prune
(या git fetch -p
, जो कि एक उपनाम है, या git prune remote origin
जो बिना बात के काम करता है, और शायद वह नहीं है जो आप ज्यादातर समय चाहते हैं)।
- किसी भी दूरस्थ शाखाओं को नोट करें जिन्हें हटा दिया गया है। या, बाद में उन्हें खोजने के लिए,
git branch -v
(किसी भी अनाथ ट्रैकिंग शाखा को "[गया]") चिह्नित किया जाएगा।
git branch -d [branch_name]
प्रत्येक अनाथ ट्रैकिंग शाखा पर
(जो कि कुछ अन्य उत्तरों का प्रस्ताव है)।
यदि आप किसी समाधान को स्क्रिप्ट करना चाहते हैं, तो for-each-ref
आपका शुरुआती बिंदु है, जैसा कि यहां मार्क लोंगेयर के उत्तर में है और यह एक अन्य प्रश्न का उत्तर है , लेकिन मुझे शेल स्क्रिप्ट लूप लिखने, या xargs या कुछ का उपयोग किए बिना इसका फायदा उठाने का कोई तरीका नहीं दिख रहा है ।
पृष्ठभूमि की व्याख्या
यह समझने के लिए कि क्या हो रहा है, आपको इसकी सराहना करने की आवश्यकता है, ट्रैकिंग शाखाओं की स्थिति में, आपके पास एक शाखा नहीं है, लेकिन तीन हैं। (और याद रखें कि "शाखा" का मतलब केवल एक संकेतक के लिए प्रतिबद्ध है।)
ट्रैकिंग शाखा को देखते हुए feature/X
, दूरस्थ रिपॉजिटरी (सर्वर) में यह शाखा होगी और इसे कॉल करें feature/X
। आपकी स्थानीय रिपॉजिटरी की एक शाखा remotes/origin/feature/X
है, जिसका अर्थ है, "यह वही है जो रिमोट ने मुझे इसकी विशेषता बताई है / एक्स शाखा थी, पिछली बार जब हमने बात की थी," और अंत में, स्थानीय रिपॉजिटरी की एक शाखा है feature/X
जो आपकी नवीनतम प्रतिबद्ध की ओर इशारा करती है, और इसे कॉन्फ़िगर किया गया है "ट्रैक" remotes/origin/feature/X
, जिसका अर्थ है कि आप उन्हें संरेखित रखने के लिए खींच सकते हैं और धक्का दे सकते हैं।
किसी बिंदु पर, किसी ने feature/X
रिमोट पर हटा दिया है । उस क्षण से, आपको अपने स्थानीय के साथ छोड़ दिया जाता है feature/X
(जिसे आप शायद अधिक नहीं चाहते हैं, क्योंकि सुविधा एक्स पर काम संभवतया समाप्त हो गया है), और आपका remotes/origin/feature/X
जो निश्चित रूप से बेकार है क्योंकि इसका एकमात्र उद्देश्य सर्वर की शाखा की स्थिति को याद रखना था। ।
और Git आपको स्वचालित रूप से निरर्थक को साफ करने देगा remotes/origin/feature/X
- जो कि git fetch --prune
करता है - लेकिन किसी कारण से, यह आपको स्वचालित रूप से अपना स्वयं को हटाने नहीं देता है feature/X
... भले ही आपके feature/X
अभी भी अनाथ ट्रैकिंग जानकारी हो, इसलिए इसकी जानकारी है पूर्व ट्रैकिंग शाखाओं की पहचान करना जो पूरी तरह से विलय कर दी गई हैं। (आखिरकार, यह आपको वह जानकारी दे सकता है जो आपको ऑपरेशन को स्वयं करने की अनुमति देता है।)
* master
मेरे सिस्टम पर है। निम्नलिखित कमांड ने मेरे लिए काम किया:git branch -d $(git branch --merged |tail -n +2)