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


162

मैं अपने स्थानीय और दूरस्थ रिपॉजिटरी को हमेशा शाखाओं के संदर्भ में सिंक करना चाहता हूं।

GitHub पर पुल अनुरोध की समीक्षा के बाद, मैं अपनी शाखा को वहां (दूरस्थ) मर्ज और हटा देता हूं। मैं अपने स्थानीय भंडार में इस जानकारी को कैसे ला सकता हूं और शाखा के अपने स्थानीय संस्करण को निकालने के लिए Git प्राप्त कर सकता हूं?


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

शायद कुछ के साथ आने के लिए निम्न आदेशों का उपयोग करने का प्रयास करें, git ls-remoteऔर git show-ref

इसके अलावा, आप जांच कर सकते हैं git symbolic-refऔर git update-ref

आपकी मदद के लिए धन्यवाद, मैंने कहीं और जवाब ढूंढना समाप्त कर दिया। मेरी प्रतिक्रिया देखें
sf89

जवाबों:


180

त्वरित तरीका है

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

NB: यदि आप चालू नहीं हैं master, तो शाखा को हटाने की क्षमता है। "बेहतर तरीके" के लिए पढ़ते रहें।

सुनिश्चित करें कि हम मास्टर रहते हैं

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

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

इसलिए अगर हम रखना चाहते थे master, developऔर stagingउदाहरण के लिए, हम जाएंगे:

git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d

इसे एक उपनाम बनाएं

चूंकि यह थोड़ा लंबा है, आप अपने .zshrcया किसी अन्य को जोड़ना चाह सकते हैं .bashrc। मेरा कहा जाता है gbpurge(के लिए git branches purge):

alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'

फिर अपने .bashrcया लोड करें .zshrc:

. ~/.bashrc

या

. ~/.zshrc

आप कमांड को एक उपनाम में रख सकते हैं और इसे एक ही कमांड बना सकते हैं। हालांकि, चूंकि branchएक चीनी मिट्टी के बरतन है और प्लंबिंग कमांड नहीं है , इसलिए Git के भविष्य के संस्करणों में किसी भी UI परिवर्तन के लिए देखें जो इसे तोड़ सकता है।

1
उत्तम! ध्यान दें कि Github Workflow के बाद स्थानीय शाखा masterहटा दी जाएगी।
रुबेंस मरिज़ो

नहीं, बहुत यकीन है कि यह वहाँ रहता है (मैं इसे हर रोज इस्तेमाल कर रहा हूं और ऐसा लगता नहीं है)।
sf89

4
FYI करें यदि आप कई शाखाओं को रखना चाहते हैं, तो आप एक सिंगल grep का उपयोग कर सकते हैं, जैसे: grep -Ev '(\*|master|important-branch)'
एंड्रयू बर्न्स

4
यदि आप इसे अपने ~/.gitconfigस्थान पर रखना चाहते हैं , तो निम्न [alias]अनुभाग में जोड़ें : gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"(grep अभिव्यक्ति में उपयोग करने की आवश्यकता नहीं है)।
dskrvk

82

मैं GitHub के साथ एक ही प्रवाह का उपयोग करता हूं, और पिछले उत्तरों को मुझे संतुष्ट नहीं करता है, क्योंकि git branch --mergedउन शाखाओं को सूचीबद्ध किया गया है जिन्हें विलय कर दिया गया था, लेकिन उनमें से प्रत्येक को मेरे मामले में दूरस्थ रूप से हटाया नहीं गया था। तो, यह मेरे लिए काम किया:

git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d

कहाँ पे:

  • git fetch --all -p: स्थानीय शाखाओं की स्थिति का अद्यतन करें
  • git branch -vv: स्थानीय शाखाओं की स्थिति की सूची
  • grep ": gone]": फिल्टर हटाए गए
  • awk '{ print $1 }': उनके नाम निकालें
  • xargs -n 1 git branch -d: डिलीट कमांड को नाम दें

नोट: यदि आप चाहें, तो आप -d के बजाय -D का उपयोग कर सकते हैं, जो डिलीट को लागू करता है।

उदाहरण के लिए:

someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).

someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

संदर्भ:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches


3
मैंने यह सुनिश्चित करने के लिए स्वतंत्रता ली कि मैं हमेशा मास्टर के खिलाफ ऐसा करूँगा, इसलिए: git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d महान स्क्रिप्ट और स्पष्टीकरण, इसके लिए धन्यवाद :)
मिगुएलग्रैज

ध्यान दें कि branch -vvशाखा से अंतिम प्रतिबद्ध संदेश दिखाता है। यदि आप उस संदेश में "चले गए" तो grep goneउस शाखा को भी मारेंगे। तो, grep ": gone]"उपयोग करने के लिए शायद थोड़ा सुरक्षित है।
चौकिंसुफ

