Git में कई दूरस्थ शाखाओं को हटाएं


128

मेरे पास एक टीम का सदस्य है, जिसने अनजाने में अपनी स्थानीय शाखाओं में से 150 से अधिक को हमारे केंद्रीय रेपो में धकेल दिया। शुक्र है, उन सभी में एक ही उपसर्ग है। उस उपसर्ग का उपयोग करते हुए, क्या कोई git कमांड या कूल लिटिल शेल स्क्रिप्ट है जो मैं उपयोग कर सकता हूं जो उन सभी को एक ही बार में हटा देगा?

जवाबों:


150

PREFIXदूरस्थ सर्वर पर उपसर्ग के साथ सभी शाखाओं को हटाने के लिए निम्न कमांड का उपयोग करें ।

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}

आप यह देखने के लिए पहले ड्राई-रन करना चाहते हैं कि क्या यह वह शाखाएँ हैं जिन्हें आप हटाना चाहते हैं:

git branch -r | awk -F/ '/\/PREFIX/{print $2}'

2
मुझे यह पसंद है क्योंकि यह एक लाइनर है और मैं पहले एक सूखा रन कर सकता हूं। दुर्भाग्य से, यह इस संदेश के साथ $ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
त्रुटिपूर्ण है

साथ git branch -r | awk -F/ '/\/APR/{print $2}', आप सभी अप्रैल शाखा के नाम पहले से जुड़ा हुआ सूचीबद्ध देख सकते हैं?
नीवेक

1
ठीक है, यह है क्योंकि APR-04-DPHशाखा पहले ही हटा दी गई थी। : इन प्रश्नों का उत्तर दिया पर एक नजर डालें इस और इस और भी इस । उन सवालों के जवाब एक ही समस्या को संबोधित करते हैं, आप स्वयं समाधानों का परीक्षण करना चाह सकते हैं।
नीवेक

26
यदि आपके पास अपनी शाखा के नाम हैं (यदि आप गिट-फ्लो या कुछ का उपयोग कर रहे हैं), तो इसके बजाय {$ 2 "/" $ 3} प्रिंट करें
ajma

4
मैं विंडोज़ में msysgit का उपयोग कर रहा हूं, और निम्न कमांड ने मेरे लिए काम किया (फॉरवर्ड स्लैश वाले शाखा नामों के लिए @ ajma की टिप्पणी के साथ संयोजन में:git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
rikoe

96

यदि आप एक सरल दृष्टिकोण पसंद करते हैं, उदाहरण के लिए 3 या 4 शाखाएँ हटाएँ:

git push origin --delete <branch1> <branch2> <branch3>

महत्वपूर्ण: केवल Git v1.7.0 और इसके बाद के संस्करण पर काम करता है।


6
मैं का उपयोग कर समाप्त हो गयाgit branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
अराम Kocharyan

36

Neevek को शानदार और सुरुचिपूर्ण समाधान के लिए धन्यवाद !

लेकिन मुझे शाखा के नामों में स्लैश के साथ कुछ परेशानियाँ हैं (जैसे मैं Git Flow का उपयोग कर रहा हूँ), क्योंकि awkक्षेत्र विभाजक /( -Fविकल्प)

तो मेरा समाधान नीवेक पर आधारित है , लेकिन सही ढंग से शाखा नामों के साथ /। इस मामले में मुझे लगता है कि अपने रिमोट बुलाया origin। दूरस्थ शाखाओं को हटाने के लिए कमांड जिनके नाम घूर रहे हैं PATTERN:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}

और यह जांचना न भूलें कि आप क्या हटाने जा रहे हैं:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

USEFUL TIP: यदि आपकी शाखा के नाम (बिना origin/उपसर्ग के) पाठ फ़ाइल में संग्रहीत हैं (प्रति पंक्ति एक शाखा नाम), तो बस चलाएं:

cat your_file.txt | xargs -I {} git push origin :{}

