स्थानीय ट्रैकिंग शाखाओं को कैसे कम करें जो रिमोट पर मौजूद नहीं हैं


767

साथ git remote prune originमैं स्थानीय शाखाओं कि रिमोट पर किसी भी अधिक नहीं हैं हटा सकते हैं।

लेकिन मैं उन स्थानीय शाखाओं को भी हटाना चाहता हूं जो उन दूरदराज की शाखाओं से बनाई गई थीं (एक जांच यदि वे अनमर्ज हैं तो अच्छा होगा)।

मैं यह कैसे कर सकता हूँ?



1
वन-लाइनर, क्रॉस प्लेटफॉर्म, आपके कीबोर्ड पर सोए गए बिल्ली की तरह नहीं दिखता है: npx git-removed-branches(सूखा-रन) या npx git-removed-branches --prune(असली के लिए)। आपको पहले से ही नोड .js स्थापित करने की आवश्यकता है । विवरण के लिए नीचे उत्तर देखें ।
क्रिस्टियन डियाकोन्सक्यू

जवाबों:


889

प्रूनिंग के बाद, आप दूरस्थ शाखाओं की सूची प्राप्त कर सकते हैं git branch -r। उनकी दूरस्थ ट्रैकिंग शाखा के साथ शाखाओं की सूची को पुनः प्राप्त किया जा सकता है git branch -vv। तो इन दो सूचियों का उपयोग करके आप दूरस्थ ट्रैकिंग शाखाएं पा सकते हैं जो कि रिमोट की सूची में नहीं हैं।

इस लाइन को ट्रिक करना चाहिए (आवश्यकता है bashया zsh, मानक बॉर्न शेल के साथ काम नहीं करेगा):

git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

यह स्ट्रिंग दूरस्थ शाखाओं की सूची प्राप्त करती है और egrepमानक इनपुट के माध्यम से इसे पास करती है । और उन शाखाओं को फ़िल्टर करता है जिनके पास एक दूरस्थ ट्रैकिंग शाखा है ( git branch -vvउन लोगों के लिए उपयोग करना और फ़िल्टर करना origin) फिर उस आउटपुट का पहला कॉलम प्राप्त करना जो शाखा नाम होगा। अंत में सभी ब्रांच नामों को डिलीट ब्रांच कमांड में पास करें।

चूंकि यह -dविकल्प का उपयोग कर रहा है, यह उन शाखाओं को नहीं हटाएगा जिन्हें उस शाखा में विलय नहीं किया गया है जिस पर आप इस कमांड को चलाते हैं।

यह भी याद रखें कि आपको git fetch --prune पहले दौड़ने की आवश्यकता git branch -rहोगी , अन्यथा अभी भी दूरस्थ शाखाएं दिखाई देंगी।


12
इसने मेरे लिए पूरी तरह से काम किया। किसी तरह, git fetch -pहमेशा पर्याप्त नहीं है?
स्टेफन हेंड्रिक्स

16
दुर्भाग्य से यह विंडोज पर गिट बैश में काम नहीं करता है। sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required कोई विचार?
लुडर

37
इसे उपनाम के रूप में जोड़ने के लिए:alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
bryant1410

125
क्या भविष्य में होने वाली रिलीज के लिए कोई प्रस्तावित आदेश है जो ऐसा करेगा? यह आदेश ऐसा लगता है जैसे मेरी बिल्ली मेरे लैपटॉप पर रही है
ब्रॉन डेविस

5
git branch -Dकमांड के अंत में उपयोग करना हमारे लिए बेहतर काम करता है, क्योंकि हम मर्ज पर स्क्वैश करते हैं, जो हमारे The branch x is not fully mergedसाथ चलने पर त्रुटियों को प्राप्त करता है -d
मेटुस गोंडिम

429

यदि आप उन सभी स्थानीय शाखाओं को हटाना चाहते हैं जो पहले से ही मास्टर में विलय हो चुकी हैं, तो आप निम्न कमांड का उपयोग कर सकते हैं:

git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

अधिक जानकारी


4
सही काम किया, मुझे लगता है! क्या कोई समझा सकता है कि क्या यह उत्तर स्वीकृत उत्तर की तुलना में कुछ अलग करता है?
एंड्रयू

