क्या आप Git के साथ एक कमांड में कई शाखाएं हटा सकते हैं?


355

मैं अपनी स्थानीय रिपॉजिटरी को साफ करना चाहता हूं, जिसमें पुरानी शाखाओं की एक टन है: उदाहरण के लिए 3.2,3.2.1 , 3.2.2, आदि

मैं एक ही बार में उनमें से बहुत से हटाने के लिए डरपोक तरीके से उम्मीद कर रहा था। चूंकि वे ज्यादातर एक डॉट रिलीज कन्वेंशन का पालन करते हैं, मैंने सोचा कि शायद कहने के लिए एक शॉर्टकट था:

git branch -D 3.2.*

और सभी 3.2.x शाखाओं को मार डालो।

मैंने उस आदेश की कोशिश की और यह, निश्चित रूप से, काम नहीं किया।


11
git branch -D $(git branch | grep 3.2*)- यह मेरे लिए काम किया। यह उन शाखाओं को हटा देता है जिनका नाम "3.2" से शुरू होता है। grep- आउटपुट में पैटर्न मिलान ( git branchइस मामले में)। $()- का अर्थ है निष्पादित करें और परिणाम को रखें। |- जंजीर।
एडुआर्ड

4
उन लोगों के लिए ध्यान देने योग्य है जो नहीं जानते, कि -Dएक बल हटाना है, -dज्यादातर मामलों में पहले सुरक्षित होने के लिए उपयोग करना चाहिए ।
redfox05

जवाबों:


363

उस वाक्य रचना के साथ नहीं। लेकिन आप इसे इस तरह से कर सकते हैं:

git branch -D 3.2 3.2.1 3.2.2

असल में, git ब्रांच आपके लिए एक ही मंगलाचरण के साथ कई ब्रांच को हटा देगी। दुर्भाग्य से यह शाखा का नाम पूरा नहीं करता है। हालांकि, को कोसने में, आप कर सकते हैं:

git branch -D `git branch | grep -E '^3\.2\..*'`

3
git branch -D/-dमेरे लिए ठीक काम पूरा हो गया । आपका अद्यतन करना चाहते हो सकता है (शायद सबसे हाल ही में git.git contrib निर्देशिका से)।
कास्कैबेल

19
इसके बजाय git branch | ...आप उपयोग कर सकते हैं $(git for-each-ref --format='%(refname:short)' refs/heads/3.*)। यह लंबे समय तक है, मुझे पता है, लेकिन यह उपयुक्त आउटपुट होने की गारंटी है, जबकि git branchचीजों के साथ बहुत अच्छा आउटपुट है ( *और ->सिमरेट्स के लिए) जो आपको स्क्रिप्ट / वन-लाइनर्स में गड़बड़ कर सकता है।
कैस्केबेल

3
हो सकता है कि मैं केवल इस मुद्दे के साथ एक हूँ, लेकिन मैं है grepएलियास किया गया हमेशा झंडा शामिल --color=always- git branch -Dफेंक दिया गया था error: branch 'my_branch' not found.जब तक मैं रंग ध्वज के बिना भाग गया।
ईबेबसेन

@eebbesen क्या आपने इसे विश्व स्तर पर अक्षम किया है? मैं रनिंग करते समय एक ही इश्यू में आता हूंgit branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
qmmr

2
ब्रेस विस्तार के साथ आप git branch -D 3.2{,.1,.2}सभी तीन शाखाओं को हटाने के लिए लिख सकते हैं gnu.org/software/bash/manual/html_node/Brace-Expansion.html
लूटे गए

147

खैर, सबसे खराब स्थिति में, आप उपयोग कर सकते हैं:

git branch | grep '3\.2' | xargs git branch -d

22
यह शाखा नामों के लिए मानकीकृत उपसर्ग संकेतन (जैसे "फिक्स / ..." या "फ़ीचर / ...") का उपयोग करने वाले किसी भी व्यक्ति के लिए बहुत ही सही तरीका है।
हज