2
के xargs -a file -Lबजाय का उपयोग करें cat file | xargs। और भी सरल xargs -a file git push --delete origin
MUSIKK

15

यह एक डुप्लिकेट उत्तर हो सकता है लेकिन नीचे परीक्षण किया गया और मेरे लिए पूरी तरह से काम किया।

  1. स्थानीय शाखा को बलपूर्वक हटाएं

git शाखा -D शाखा-नाम

  1. दूरस्थ शाखा हटाएं

git पुश ओरिजिन --delete शाखा-नाम

  1. 1 से अधिक स्थानीय शाखा हटाएं

git शाखा -D शाखा-name1 शाखा-नाम २

  1. 1 से अधिक दूरस्थ शाखा हटाएं

git पुश ओरिजिन --delete Branch-name1 branch-name2

  1. उपसर्ग के साथ स्थानीय शाखा हटाएं। उदाहरण के लिए, सुविधा / *

git शाखा -D $ (git शाखा - सूची 'सुविधा / *')

git ब्रांच -D बैकटिक्स $ (git ब्रांच - लिस्ट 'फ़ीचर / *' बैकटिक्स )

  1. उपसर्ग के साथ दूरस्थ शाखा की सूची बनाएं।

git शाखा -r | grep -Eo 'सुविधा /.*'

  1. उपसर्ग के साथ दूरस्थ शाखा हटाएं

git शाखा -r | grep -Eo 'सुविधा /.*' | xargs -I {} git पुश ओरिजिन: {}


2
मुझे लगता है कि आप चरण 5 में बैकटिक्स से बचने का मतलब है
जीपीएल

बैकटिक्स कैसे जोड़ें?
नरेन

1
@ चेतावनी: समस्या यह है कि मार्कडाउन स्वरूपण आपके बैकटिक्स को स्टाइलिंग कमांड में बदल देता है। मैंने उन्हें एक अलग कमांड प्रतिस्थापन विधि के साथ बदल दिया (उदाहरण के लिए "$ (कमांड)", 'कमांड' के बराबर है, लेकिन कुछ अजीब में मार्कडाउन द्वारा अनुवादित नहीं किया गया है।) दूसरी चीज जो आप कर सकते हैं, वह '\' के साथ बैकस्टिक्स से बच सकती है।
१०:२१ पर १०

13

Grep के साथ भी ऐसा ही git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}:।

branch -rदिखाता है origin/prefix/branchname। तो यह ले जाएगा prefix/branchname


मुझे लगता है कि आपका मतलब है xargs -I {} git push origin :{}, नहीं -i
जोजो

1
@jojo, AFAIK, -iइसके लिए डिफ़ॉल्ट प्रतिस्थापन का उपयोग करता है, {}लेकिन -Iआप अपने स्वयं के घोषणा कर सकते हैं। ... बस मैनुअल में मिला:-i ... the same as -I{}
किर्बी

10

नीवेक का समाधान सुरुचिपूर्ण है, लेकिन यह बेहतर हो सकता है: प्रति शाखा के रूप में प्रस्तावित कॉल 'गिट पुश' के रूप में समाधान, जिसका अर्थ है कि प्रति शाखा एक अतिरिक्त नेटवर्क राउंड-ट्रिप हटा दिया जाना है। चूंकि आप वैसे भी awk का उपयोग कर रहे हैं, इसलिए इसका उपयोग ':' को उपसर्ग करने के लिए क्यों न करें और फिर xargs 'git push' को एक बार में कॉल कर सकते हैं और एक बार में सभी शाखाओं को हटा सकते हैं:

हटाए जाने वाली शाखाओं को सूचीबद्ध करने के लिए ड्राई-रन:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

अंतिम समाधान वास्तव में हटाए जाने को धक्का देता है:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin

2
यह पूरी तरह से उस स्थिति में काम करता है जब आप xargs के लिए "-I" विकल्प का उपयोग नहीं कर सकते हैं जब आपके पास कम संस्करण बैश होता है या विंडोज़ संस्करण git bash का उपयोग होता है।
zchholmes

