Uzak depoda sildikten sonra yerel Git dallarını silin


162

Yerel ve uzak depolarımın şubeler açısından her zaman senkronize olmasını istiyorum.

GitHub'da bir Çekme İsteği incelemesinden sonra, şubemi orada birleştirip kaldırırım (uzak). Bu bilgiyi yerel veri havuzumda nasıl alabilir ve Git'in şubemin yerel sürümünü de kaldırmasını nasıl sağlayabilirim?


Uzaktan izleme şubelerinizi, yerel şubelerinizi veya her ikisini birden silmek istiyor musunuz? Silinen uzak dalların tümünü alacak bir takma ad (bash veya git) yazabilir ve silecek yerel kopyaları da tek bir komutta bulabilirsiniz.

Belki bir şey bulmak için aşağıdaki komutları kullanmayı deneyin git ls-remoteve git show-ref.

Ayrıca, kontrol etmek isteyebilirsiniz git symbolic-refve git update-ref.

Yardımın için teşekkürler, cevabı başka bir yerde buldum. Cevabımı görün.
sf89

Yanıtlar:


180

Hızlı yol

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

Not: Açık değilseniz master, şubeyi silme potansiyeli vardır. "Daha iyi bir yol" için okumaya devam edin.

Usta olduğumuzdan emin ol

Daha fazla bilgi masteriçin bu konunun veya herhangi bir dalın kaldırılmamasını sağlayabilirsiniz grep. Bu durumda:

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

Yani eğer biz tutmak istedi master, developve stagingörneğin giderdik:

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

Bunu bir takma ad yap

Biraz uzun olduğu için .zshrcveya cihazınıza bir takma ad eklemek isteyebilirsiniz .bashrc. Benimki gbpurge(için git branches purge):

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

Sonra yeniden sizin .bashrcveya .zshrc:

. ~/.bashrc

veya

. ~/.zshrc

Komutları bir takma ada koyabilir ve tek bir komut haline getirebilirsiniz. Bununla birlikte, bir tesisat komutu değilbranch bir porselen olduğundan , Git'in gelecekteki sürümlerinde onu bozabilecek UI değişikliklerine dikkat edin.

1
Mükemmel! Github İş Akışı'ndan sonra yerel şubenin mastersilineceğini unutmayın.
Rubens Mariuzzo

Hayır orada kalır emin oldukça (her gün kullanıyorum ve bunu yapmak gibi görünmüyor).
sf89

4
FYI Birden fazla dalı tutmak istiyorsanız, tek bir grep kullanabilirsiniz, örneğin: grep -Ev '(\*|master|important-branch)'
Andrew Burns

4
Bunu ~/.gitconfigbunun yerine koymak istiyorsanız , aşağıdaki [alias]bölüme ekleyin : gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"(grep ifadesinde () kullanmanıza gerek yoktur).
dskrvk

82

GitHub ile aynı akışı kullanıyorum ve git branch --mergedbirleştirilen şubeleri listelediği için önceki yanıtları beni tatmin edici bulamadım , ancak her biri benim durumumda uzaktan kaldırılmadı. Bu benim için çalıştı:

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

nerede:

  • git fetch --all -p: yerel şubelerin durumunu güncelleme
  • git branch -vv: yerel şubelerin durumunu listele
  • grep ": gone]": silinmiş olanları filtrele
  • awk '{ print $1 }': isimlerini çıkar
  • xargs -n 1 git branch -d: ismi delete komutuna iletir

Not: İsterseniz, silmeyi zorlayan -d yerine -D kullanabilirsiniz.

Örneğin:

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

Referans:

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


3
Bunu her zaman efendiye karşı yapacağımdan emin olma özgürlüğünü aldım, bu nedenle: 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 Harika senaryo ve açıklama, bunun için teşekkürler :)
Miguelgraz

branch -vvŞubeden son teslim mesajını gösteren not . Eğer o mesajda “gitmiş grep goneolsaydın” da o dalı vururdu. Yani, grep ": gone]"muhtemelen kullanımı biraz daha güvenlidir.
chawkinsuf

1
Bu sorunun asıl cevabı bu. Teşekkür ederim.
Andrei Gladkyi

1
Daha da iyisi:awk '$3 $4 ~ /:gone]$/ { print $1 }'
Jakub Bochenski

3
Bunun -Dyerine ihtiyaç duymanın yanı sıra -dmükemmel cevap!
Cas

72

Deneyin:

git pull - prune

karşılık gelen uzak dalı silinirse, yerel dalınızı siler.

Güncellenmiş:

Yukarıdaki ifade doğru değil.

Aslında, koşma git pull --pruneolacak sadece uzaktan izleme dalları KALDIR böyle gibi

uzaktan kumanda / köken / fff
uzaktan kumanda / köken / dev
uzaktan kumanda / kökenli / ana

Ardından, git branch -rmakinenizde kalan uzaktan izleme dallarını kontrol etmek için koşabilirsiniz . Sol dalların:

köken / dev
köken / ana

yani dal origin/fffsilinir.

Yani, koştuktan sonra git pull --prune, sadece çalıştırın:

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