11
मामूली सुधार: उपयोग करें xargs -r git branch -dताकि कुछ भी न चलाएं यदि हटाने के लिए कोई शाखाएं नहीं हैं। ध्यान दें कि -rध्वज हर जगह उपलब्ध नहीं हो सकता है
जैकब वांग

8
चूँकि gitp git रंगों के कारण मेल नहीं खा सकता है:git branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
माइक D

5
@NickRes जैसा कि आपने इतनी अच्छी तरह से पूछा है, वैसे git branch --merged masterशाखाओं को सूचीबद्ध करता है जिन्हें मास्टर में विलय कर दिया जाता है, फिर मध्य grep भाग स्वयं मास्टर को बाहर कर देता है (हम मास्टर को हटाना नहीं चाहते हैं!), और अंतिम xargs भाग git branch -dप्रत्येक (प्रत्येक के लिए शाखा हटाएं) को निष्पादित करता है । परिणाम। या आप उत्तर में प्रदान की गई अधिक जानकारी लिंक को पढ़ सकते हैं;)
जैकोक्रान

14
सुधार: git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d। Git v2.10.1 से आउटपुट "* मास्टर" प्रदर्शित करेगा जब मास्टर की जाँच की जाएगी। मैं दोनों के साथ या बिना तार के मास्टर से छुटकारा पाता हूं।
एस्टेबन

162

प्रस्तुत जानकारी के बीच git help fetch, यह छोटी वस्तु है:

 -p, --prune
        After fetching, remove any remote-tracking branches which no longer exist on the remote.

तो, शायद, git fetch -pआप क्या देख रहे हैं?

संपादित करें: ठीक है, इस तथ्य पर 3 साल बाद भी इस उत्तर पर बहस करने वालों के लिए, यहां इस बारे में थोड़ी अधिक जानकारी है कि मैंने यह उत्तर क्यों प्रस्तुत किया है ...

सबसे पहले, ओपी का कहना है कि वे "उन स्थानीय शाखाओं को भी हटाना चाहते हैं जो उन दूरस्थ शाखाओं से बनाई गई थीं [जो कि रिमोट पर नहीं हैं]"। में यह संभव नहीं है git। यहाँ एक उदाहरण है।

मान लीजिए कि मेरे पास एक केंद्रीय सर्वर पर एक रेपो है, और इसकी दो शाखाएं हैं, जिन्हें बुलाया गया है Aऔर B। अगर मैं उस रेपो को अपने स्थानीय सिस्टम में क्लोन करता हूं, तो मेरे क्लोन में स्थानीय रिफ (अभी तक वास्तविक शाखाएं नहीं) origin/Aऔर कहा जाएगा origin/B। अब हम कहते हैं कि मैं निम्नलिखित कार्य करता हूं:

git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>

यहाँ प्रासंगिक तथ्य यह है कि मैंने किसी कारण से अपने स्थानीय रेपो पर एक शाखा बनाने के लिए चुना जिसका मूल से अलग नाम है, और मेरी एक स्थानीय शाखा भी है जो मूल रेपो पर मौजूद नहीं है (अभी तक)।

अब कहते हैं कि मैं रिमोट रेपो पर दोनों शाखाओं Aऔर Bशाखाओं को हटाता हूं और अपने स्थानीय रेपो ( git fetchकिसी रूप में) को अपडेट करता हूं , जिससे मेरे स्थानीय रीफ origin/Aऔर origin/Bगायब हो जाते हैं। अब, अपने स्थानीय रेपो तीन शाखाओं अभी भी है A, Zऔर C। रिमोट रेपो पर इनमें से किसी की भी कोई शाखा नहीं है। उनमें से दो को "दूरस्थ शाखाओं से बनाया गया था", लेकिन यहां तक ​​कि अगर मुझे पता है कि Bमूल पर एक शाखा हुआ करती थी, तो मेरे पास यह जानने का कोई तरीका नहीं है कि Zकिससे बनाया गया थाB, क्योंकि इस प्रक्रिया में इसका नाम बदल दिया गया था, शायद एक अच्छे कारण के लिए। तो, वास्तव में, कुछ बाहरी प्रक्रिया रिकॉर्डिंग शाखा मूल मेटाडाटा के बिना, या एक मानव जो इतिहास जानता है, यह बताना असंभव है कि ओपी को हटाने के लिए तीन शाखाओं में से कौन सी, यदि कोई है। कुछ बाहरी जानकारी के बिना जो gitआपके लिए स्वचालित रूप से बनाए नहीं रखती है, git fetch -pलगभग उतनी ही करीब है जितनी आप प्राप्त कर सकते हैं, और ओपी ने जो भी पूछा है उसके लिए कोई भी स्वचालित विधि, या तो बहुत से शाखाओं को हटाने का जोखिम उठाती है, या कुछ को गायब कर देती है जो ओपी अन्यथा नहीं होगा हटाना चाहते हैं।