मैं xargs: replstr may not be emptyNeevek के समाधान के साथ था , शायद git संस्करण .. git version 1.9.5लेकिन यह मेरे लिए बहुत अच्छा काम किया। आप दोनों को धन्यवाद
IamFace

8

संसाधन https://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote prune origin

धन्यवाद यह मेरे लिए काम किया। म्यू मामले में मैं कई स्थानीय शाखाओं को हटाने में सक्षम हो सकता है। धन्यवाद!
प्रशांत कबड़े

5

स्टीव और नीवेक के लिए धन्यवाद, मुझे एक समाधान मिला, जिसने मेरे लिए बहुत अच्छा काम किया, जो मुझे साझा करने लायक लगा:

स्टीव के समाधान ने मेरे लिए एक मामूली समायोजन के साथ काम किया। मेरे अवशेषों को नाम दिया गया था origin/feature/some-feature-nameइसलिए मैंने आपकी छंटनी की awk:

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}

अब यह एक अच्छा सा डिलीट फ्लो कर रहा है:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

सोच रहा था कि क्या किसी को अधिक सुरुचिपूर्ण समाधान के लिए कोई विचार था, हालांकि, यह कुछ इस तरह से उत्पादन कर सकता है (मेरी सीएलआई स्क्रिप्टिंग बहुत खराब है, इसलिए मुझे यह पता लगाने में थोड़ी देर लगेगी):

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

यह एक नेटवर्क अनुरोध के साथ एक अच्छा एकल आउटपुट में परिणाम देगा:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk

4

नीवेक को धन्यवाद। यह मेरे उद्देश्य के लिए इसे फिर से जोड़ने के बाद अच्छी तरह से काम किया:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}

मुझे फ़ोल्डर संरचना को भी ध्यान में रखना चाहिए। मेरी सुविधा-शाखाएँ मूल / सुविधा / PREFIX-FEATURENUMBER जैसी फ़ोल्डर संरचना में हैं। इसलिए मुझे $ 2 = फ़ोल्डर + $ 3 = ब्रांचनाम से अपने पैटर्न का निर्माण करना पड़ा।


4

हर कोई उपयोग कर रहा है awk, निश्चित नहीं कि क्यों। मुझे लगता है कि यह अधिक जटिल है। यहाँ मैं अपने forkरिमोट पर सभी दूरस्थ शाखाओं को हटाने के लिए उपयोग करता हूं :

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork

के grepबीच में फेंक दें xargsऔर sedयदि आपको सूची को केवल दूरस्थ शाखाओं के सबसेट तक फ़िल्टर करने की आवश्यकता है।


1
बहुत बहुत धन्यवाद। यह वास्तव में सभी समाधानों के बीच मेरे लिए काम करता था .. grep पूरी शाखा को दूरस्थ नाम के साथ-साथ पसंद कर रहा था origin/blaprefix_anotherbla। लेकिन sedइसे अच्छी तरह से संभाला। इस दृष्टिकोण का एक और लाभ यह है कि मैं बिटबकैट का उपयोग करता हूं और मुझे मैन्युअल रूप से प्रत्येक शाखा हटाने के लिए प्रमाणीकरण पासवर्ड दर्ज करने की आवश्यकता नहीं है। यह एक ही बैच में सभी शाखाओं को हटाता है।
मधुर भैया

सभी git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
ग्रीनकीपर

4

मुझे एहसास है कि यह git कमांड के लिए है, लेकिन यदि आप समान या समान परिणाम करने के लिए एक वैकल्पिक समाधान की तलाश कर रहे हैं:

आप इसे यहां से कर सकते हैं (Git Remove Remote Branches):

फिर इच्छित शाखाओं का चयन करें:

सुनिश्चित करें कि आपके पास दूरस्थ शाखाओं को हटाने की अनुमति है।