4
सरल और कुशल! हालांकि, | xargs git branch -dवास्तव में डिलीट होने जा रहा है, यह जांचने के लिए मैं भाग के बिना पहले चलने की सलाह दूंगा।
मैथिलियो

यह grepआउटपुट के लिए अनुशंसित है git branch, जैसा कि इसके पढ़ने के लिए है, पार्सिंग नहीं। कभी भी बदल सकता था। Params के for-each-refसाथ मिलकर उपयोग करें --format, जैसा कि अन्य उत्तरों में सुझाया गया है, और फिर इस उत्तर में सुझावों के साथ संयोजन करें।
redfox05

138
git branch  | cut -c3- | egrep "^3.2" | xargs git branch -D
  ^                ^                ^         ^ 
  |                |                |         |--- create arguments
  |                |                |              from standard input
  |                |                |
  |                |                |---your regexp 
  |                |
  |                |--- skip asterisk 
  |--- list all 
       local
       branches

संपादित करें:

एक सुरक्षित संस्करण (जेकब नारबस्की और जेफ्रोमी द्वारा सुझाया गया), क्योंकि जीआईटी शाखा का उत्पादन स्क्रिप्टिंग में उपयोग करने के लिए नहीं है:

git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D

... या xargs- मुक्त:

git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*`

14
git branchस्क्रिप्टिंग के लिए आउटपुट का उपयोग न करें । का उपयोग करें git for-each-ref
जैकब नार

1
@ प्रतीक के साथ टैग हटाने के लिए:git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
thaddeusmt

एक टाइपो है। होना चाहिए "/ 3.2/*" नहीं "/ 3.2*"। इसके अलावा, प्रतीत होता है कि आपने अन्य उत्तरों को अपने स्वयं में चिपका दिया है।
अधिकतम मैकलेओड

यहां कोई टाइपो नहीं। मैन पेज से:If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
गावी

1
उन लोगों के लिए ध्यान देने योग्य है जो नहीं जानते, कि -Dएक बल हटाना है, -dज्यादातर मामलों में पहले सुरक्षित होने के लिए उपयोग करना चाहिए ।
redfox05

115

आप योग्य शाखाओं को सूचीबद्ध करने के लिए git शाखा - सूची का उपयोग कर सकते हैं और योग्य शाखाओं को हटाने के लिए git शाखा -D / -d का उपयोग कर सकते हैं।

एक लाइनर उदाहरण:

git branch -d `git branch --list '3.2.*'`

जब मैं यह कोशिश करता हूं, मुझे त्रुटि संदेशों का एक गुच्छा मिलता है जैसे error: branch 'package.json' not found.। ऐसा लगता है कि * बहुत जल्दी विस्तारित हो जाता है, और यह हर फ़ाइल और निर्देशिका के नाम के अनुरूप एक शाखा को हटाने की कोशिश करता है।
एंटीमनी

यह अच्छी तरह से काम करता है! मैं इस समस्या के साथ एक उपनाम के रूप में इस का उपयोग करते हुए चल रहा है gitconfigहालांकि ...
whomaniac

6
इस उत्तर को सूची में उच्चतर होने की आवश्यकता है, सुपर क्लीन, काम करता है, कोई grep नहीं है
jemiloii

1
यह अच्छा है कि यह केवल जारी करने से पहले परीक्षण करना आसान हैgit branch --list '3.2.*'
विल

3
खिड़कियों परgit branch -d (git branch --list '3.2.*').trim()
मैटियास जोसेफसन

38

हाल ही में, मैं उसी समस्या के समाधान की तलाश में था, आखिरकार मुझे एक जवाब मिला और यह बहुत अच्छी तरह से काम कर रहा है:

  1. टर्मिनल खोलें, या समकक्ष।
  2. Git शाखा में टाइप करें | हटाए जाने वाली शाखाओं के पूर्वावलोकन के लिए grep "पैटर्न"।
  3. Git शाखा में टाइप करें | grep "पैटर्न" | xargs गिट शाखा -D

यह समाधान बहुत बढ़िया है और यदि आप प्रत्येक कमांड का पूर्ण विवरण चाहते हैं और यह कैसे काम कर रहा है, तो इसका विवरण यहां दिया गया है


28

उपयोग

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
   xargs git branch -D

7
छोटी सी टिप यह है कि यदि आप कमांड के बाद वाले हिस्से को हटाते हैं "| xargs git branch -D" तो यह सिर्फ मिलान शाखाओं को आउटपुट करेगा। तो, आप उन शाखाओं का पूर्वावलोकन कर सकते हैं जिन्हें हटा दिया जाएगा
Max MacLeod

1
इसके अलावा, मैं इस आसान बनाने के लिए एक उपनाम कहा: alias grefs='git for-each-ref --format="%(refname:short)"'तो मैं तो कर सकते हैंgrefs | grep 'regexpattern' | xargs git branch -D
angularsen

पसन्द आया। अच्छा और सरल!
भार्गव पोन्नपल्ली

15

शायद आपको यह उपयोगी लगेगा:

यदि आप उन सभी शाखाओं को हटाना चाहते हैं जो उदाहरण के लिए नहीं हैं 'मास्टर', 'फू' और 'बार'

git branch -D `git branch | grep -vE 'master|foo|bar'`

grep -v 'something' व्युत्क्रम के साथ मेल खाता है।


मुझे व्यक्तिगत रूप -Dसे अन्य उत्तर की तुलना में विकल्प पसंद है। यहाँ उत्तर के लिए धन्यवाद @ अदी। समाधान मेरे लिए काम करता है।
AMIC MING

9

मैंने इस सटीक कारण के लिए शाखा नाम के पहले तीन वर्णों के रूप में अपने इनिशियल्स और एक डैश (-) को रखा:

git branch -D `git branch --list 'at-*'`

सभी जवाब मूल रूप से यह कहते हैं, यह सिर्फ सबसे सरल होने के लिए होता है।
tfantina

7

यदि आप git कमांड प्रॉम्प्ट का उपयोग करने के लिए सीमित नहीं हैं, तो आप हमेशा git guiशाखा-> मेनू आइटम हटा सकते हैं और चला सकते हैं । उन सभी शाखाओं का चयन करें जिन्हें आप हटाना चाहते हैं और इसे चीर दें।


इससे केवल आप स्थानीय शाखाओं को हटा सकते हैं
चुपके रब्बी

7

पॉवर्सशेल समाधान:

यदि आप विंडोज़ चला रहे हैं, तो आप एक साथ कई शाखाएँ हटाने के लिए PowerShell का उपयोग कर सकते हैं ...

git branch -D ((git branch | Select-String -Pattern '^\s*3\.2\..*') | foreach{$_.ToString().Trim()})
//this will remove all branches starting with 3.2.

git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})
// this will delete all branches that contains the word "feature-" as a substring.

आप यह भी ठीक धुन कर सकते हैं कि पॉवर्सशेल के सलेक्ट-स्ट्रिंग कमांड का उपयोग करके पैटर्न से कैसे मेल खाना चाहिए। पावरशेल डॉक्स पर एक नज़र डालें ।


6

"विकसित" रखें और स्थानीय में अन्य सभी को हटा दें

    git branch | grep -v "develop" | xargs git branch -D 

5

मैंने एक छोटा सा फंक्शन बनाया, जो @gawi (ऊपर) द्वारा उपलब्ध कराए गए उत्तर के आधार पर उपयोगी हो सकता है।

removeBranchesWithPrefix() {
  git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d
}

उसे अपने में जोड़ें .bash_profileऔर अपने टर्मिनल को पुनरारंभ करें। तब आप इस तरह से कमांड-लाइन से कॉल कर सकते हैं:

removeBranchesWithPrefix somePrefix

ध्यान दें

मेरे पास वर्तमान में एक सॉफ्ट डिलीट के लिए सेटअप है, जिसका अर्थ है कि यह शाखाओं को तब तक नहीं हटाएगा, जब तक कि वे पहले से ही मर्ज न हो गए हों। आप किनारे, परिवर्तन पर रहना पसंद करते हैं -dकरने के लिए -Dहै और यह उपसर्ग के साथ सब कुछ परवाह किए बिना नष्ट करेगा!


5

यदि आपको वास्तव में अपनी सभी शाखाओं को साफ करने की आवश्यकता है, तो प्रयास करें

git branch -d $(git branch)

यह आपकी सभी स्थानीय मर्ज की गई शाखाओं को हटा देगा, सिवाय इसके कि आप वर्तमान में जाँच कर रहे हैं।

अपने स्थानीय को साफ-सुथरा बनाने का यह एक अच्छा तरीका है


इसने मेरे लिए काफी अच्छा काम किया। इसने दो शाखाओं को छोड़ दिया, एक को छोड़कर मैं एक था जिसे मैंने उसी कमांड का उपयोग करके हटा दिया था लेकिन "-d" के बजाय एक राजधानी "-D" का उपयोग कर रहा था। मुझे फ़ाइलों को नहीं ढूंढने के बारे में कुछ त्रुटियां मिलीं, लेकिन शाखाएं हटा दी गईं।
लुरिफ़ैक्सेल

3

आपको यह छोटी वस्तु पसंद आ सकती है ... यह सूची को खींचती है और अंत में सभी चयनों को हटाने से पहले प्रत्येक आइटम की पुष्टि करने के लिए कहती है ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done`