अन्य परिदृश्य भी हैं, जैसे कि अगर मैं origin/Aकिसी चीज़ के लिए तीन अलग-अलग तरीकों का परीक्षण करने के लिए तीन अलग-अलग शाखाएँ बनाता हूं , और फिर origin/Aचला जाता है। अब मेरी तीन शाखाएँ हैं, जो स्पष्ट रूप से सभी नाम-वार से मेल नहीं खा सकती हैं, लेकिन वे से बनाई गई हैं origin/A, और इसलिए ओपी प्रश्न की शाब्दिक व्याख्या के लिए तीनों को हटाने की आवश्यकता होगी। हालांकि, यह वांछनीय नहीं हो सकता है, यदि आप उन्हें मैच करने के लिए एक विश्वसनीय तरीका भी पा सकते हैं ...


107
यह स्थानीय शाखाओं को नष्ट नहीं करता है, शाखाओं को केवल दूरस्थ संकेत
जाप

4
यह केवल इन स्थानीय शाखाओं को हटाता है, जो रिमोट में मौजूद नहीं है और आपने कभी भी इन पर चेकआउट नहीं किया है।
जारेक जकुबोव्स्की

15
आपको जाप नोट्स के रूप में प्रश्न को और अधिक ध्यान से पढ़ना चाहिए। इस जवाब के लिए मतदान करने वाले लोगों को यह भी पढ़ना चाहिए कि प्रश्न वास्तव में क्या है।
सोरेन बोइसन

4
हां, यह वास्तव में वही था जो मैं करना चाहता था! @ SørenBoisen मुझे उम्मीद है कि पिछले दो वर्षों में आपके पास उस राय को फिर से जानने का समय है ... यदि SO पर पोस्ट की गई सामग्री हमेशा केवल उसी चीज़ से संबंधित होनी चाहिए जो कभी-कभी भ्रमित ओपी पूछती है, तो हम बहुत सारी जानकारी निकाल देंगे। कृपया यह न मानें कि वे लोगों को यह निर्देश कैसे दे सकते हैं कि वे आधिकारिक दिशानिर्देशों के अलावा इस साइट का उपयोग कैसे कर सकते हैं, और वे स्पष्ट रूप से रूढ़िवादी उपयोगी जवाबों को नहीं रोकते हैं।
फेलिक्स गगनोन-ग्रेनियर

6
@ FélixGagnon-Grenier यहाँ इस जवाब के साथ मेरा मुद्दा है: 1) सवाल क्रिस्टल स्पष्ट है, ओपी स्पष्ट रूप से भ्रमित नहीं है। 2) इस उत्तर में यह उल्लेख नहीं है कि यह प्रश्न का उत्तर नहीं देता है! 3) सवाल पहले से ही रिमोट-ट्रैकिंग शाखाओं को प्रून करने का एक तरीका है जो अब मौजूद नहीं है, इसलिए यह शून्य मान जोड़ता है।
सोरेन बोइसन

117

यह उन स्थानीय शाखाओं को हटा देगा जिनके लिए दूरस्थ ट्रैकिंग शाखाएँ छंट गई हैं। (सुनिश्चित करें कि आप masterशाखा में हैं!)

git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d