1
यह प्रश्न का वास्तविक उत्तर है। धन्यवाद।
आंद्रेई ग्लैडकी

1
इससे भी बेहतर:awk '$3 $4 ~ /:gone]$/ { print $1 }'
जैकब बोचेंस्की

3
इसके -Dबजाय जरूरत के अलावा -dसही जवाब है!
कैस

72

प्रयत्न:

गिट पुल --prune

जो आपकी स्थानीय शाखा को हटा देता है, यदि उसकी संबंधित दूरस्थ शाखा को हटा दिया जाता है।

अपडेट किया गया:

उपरोक्त कथन सही नहीं है।

वास्तव में, रनिंग केवल रिमोट-ट्रैकिंग शाखाओं जैसे रिमूवgit pull --prune करेगा

रिमोट / मूल / FFF
रिमोट / मूल / dev
रिमोट / मूल / मास्टर

फिर, आप git branch -rअपने मशीन पर छोड़ी गई रिमोट-ट्रैकिंग शाखाओं की जांच करने के लिए दौड़ सकते हैं । मान लीजिए कि बाईं शाखाएँ हैं:

मूल / dev
मूल / मास्टर

जिसका अर्थ है कि शाखा origin/fffहटा दी गई है।

इसलिए, दौड़ने के बाद git pull --prune, बस दौड़ें:

git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)

आप सभी स्थानीय शाखाओं का पता लगा सकते हैं जो:

  1. किसी भी अधिक दूरस्थ शाखाओं को परिवर्तित नहीं करना है;
  2. सुरक्षित रूप से हटाया जा सकता है।

फिर, <the command above> | xargs git branch -dउन सभी को हटा सकते हैं।


42
यह उत्तर बिल्कुल सही नहीं है। --pruneझंडा केवल रिमोट ट्रैकिंग शाखाओं, नहीं स्थानीय शाखाओं को नष्ट करेगा।

3
यहाँ @Cupcake से सहमत हूँ, यह वह नहीं है जो मैं यहाँ खोज रहा हूँ।
sf89

6
अपवॉट करने के लिए नहीं जा रहा है, लेकिन यह वही है जो मुझे स्थानीय शाखाओं को हटाने और फिर गिटहब से हटाने के बाद की आवश्यकता थी, लेकिन वे अभी भी मेरे गिट रिमोट -v कमांड में रिमोट के रूप में विद्यमान हैं।
21

8
आप भी कर सकते हैं git fetch --prune, यह मेरी पसंद का तरीका है
e_m0ney

1
स्टैक ओवरफ्लो पर मिली सलाह से एक और गिट त्रुटि ... git pull --pruneपरिणामस्वरूप "आपने दूरस्थ '--prune' से खींचने के लिए कहा, लेकिन एक शाखा निर्दिष्ट नहीं की। क्योंकि यह आपकी वर्तमान शाखा के लिए डिफ़ॉल्ट कॉन्फ़िगर रिमोट नहीं है, आप। कमांड लाइन पर एक शाखा निर्दिष्ट करना चाहिए। "
jww

23

यह स्वीकृत समाधान के साथ मास्टर और विकास शाखाओं को हटाने से बचने के लिए काम करना चाहिए :

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d

16

पॉवरशेल का उपयोग करने वाले लोगों के लिए, यह ऊपर दिए गए उत्तर के बराबर है :

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. उन सभी शाखाओं को फ़िल्टर करें जिन्हें चिह्नित किया गया है
  2. git branch -Dप्रत्येक पाया शाखाओं पर कॉल करें

6

इसमें से कोई भी मेरे लिए काम नहीं कर रहा था। आप मेरे अन्य उत्तर यहां देख सकते हैं: https://stackoverflow.com/a/34969726/550454

लेकिन अनिवार्य रूप से, अब मेरे पास यह है ~/.gitconfig:

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

5

बहुत सरल समाधान: अपने स्थानीय रेपो को हटा दें और रिमोट को नए सिरे से क्लोन करें। बहुत सुंदर नहीं लग सकता है, लेकिन यह सरल है और आप बिल्कुल समझ जाएंगे कि आप मैन पेज पढ़े बिना क्या कर रहे हैं :-)।


1
इतने सारे पतन क्यों? मेरा मतलब है कि स्पष्ट रूप से कुशल नहीं है, खासकर बड़े रिपोज के साथ, लेकिन यह वही करता है जो ओपी ने पूछा था। क्या ऐसा न करने का कोई और कारण है?
3ocene