tüm yerel şubeleri bulabilirsiniz:

  1. artık hiçbir uzak kaynak dalları yok;
  2. güvenle çıkarılabilir.

sonra <the command above> | xargs git branch -dhepsini silebilirsiniz.


42
Bu cevap pek doğru değil. --pruneBayrak sadece uzaktan izleme dalları değil, yerel şubeleri silecektir.

3
@Cupcake ile aynı fikirde, bu benim aradığım şeyi elde edemiyor.
sf89

6
Yukarı oy vermeyeceğim, ancak yerel şubeleri sildikten ve GitHub'dan sildikten sonra ihtiyacım olan şey bu oldu, ancak yine de git remote -v komutumda uzaktan kumanda olarak varlar.
Spechal

8
Siz de yapabilirsiniz git fetch --prune, bu benim seçim
şeklim

1
Yığın taşması üzerinde bulunan bir başka Git hatası ... "Uzaktan kumandadan -" ertelemek istediniz, ancak bir dal belirtmediniz. "İlegit pull --prune sonuçlandı. Bu, geçerli dalınız için varsayılan yapılandırılmış uzaktan kumanda olmadığından, komut satırında bir dal belirtmelidir. "
jww

23

Bu, ana ve geliştirme dallarını kabul edilen çözümle silmekten kaçınmak için çalışmalıdır :

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

16

Powershell kullanan kişiler için bu, yukarıdaki cevaba eşdeğerdir :

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. Olarak işaretlenen tüm dalları filtrele Gitmiş
  2. git branch -DBulunan şubelerin her birini arayın

6

Bunların hiçbiri benim için çalışmıyor. Diğer cevabımı burada görebilirsiniz: https://stackoverflow.com/a/34969726/550454

Ama esasen, şimdi bu benim var ~/.gitconfig:

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

5

Çok basit bir çözüm: yerel deponuzu kaldırın ve uzak olanı yeniden klonlayın. Çok şık görünmeyebilir, ancak basit ve adam sayfalarını okumadan tam olarak ne yaptığınızı anlayacaksınız :-).


1
Neden bu kadar çok aşağı oy? Açıkçası verimli değil, özellikle daha büyük depolarda, ancak OP'nin sorduğu şeyleri yapıyor. Bunu yapmamak için başka bir neden var mı?
3ocene

6
Çünkü tüm yerel şubelerini, depolarını, baskısız taahhütlerini kaybedeceksin ... Dinamitle balık avlamak gibi.
sevenseacat

1
Aynı şey, üzerinde çalıştığınız dizüstü bilgisayar bir şekilde bozulduğunda, kaybolduğunda veya çalındığında da olur, bu yüzden hiçbir şeyi yerel olarak önemli tutmama eğilimindeyim. Sadece küçük dallar için bile bir dal oluşturmak ve onu itmek ve artık yararlı olmadığında onu silmek daha iyi görünüyor.

1

Bu tek astarı, karşılık gelen uzak dalı olmayan tüm yerel dalları listelemek için yazdım:

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

Bunu yaptıktan sonra, şu yerel şubeleri silmek kolaydır 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

bu da beni listeliyor master, beklendiği gibi çalışmıyor; dikkatli olun
Enrico

1

Bunu sadece birleştirilmiş yerel şubeleri kaldırmak için yapıyorum:

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

ve mevcut olmayan parçaları da kaldırmak istiyorsanız:

git pull --prune

1

Şubenizi yeni master'a itmeniz ve birleştirmeniz durumunda, git bash ile aşağıdakileri yapın:

git branch -d branch_name_to_delete

Şu anda bu daldaysanız, sizi ustalığa geri götürecektir. Bu noktada

git pull

-2

Oylanan cevap ustayı silme potansiyeline sahiptir. Aşağıdaki pratik örneği dikkate alın.

Hemen birleştirilen hemen_README ve hemen_BASEBOX olmak üzere iki özellik dalım vardı ve daha sonra geliştirmeler master ile birleştirildi. Özellik dalları hemen_README ve hemen_BASEBOX uzaktan silindi, ancak yine de yerel olarak gösteriliyordu. Ayrıca yerel olarak usta değilim, ama geliştirmek.

Bu durumda

    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)

Yukarıdaki kısmi komutu çalıştırırsam

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

Sonunda silinecek olan master'ı da gösterdiğine dikkat edin.

Her halükarda yapabildim. Oturum günlüğümü bunu nasıl başardığımla paylaşıyorum.

    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

Ben sadece budama ve sonra budama olacağını kontrol ettim. Aşağıdaki şube komutuna bakarak uzaktan kumandalarla ilgileniyoruz

    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)

Şimdi devam edin ve yerel şubeleri silin

    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).

İyi şimdi dalları istediğiniz gibi.

    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)

Tabii ki ustayı silme potansiyeline sahiptir. Lütfen soruyu dikkatle okuyun. Orada dediğim gibi, benim yerel şeyler temizlemek için bir yol gerekiyordu. Bu, artık uzaktan kumandada bulunmayan tüm dalları silmek anlamına gelir. Master artık orada değilse, yerel makinenizde de kaybolacaktır.
sf89
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.