विवरण:

  • git branch -vv स्थानीय शाखाओं के लिए "चला गया" प्रदर्शित करता है कि रिमोट को काट दिया गया है।

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -dजाँच करेगा कि क्या इसे मर्ज किया गया है ( -Dचाहे इसे हटा दें)

    error: The branch 'mybranch' is not fully merged.
    

15
तुम भी आदेश के साथ कम कर सकते हैंgit branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
chiborg

4
केवल यह इंगित करने के लिए कि आपको ऐसा करने से पहले मास्टर पर होना चाहिए, क्योंकि git branch -dशाखाओं के खिलाफ तुलना करता है HEAD
स्टीव बेनेट

अति उत्कृष्ट! मैंने देखा और इसके लिए देखा। काश मैं अपने जवाब को देख पाता इससे पहले कि मैं इसे अपने दम पर खत्म करता। इससे मुझे कुछ मिनटों की बचत होती। यहाँ मेरा दूसरा जवाब है: stackoverflow.com/questions/15661853/…
कार्ल विल्बर

1
मैं एक समान गिट उर्फ ​​के साथ समाप्त हुआ, क्योंकि कुछ कारणों से काम नहीं आया, क्योंकि कट का उपयोग किया जाता है:prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Zitrax

3
ओह दोस्त ... समझदार आप की जरूरत है अपने जवाब को अपडेट करने के लिए लोगों को बताएं कि उन्हें मास्टर पर होना चाहिए। बस एक अलग शाखा से ऐसा किया। @ stevebennet2 जानकारीपूर्ण टिप्पणी के लिए धन्यवाद
ग्रेडफ़ॉक्स

53

जब आप हटाए जाने पर हटाए गए दूरस्थ शाखाओं के संदर्भ को स्वचालित रूप से हटाने के लिए Git को कॉन्फ़िगर कर सकते हैं:

git config --global fetch.prune true

कॉल करते समय git fetchया git pullबाद में, हटाए गए दूरस्थ शाखाओं के संदर्भ स्वचालित रूप से हटा दिए जाते हैं।


5
यह स्थानीय शाखाओं को नहीं हटाता है, बस उन्हें संदर्भित करता है, है ना?
क्लिंट ईस्टवुड

@ClintEastwood यह केवल दूरस्थ शाखाओं के संदर्भ हटाता है । आप दूरस्थ शाखाओं का उपयोग करके संदर्भों को सूचीबद्ध कर सकते हैं git branch -r
wedesoft

52

एक साफ सुथरा एनपीएम पैकेज है जो इसे आपके लिए करता है (और इसे क्रॉस प्लेटफॉर्म पर काम करना चाहिए)।

इसे स्थापित करें: npm install -g git-removed-branches

और फिर git removed-branchesआपको सभी बासी स्थानीय शाखाओं को दिखाएगा, और git removed-branches --pruneवास्तव में उन्हें हटा देगा।

अधिक जानकारी यहाँ।


1
यह वास्तव में अधिक upvotes होना चाहिए। प्लेटफॉर्म की परवाह किए बिना जीवन को आसान बनाने के लिए धन्यवाद।
एनक्रिप्शन

काम थोड़ा विस्तार। स्थापित और विंडोज 10 पर ठीक काम किया। थोड़ा ध्यान दें: यह गैर-मर्ज की गई शाखाओं को प्रीने-सक्षम (त्रुटि - रनिंग के दौरान त्रुटि, हालांकि सिर्फ शाखा-डी कहा जाता था) मानता है .. हालांकि वे प्रारंभिक रूप में इस तरह से चिह्नित नहीं हैं लिस्टिंग दिखाई गई।
user2864740

1
यह मेरा पसंदीदा उत्तर है। npx git-removed-branchesएक सपने की तरह काम करता है।
दारजीसिल

हाँ! यह अधिक upvotes होना चाहिए! cli की नौसिखिया के लिए इतना सरल और सहज समाधान
geoseong

यह देखना उपयोगी होगा कि टूल जीआईटी के नजरिए से क्या कर रहा है।
ryanwebjackson

41

विंडोज समाधान

Microsoft Windows पॉवर्सशेल के लिए:

git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}

explaination

git checkout master मास्टर शाखा में स्विच