यह एक शीर्ष उत्तर होना चाहिए, यह प्लेटफ़ॉर्म स्वतंत्र है।
कर्मिंगटन

सॉफ्टवेयर क्या है और क्या यह लिनक्स के लिए उपलब्ध है?
abhisekp

1

Github में शाखाओं को जल्दी हटाने के लिए एक अच्छा UI और तंत्र है, यदि आप यूआई का उपयोग करना चाहते हैं, तो


1
हां, यह यहां प्रलेखित है , लेकिन आपको प्रत्येक व्यक्तिगत शाखा के लिए एक बार क्लिक करना होगा। यहां शीर्ष मतदान समाधान कई शाखाओं को करने का सबसे अच्छा तरीका है जिसे आप मिलान करने के लिए एक रेगेक्स लिख सकते हैं।
thewoolleyman

0

मैंने सभी मूल / रिलीज़ / r1-1 * दूरस्थ शाखाओं को हटाने का प्रयास किया, इसलिए कमांड लाइन का पालन अच्छी तरह से किया।

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git push origin :{}

0

मैं awk का उपयोग करने में सक्षम नहीं था क्योंकि हम अपनी शाखाओं के नाम के लिए एक स्लैश संरचना का उपयोग कर रहे हैं।

git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git push origin --delete {}'

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


0

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

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} echo {}

दूरस्थ शाखाएँ हटाएँ:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

केवल पूर्ण रूप से मर्ज की गई दूरस्थ शाखाओं को हटाएं:

git branch -r --merged --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

स्पष्टीकरण:

sed "s/origin\///"origin/शाखा के नाम से हटा देगा । दूर किए बिना कि मुझे मिला:remote ref does not exist


0

पिछले उत्तरों ने मुझे 2018 से सभी रिलीज़ शाखाओं को हटाने में मदद की। मैंने इसे अपनी विंडोज़ 10 कमांड प्रॉम्प्ट पर चलाया। मैंने क्लिंक लगा दिया है , इसलिए लिनक्स जैसे कमांड मेरे लिए काम करता है।

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

git branch -a | grep -o "release-.*2018" | xargs -I {} echo {}

यदि सूखा रन उन शाखाओं को दिखाता है जो दूरस्थ / मूल में नहीं हैं। ठीक करने और फिर से जाँच करने के लिए git prune कमांड के नीचे चलाएँ।

git remote prune origin

एक बार जब आप उपरोक्त परिणाम से खुश हो जाते हैं तो हटा दें:

git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {}

यदि आप देखते हैं: error: unable to delete 'release-...2018': remote ref does not exist। फिर पिछले prune कमांड को रन करें और फिर से कोशिश करें।


-4

चेतावनी: यह सभी दूरस्थ शाखाओं को हटा देगा। सावधानी से प्रयोग करें।

मुझे लगता है कि दूरस्थ शाखाओं को हटाने का मेरा तरीका सबसे अच्छा है।

git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push

चेतावनी: यह सभी दूरस्थ शाखाओं को हटा देगा। सावधानी से प्रयोग करें।


4
एक स्पष्ट ट्रोल के रूप में उतारा गया। यदि मेरे अधिकार हैं तो मैं उसे हटा दूंगा।
जेक ए। स्मिथ

आपको ट्रोलिंग कहाँ से मिली?
Dmytro Gorpynenko

2
यह सही नहीं है, आप xargs के लिए कुछ महत्वपूर्ण तर्क याद कर रहे हैं, और यह सवाल का जवाब नहीं देता है।
रॉब

@ JakeA.Smith जेक, मुझे लगता है कि आपने सोचा था कि यह कोड दूरस्थ मास्टर को हटा देगा - जो कि grep -v मास्टर के अलावा सब कुछ खोजने के रूप में ऐसा नहीं है ।
वादिम समोखिन

@ यहाँ क्या गलत है? अंतिम निष्पादित बयान git पुश की तरह smth होगा: some_branch: other_branch, जो बिल्कुल सही है।
वादिम समोखिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.