उपयोग -D को हटाने के लिए मजबूर करें (हमेशा की तरह)।

पठनीयता के लिए, यह है कि लाइन से लाइन टूट गई ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* |
    while read -r line; do 
        read -p "remove branch: $line (y/N)?" answer </dev/tty;
        case "$answer" in y|Y) echo "$line";; 
        esac; 
    done`

यहाँ xargs दृष्टिकोण है ...

git for-each-ref --format="%(refname:short)" refs/heads/\* |
while read -r line; do 
    read -p "remove branch: $line (y/N)?" answer </dev/tty;
    case "$answer" in 
        y|Y) echo "$line";; 
    esac; 
done | xargs git branch -D

आखिरकार, मुझे अपने .bashrc में यह पसंद है

alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done'

इस तरह मैं सिर्फ कह सकता हूं

gitSelect | xargs git branch -D.

3

शुद्ध आत्माओं के लिए जो यहां पॉवरशेल का उपयोग करते हैं छोटी स्क्रिप्ट git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })


2

यह मेरे लिए सही ढंग से काम करता है:

git branch | xargs git branch -d

git branch | xargs git branch -D

सभी स्थानीय शाखाओं को हटा दें


2

सभी शाखाओं को हटाने के लिए निम्नलिखित आदेश का उपयोग करें (चेक की गई शाखा को हटाया नहीं जाएगा)।

git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d

संपादित करें: मैं एक मैक ओएस का उपयोग कर रहा हूं


0

मैं खिड़कियों पर हूं, आप ऐसा करने के लिए पॉवरशेल का उपयोग कर सकते हैं:

 git branch | grep 'feature/*' |% { git branch -D $_.trim() }

feature/*अपनी पसंद के किसी भी पैटर्न के साथ बदलें ।


6
grep मेरे लिए एक मान्यता प्राप्त cmdlet नहीं है ... इसलिए मैंने इस git शाखा के लिए बदलाव किया है जहाँ {$ _। ट्रिम ()। StartsWith ("बग")} | % {git Branch -D $ _। ट्रिम ()} और काम किया!
एलेक्स

0

आप इस कमांड का उपयोग कर सकते हैं: git branch -D $(printf "%s\n" $(git branch) | grep '3.2')



0

आप git guiएक साथ कई शाखाओं को हटाने के लिए उपयोग कर सकते हैं । कमांड प्रॉम्प्ट / बैश से -> git gui-> रिमोट -> डिलीट ब्रांच ... -> उन रिमोट शाखाओं का चयन करें जिन्हें आप हटाना चाहते हैं -> डिलीट करें।


0

मैंने आज अप्रचलित स्थानीय / दूरस्थ शाखाओं के एक बड़े समूह की सफाई की।

नीचे मैंने ऐसा कैसे किया:

1. एक पाठ फ़ाइल के लिए सभी शाखा नामों की सूची:

git Branch -a >> BranchNames.txt

2. उन शाखाओं को जोड़ें जिन्हें मैं "git branch -D -r" कमांड को हटाना चाहता हूं:

git Branch -D -r उत्पत्ति / dirA / branch01 मूल / dirB / Branch02 मूल / dirC / Branch03 (... जो भी शाखा नाम संलग्न करें)

3. cmd निष्पादित करें

और यह " गिट पुश ओरिजिन - शेड " की तुलना में बहुत तेज़ और विश्वसनीय काम करता है ।

यह अन्य उत्तरों में सूचीबद्ध के रूप में सबसे स्मार्ट तरीका नहीं हो सकता है, लेकिन यह एक बहुत सीधे आगे है, और उपयोग करने में आसान है।


0

यदि आपने Git GUI स्थापित किया है, जो विंडोज के लिए एक डिफ़ॉल्ट ऐड-ऑन है, तो यह सबसे सरल है। आप कई शाखाओं को चुनने और उन्हें एक क्लिक से हटाने के लिए ctrl का उपयोग कर सकते हैं।


0

यदि आप फिश शेल का उपयोग कर रहे हैं, तो आप stringकार्यों का लाभ उठा सकते हैं :

git branch -d (git branch -l "<your pattern>" | string trim)

यह कुछ अन्य उत्तरों में पॉवर्सशेल विकल्पों से बहुत अलग नहीं है।


0

यदि आपके पास पाठ फ़ाइल (शाखा-से-डेलटेक्स्ट) (प्रति पंक्ति एक शाखा) में हटाने के लिए सभी शाखाएँ हैं, तो आप दूरस्थ (मूल) से ऐसी सभी शाखाओं को हटाने के लिए ऐसा कर सकते हैं: xargs -a branches-to-del.txt git push --delete origin


0

एक निर्दिष्ट पैटर्न के आधार पर कई शाखाओं को हटाने के लिए निम्न कार्य करें:

निम्नलिखित कमांड में टर्मिनल या समकक्ष खोलें और टाइप करें:

git branch | grep "<pattern>" (preview of the branches based on pattern)

git branch | grep "<pattern>" | xargs git branch -D (replace the <pattern> with a regular expression to match your branch names)

सभी 3.2.x शाखाएं निकालें, आपको टाइप करना होगा

git branch | grep "3.2" | xargs git branch -D

बस इतना ही!

तुम तैयार हो!


-1

जैसे कि Git repo के संदर्भ में सभी शाखाएँ कुछ भी नहीं हैं, तो आप बस जाने वाली शाखाओं को क्यों नहीं हटाते हैं .git/refऔर फिर यदि कुछ भी छोड़ दिया जाता है जो कि रिपॉजिटरी में दिलचस्प नहीं है, तो स्वचालित रूप से एकत्र किया गया कचरा होगा। परेशान करने की जरूरत है।



-4

आप सभी अनावश्यक रेफरी को हटाने वाली सभी शाखाओं को हटा सकते हैं:

rm .git/refs/heads/3.2.*


2
दो कारणों से डाउनवोट किया गया: 1. यह एक कार्यान्वयन विवरण का उपयोग करता है (तथ्य यह है कि गिट के वर्तमान संस्करण शाखाओं को एक निश्चित निर्देशिका में फ़ाइलों के रूप में संग्रहीत करते हैं)। यह भविष्य के संस्करणों में उत्तर को अमान्य करते हुए बदल सकता है। 2. यह काम नहीं करता है यदि रिपॉजिटरी एक अलग निर्देशिका में स्थित है ।
अक्षीय

इसके अलावा, यह बहुत अप्रत्याशित परिणाम पैदा करता है यदि आप इसे एक पैक भंडार ( git gc) पर चलाते हैं । ऐसा मत करो।
Matthieu Moy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.