git remote update origin --prune सुदूर शाखाओं को prunes

git branch -vvसभी शाखाओं का वर्बोज़ आउटपुट मिलता है ( git reference )

Select-String -Pattern ": gone]" केवल उन रिकॉर्ड्स को प्राप्त करता है जहां उन्हें रिमोट से हटा दिया गया है।

% { $_.toString().Split(" ")[0]} शाखा का नाम प्राप्त करें

% {git branch -d $_} शाखा को हटा देता है


अच्छा उदाहरण है। वैकल्पिक रूप से git remote prune origin, चयन-स्ट्रिंग भी git के नवीनतम संस्करण के साथ मेल नहीं खाती है। उपयोग करने पर विचार करेंConvertFrom-String -TemplateContent
बर्नी व्हाइट

3
ऐसा लगता है कि git का नवीनतम संस्करण कुछ अनुगामी रिक्त स्थान जोड़ता है, इसलिए स्प्लिट शाखा का नाम पाने के लिए काम नहीं करता है। Do .toString ()। ट्रिम ()। स्प्लिट ("") और यह होगा
क्रिस हाइन्स

यहाँ मेरा है:git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
ओमजीग

@Omigig क्या करता है कि अलग तरीके से? क्या आप स्पष्टीकरण दे सकते हैं
chris31389

@ chris31389, मेरे पास वह सब कुछ पाने के लिए है जिसमें मैं मास्टर से गायब हूँ, और मैंने शाखा को बदल दिया है - नहीं और स्वामी को, मैं यह सुनिश्चित करना चाहता हूं कि मैं केवल --मर की गई शाखाओं को हटा दूं। यह सिर्फ मुझे बेहतर महसूस
करवाता है

27

यह उन स्थानीय शाखाओं को सूचीबद्ध करेगा जिनकी रिमोट ट्रैकिंग शाखा रिमोट से हटाई गई है

$ git remote prune origin --dry-run

यदि आप इन स्थानीय शाखाओं को स्थानीय से हटाना चाहते हैं, जो अन ट्रैक हैं

$ git remote prune origin

19
इस सवाल का जवाब नहीं है, यह वही है जो ओपी पहले से जानता था।
केन विलियम्स

2
मैं भी सहमत हूं, लेकिन जब आप "स्थानीय ट्रैकिंग शाखाओं को कैसे दूर करें, जो रिमोट पर मौजूद नहीं हैं" खोजते हैं, तो यह शीर्ष लिंक है और यह उत्तर शीर्षक के साथ मेल खाता है (यदि कोई प्रश्न में पूर्ण विवरण नहीं पढ़ा है), वोटों का कारण है :)
027

यह स्थानीय शाखाओं को नहीं हटाता है। अभी भी इसे चलाने के बाद
शिन

@Xin -dry-run तर्क के बिना कमांड चलाने की कोशिश करें क्योंकि यह वास्तव में कमांड को निष्पादित नहीं करेगा, लेकिन आपको दिखाता है कि यह क्या बदलेगा।
टॉरस्टेन ओजापर्व

18

जैसा कि @tzacks के नोट्स ... एक npm पैकेज है जो इसके लिए आसान है। बस करो:

npx git-removed-branches --prune

(मैंने टिप्पणी की होगी लेकिन पर्याप्त प्रतिष्ठा नहीं)


1
भव्य। कोई झंझट नहीं। खुशी है कि यह एक पूर्ण जवाब था!
दान रेसन

1
यह सबसे ऊपर होना चाहिए। विंडोज में भी काम करता है।
टॉमटैस्टिको

14

यदि Windows और Powershell का उपयोग कर रहे हैं, तो आप उन सभी स्थानीय शाखाओं को हटाने के लिए उपयोग कर सकते हैं जिन्हें वर्तमान में चेक की गई शाखा में विलय कर दिया गया है:

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

व्याख्या

  • वर्तमान शाखा और उन शाखाओं को सूचीबद्ध करता है जिन्हें इसमें मिला दिया गया है
  • वर्तमान शाखा को फ़िल्टर करता है
  • gitप्रत्येक शेष शाखा के नाम के लिए आउटपुट से किसी भी अग्रणी या अनुगामी रिक्त स्थान को साफ करता है
  • विलीन स्थानीय शाखाओं को हटाता है