6
क्योंकि आप अपनी सभी स्थानीय शाखाओं को खो देंगे, लड़खड़ाते हुए, अप्रकाशित हो जाएंगे ... यह डायनामाइट के साथ मछली पकड़ने जैसा है।
sevenseacat

1
ऐसा ही तब होता है जब आप जिस लैपटॉप पर काम कर रहे होते हैं वह किसी तरह दूषित हो जाता है, खो जाता है, या चोरी हो जाता है, इसलिए मैं स्थानीय स्तर पर कुछ भी महत्वपूर्ण नहीं रखता हूं। यह मेरे लिए बेहतर है कि मैं केवल एक शाखा बनाऊं और इसे धक्का दूं, यहां तक ​​कि छोटी सुविधाओं के लिए भी, और इसे हटाने के बाद इसे उपयोगी नहीं है।

1

मैंने सभी स्थानीय शाखाओं को सूचीबद्ध करने के लिए यह एक-लाइनर लिखा है, जिसकी संगत दूरस्थ शाखा नहीं है:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -

ऐसा होने के बाद, इन स्थानीय शाखाओं को हटाना आसान है xargs:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d

यह मुझे masterभी सूचीबद्ध कर रहा है, यह अपेक्षा के अनुरूप काम नहीं करता है; सावधान रहें
Enrico

1

मैं केवल विलीन स्थानीय शाखाओं को हटाने के लिए ऐसा करता हूं:

git branch -d $(git branch --merged)

और यदि आप भी लगातार ट्रैक हटाना चाहते हैं:

git pull --prune

1

इस घटना में कि आपने अभी-अभी अपनी शाखा को धक्का दिया है और मास्टर करने के लिए अपनी शाखा को मिला दिया है, तो निम्न कार्य करें:

git branch -d branch_name_to_delete

यदि आप वर्तमान में उस शाखा में हैं तो यह आपको मास्टर में वापस धकेल देगा। इस बिंदु पर एक पुल के साथ करते हैं

git pull

-2

वोट किए गए उत्तर में मास्टर को हटाने की क्षमता है। नीचे दिए गए व्यावहारिक उदाहरण को ध्यान में रखें।

मेरे पास दो फीचर शाखाएं hemen_README और hemen_BASEBOX थीं, जिन्हें विकास में मिला दिया गया था, और फिर विकास को मास्टर में मिला दिया गया था। फीचर शाखा hemen_README और hemen_BASEBOX को दूरस्थ रूप से हटा दिया गया था, लेकिन अभी भी स्थानीय स्तर पर दिखाई दे रहे थे। इसके अलावा, मैं स्थानीय स्तर पर मास्टर नहीं हूं, लेकिन विकास पर।

उस स्तिथि में

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                      671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX                a535c0f added global exec paths to puppet manifest
        hemen_README                 ba87489 Updated Readme with considerable details
        master                       8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop       671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
        remotes/origin/hemen_README  ba87489 Updated Readme with considerable details
        remotes/origin/master        2f093ce Merged in develop (pull request #3)

इसलिए अगर मैं उपरोक्त आंशिक कमांड चलाता हूं

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
        hemen_BASEBOX
        hemen_README
        master

ध्यान दें कि यह मास्टर को भी दिखाता है, जिसे अंततः हटा दिया जाएगा।

किसी भी मामले में मैं यह करने में सक्षम था। मैं अपना सत्र लॉग आपके साथ साझा कर रहा हूं कि मैंने इसे कैसे हासिल किया।

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [would prune] origin/hemen_BASEBOX
     * [would prune] origin/hemen_README
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin 
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [pruned] origin/hemen_BASEBOX
     * [pruned] origin/hemen_README

मैंने अभी-अभी जाँच की है कि डायन और उसके बाद चुभ जाएगी। नीचे दिए गए शाखा कमांड को देखते हुए हमने रीमोट का ध्यान रखा है

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX          a535c0f added global exec paths to puppet manifest
        hemen_README           ba87489 Updated Readme with considerable details
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

अब आगे बढ़ें और स्थानीय शाखाओं को हटा दें

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX 
    Deleted branch hemen_BASEBOX (was a535c0f).
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README
    Deleted branch hemen_README (was ba87489).

अच्छा है अब शाखाएँ वांछित हैं।

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

बेशक इसमें मास्टर को हटाने की क्षमता है। कृपया प्रश्न को ध्यान से पढ़ें। जैसा कि मैंने वहां कहा था, मुझे अपने स्थानीय चीजों को साफ करने का एक तरीका चाहिए था। इसका मतलब है कि सभी शाखाओं को हटाना जो अब रिमोट पर मौजूद नहीं हैं। यदि मास्टर अब नहीं है, तो यह आपके स्थानीय मशीन पर भी गायब हो जाएगा।
1989 में sf89
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.