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




github branch (8)

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

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


त्वरित तरीका

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

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

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

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

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

इनमें से कोई भी मेरे लिए काम नहीं कर रहा था। आप मेरा अन्य उत्तर यहां देख सकते हैं: https://.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

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


मैं git branch --merged साथ एक ही प्रवाह का उपयोग करता हूं, और मुझे पिछले git branch --merged को संतुष्ट नहीं किया गया है, क्योंकि 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 का उपयोग कर सकते हैं, जो हटाए जाने को लागू करता है।

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

[email protected]:~/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

[email protected]:~/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).

[email protected]:~/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


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

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

यदि आपने अपनी शाखा को मास्टर में धक्का दिया है और विलय कर दिया है, तो गिट बैश में निम्न कार्य करें:

git branch -d branch_name_to_delete

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

git pull

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

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

उस स्तिथि में

    [email protected]:~/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)

तो अगर मैं उपरोक्त आंशिक आदेश चलाता हूं

    [email protected]:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
        hemen_BASEBOX
        hemen_README
        master

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

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

    [email protected]:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
    Pruning origin
    URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git
     * [would prune] origin/hemen_BASEBOX
     * [would prune] origin/hemen_README
    [email protected]:~/data/projects/vagrant-webdev$ git remote prune origin 
    Pruning origin
    URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git
     * [pruned] origin/hemen_BASEBOX
     * [pruned] origin/hemen_README

मैंने अभी जांच की है कि किसको काटा जाएगा और फिर इसे छीन लिया जाएगा। नीचे शाखा कमांड को देखते हुए हमने रिमोट की देखभाल की है

    [email protected]:~/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)

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

    [email protected]:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX 
    Deleted branch hemen_BASEBOX (was a535c0f).
    [email protected]:~/data/projects/vagrant-webdev$ git branch -d hemen_README
    Deleted branch hemen_README (was ba87489).

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

    [email protected]:~/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)

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

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




repository