यह git branch --mergedपहले से ही चल रहा है यह सुनिश्चित करने के लिए कि यह केवल वही है जो आप इसे करने की उम्मीद करते हैं।

(रखी / से स्वचालित http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/ ।)


10

छोटा और सुरक्षित एक-लाइनर:

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

शाखा को चेकआउट करना सुनिश्चित करें जो अभी विलय नहीं हुआ है, इसे चलाने से पहले। क्योंकि आप उस शाखा को नहीं हटा सकते हैं जिसे आप वर्तमान में चेक कर रहे हैं।


3
क्या यह आपके 'स्वामी' को भी हटा देगा?
डेक्कन

2
यदि आप वर्तमान में मास्टर में जाँच करते हैं तो नहीं, अन्यथा हाँ
फेलिकजेड

1
मास्टर को छोड़ने के लिए आप सिर्फ पाइप को पकड़ सकते हैं और उलटा चुन सकते हैं, जैसे कि - git branch -d $(git branch --merged | cut -c 3- | grep -v master)
mozillalives

यह असुरक्षित है और भविष्य में कोई व्यक्ति अनजाने में अपनी मास्टर ब्रांच को डिलीट कर देगा
jasonseminara

1
@jasonseminara #dcsan मैंने स्निपेट अपडेट किया है, इसलिए यह मास्टर शाखा को छोड़ देता है। #mozillalives धन्यवाद
फेलिकजैड

9

मुझे कुछ ऐसा चाहिए था, जो एक दूरस्थ शाखा पर नज़र रखने वाली सभी स्थानीय शाखाओं को शुद्ध कर दे origin, जहाँ पर दूरस्थ शाखा को हटा दिया गया है ( gone)। मैं उन स्थानीय शाखाओं को हटाना नहीं चाहता था जो कभी भी एक दूरस्थ शाखा (यानी: मेरी स्थानीय देव शाखाओं) को ट्रैक करने के लिए सेट नहीं की गई थीं। इसके अलावा, मैं एक साधारण एक-लाइनर चाहता था जो कि gitकस्टम स्क्रिप्ट लिखने के बजाय सिर्फ एक साधारण सीएलआई उपकरण का उपयोग करता है । मैंने थोड़ा सा उपयोग करके grepऔर awkइस साधारण कमांड को बनाने के लिए समाप्त किया , फिर इसे अपने में एक उपनाम के रूप में जोड़ा ~/.gitconfig

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D

यहाँ इसे git config --global ...आसानी से जोड़ने के लिए एक आदेश दिया गया है git prune-branches:

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'

नोट: -Dध्वज का git branchउपयोग बहुत खतरनाक हो सकता है। इसलिए, ऊपर दिए गए config कमांड में मैं इसके बजाय -dविकल्प का उपयोग करता हूं ; मैं अपने वास्तविक विन्यास में उपयोग करता हूं। मैं उपयोग करता हूं क्योंकि मैं अनइंज्ड शाखाओं के बारे में शिकायत नहीं सुनना चाहता हूं, मैं चाहता हूं कि वे चले जाएं। आप इस कार्यक्षमता को भी चाह सकते हैं। यदि हां, तो बस का उपयोग करने के बजाय कि config आदेश के अंत में।git branch-D-D-D-D-d


8

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

$git remote prune origin

पहले से विलीन हो चुकी स्थानीय शाखाओं को हटाने के लिए:

$git branch -D $(git branch --merged)

मेरे लिये कार्य करता है। धन्यवाद।
AndroidRuntimeException

2
(गिट शाखा - डूबा हुआ) भी मेरे लिए 'मास्टर' देता है। और अन्य शाखाएँ जिन्हें रिमोट पर डिलीट नहीं किया गया है।
टॉम जी

8
इससे मेरी मास्टर ब्रांच डिलीट हो गई।
ग्रेग

5

एक सुरक्षित वन-लाइनर प्रतीत नहीं होता है, बहुत सारे किनारे के मामले (जैसे कि इसके नाम के भाग के रूप में "मास्टर" वाली शाखा)। सबसे सुरक्षित है ये कदम:

  1. git branch -vv | grep 'gone]' > stale_branches.txt
  2. फ़ाइल को देखें और उन शाखाओं के लिए लाइनें हटाएं जिन्हें आप रखना चाहते हैं (जैसे कि मास्टर शाखा!); आपको किसी भी लाइन की सामग्री को संपादित करने की आवश्यकता नहीं है
  3. awk '{print $1}' stale_branches.txt | xargs git branch -d

5

ऊपर दिए गए उत्तरों के आधार पर मैं इस छोटे से एक लाइनर का उपयोग कर रहा हूँ:

git remote prune origin | awk 'BEGIN{FS="origin/"};/pruned/{print $2}' | xargs -r git branch -d

इसके अलावा, यदि आप पहले से ही चुभ चुके हैं और स्थानीय झूलने वाली शाखाएं हैं, तो यह उन्हें साफ करेगा:

git branch -vv | awk '/^ .*gone/{print $1}' | xargs -r git branch -d

1
काम नहीं करता है अगर आपकी शाखा के नाम /उनमें हैं
22

4

यह निश्चित नहीं है कि यह सब एक साथ कैसे किया जाए, लेकिन git branch -d <branchname>अगर यह पूरी तरह से विलय हो जाता है तो git एक स्थानीय शाखा को हटा देगा। नोट लोअरकेस d।

git branch -D <branchname> (ध्यान दें कि राजधानी D) अपनी मर्ज किए गए स्थिति की परवाह किए बिना एक स्थानीय शाखा को हटा देगी।


विंडोज पर, अन्य जवाब मेरे काम नहीं आए। इस जवाब का उपयोग करते हुए सरल -D स्विच किया (भले ही शाखा पहले ही "हटा दी गई थी")।

क्या हम इसे एक बार में सभी शाखाओं के लिए कर सकते हैं?
टेमन शिपही

3

आप इस कमांड का उपयोग कर सकते हैं:

git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d

Git Clean: कमांड के ब्रेक डाउन सहित पहले से हटाए गए शाखाओं को हटा दें


आपको वास्तव में किसी भी शाखा (पूर्व मास्टर) को फ़िल्टर करने की आवश्यकता नहीं है। अगर यह "मर्ज" हो जाता है, तो इसका मतलब है कि यह आपकी स्थानीय कॉपी निकाल देगा, लेकिन "गिट चेकआउट देव" रिमोट से एक स्थानीय शाखा बनाएगा यदि पहले से मौजूद नहीं है
csga5000

लेकिन स्थानीय शाखा सूची में अभी भी हैं, भले ही उनका विलय हो। यह कमांड इन शाखाओं को हटाने के लिए है जिन्हें रिमोट से हटा दिया गया है।
sendon1982

शुरुआत में तारांकन का अर्थ है वर्तमान शाखा, जब आप उस शाखा को अलग-अलग शाखा पर चलाते हैं तो यह अच्छी तरह से काम नहीं करेगी
OzzyCgate

2

ऊपर दिए गए उत्तरों के आधार पर मैं इस एक पंक्ति के समाधान के साथ आया:

git remote prune origin; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

2

@ Wisbucky के उत्तर पर एक वेरिएंट का उपयोग करते हुए, मैंने निम्नलिखित को अपनी ~/.gitconfigफ़ाइल में उपनाम के रूप में जोड़ा :

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

इसके साथ, एक साधारण git pruneitgoodदोनों स्थानीय और दूरस्थ शाखाओं को साफ कर देगा जिनकी अब मर्ज के बाद जरूरत नहीं है।


2

का Powershell संस्करण git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}

यह किसी भी स्थानीय शाखा को हटा देगा, जिसे मास्टर में मिला दिया गया है, जबकि आप मास्टर शाखा में हैं

git checkout master स्विच करने के लिए।


1

शिले का वैरिएंट मेरे लिए काम नहीं करता (उबंटू 12.04), इसलिए मुझे मेरे (स्पष्ट और चमकदार :) संस्करण का प्रस्ताव दें:

वेरिएंट 1 (मैं इस विकल्प को पसंद करूंगा):

git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D 

वेरिएंट 2:

ए। पूर्वाभ्यास:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

ख। शाखाएँ निकालें:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D

1

विंडोज उपयोगकर्ताओं के लिए @ वारबैंक के उत्तर का अनुकूलन निम्नलिखित है:

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

मैं पॉश-गिट का उपयोग करता हूं और दुर्भाग्यवश PS को नग्न पसंद नहीं है for, इसलिए मैंने PruneOrphanBranches.cmd नामक एक सादे 'ol कमांड स्क्रिप्ट बनाई।

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

किसी सूची को देखने के लिए इसे बिना किसी पैरामीटर के साथ कॉल करें, और फिर इसे "-d" के साथ वास्तविक विलोपन या "-D" करने के लिए किसी भी शाखाओं के लिए कॉल करें जो पूरी तरह से विलय नहीं हैं लेकिन जिसे आप वैसे भी हटाना चाहते हैं।


यह मेरे लिए काम नहीं किया, किसी तरह :या : (एक स्थान के साथ) के findstrकारण यह हर बार सब कुछ मेल खाने के लिए - मैंने लगभग मास्टर को हटा दिया। हालाँकि, रेगेक्स ने ठीक काम किया:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
जोश

1

हटाए गए शाखाओं के संदर्भ और प्रून संदर्भों को लाने के लिए इसे git bash में आज़माएं, और फिर हटाए गए स्थानीय शाखाओं को prune करें:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

याद रखें कि पहले एक शाखा को चेकआउट करें जिसे हटाया नहीं जाएगा, ताकि शाखा को हटाने का काम अवरुद्ध न हो।


0

मैंने स्वीकृत उत्तर को एक मजबूत स्क्रिप्ट में बदल दिया है। आप इसे मेरे गिट-एक्सटेंशन रिपॉजिटरी में पाएंगे ।

$ git-prune --help
Remove old local branches that do not exist in <remote> any more.
With --test, only print which local branches would be deleted.
Usage: git-prune [-t|--test|-f|--force] <remote>

0

मैं इस पृष्ठ पर "मैं स्थानीय रूप से जाँच की गई शाखाओं को कैसे हटाऊं, जिनकी अब अपस्ट्रीम शाखा नहीं है," का उत्तर मांगते हुए इस पृष्ठ पर पहुँच गया हूँ

मुझे इस बात की भी परवाह नहीं थी कि स्थानीय शाखा को अभी तक मर्ज किया गया है या नहीं, क्योंकि पाइपिंग में git branch -dबस डूबे हुए स्थानीय शाखाओं को हटाने के बजाय चेतावनी दी जाएगी।

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff


0

यहाँ मेरा समाधान है:

git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
  • -p किसी भी रिमोट-ट्रैकिंग संदर्भ को दूर करना है जो अब रिमोट पर मौजूद नहीं है। तो पहला कदम दूरस्थ शाखाओं के संदर्भों को हटा देगा।

  • -vv अपस्ट्रीम ब्रांच (यदि कोई हो) के संबंध के साथ-साथ प्रत्येक सिर के लिए sha1 और कमिटेड लाइन दिखाने के लिए है। दूसरा चरण सभी स्थानीय शाखाओं को मिलेगा और grep कमांड उन शाखाओं को फ़िल्टर कर देगा जिन्हें हटा दिया गया है।


-2

किसी भी शाखा को हटा दें जो मास्टर के साथ अद्यतित नहीं है

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null

-3

मुझे पूरा यकीन git remote prune originहै कि आप यही चाहते हैं।

के रूप में आप इसे चला सकते हैं git remote prune origin --dry-runदेखने के लिए क्या यह होगा कोई बदलाव किए बिना करते हैं।


12
यह वास्तव में स्थानीय शाखा को ही नहीं हटाता है।
तय्य

-17

GUI का उपयोग करना? मैनुअल प्रक्रिया, लेकिन त्वरित और आसान।

$ git gui

"शाखा -> हटाएं" चुनें। आप ctrl-click (विंडोज़) के साथ कई शाखाओं का चयन कर सकते हैं और उन सभी को हटा सकते हैं।


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