Artık uzaktan kumandada bulunmayan yerel izleme dallarını budama


768

İle git remote prune originartık uzaktan kumandada olmayan yerel dalları kaldırabilirim.

Ancak bu uzak dallardan oluşturulan yerel dalları da kaldırmak istiyorum (birleştirilmemiş olup olmadıklarını kontrol etmek iyi olurdu).

Bunu nasıl yapabilirim?



1
Tek astarlı, çapraz platform, klavyenizde uyuyan kedi gibi görünmüyor: npx git-removed-branches(kuru çalışma) veya npx git-removed-branches --prune(gerçek). Zaten node.js kurulu olmalıdır. Ayrıntılar için aşağıdaki yanıtlara bakın .
Cristian Diaconescu

Yanıtlar:


891

Budamadan sonra, uzak dalların listesini ile alabilirsiniz git branch -r. Uzaktan izleme şubelerine sahip şubelerin listesi ile alınabilir git branch -vv. Yani bu iki listeyi kullanarak uzaktan kumanda listesinde olmayan uzaktan izleme dallarını bulabilirsiniz.

Bu çizgi hile yapmalıdır ( standart Bourne kabuğuyla gerektirir bashveya zsholmaz):

git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

Bu dize uzak dalların listesini alır egrepve standart girdiden geçirir . Ve uzak izleme dalı olan dalları ( git branch -vvsahip olanlar için kullanarak ve filtreleyerek) filtreler ve bu originçıktıda şube adı olacak ilk sütunu alır. Son olarak tüm şube adlarını şube sil komutuna geçirme.

-dSeçeneği kullandığından, bu komutu çalıştırdığınızda dalda birleştirilmemiş olan dalları silmez.

Ayrıca çalıştırmak gerektiğini unutmayın git fetch --prune ilk Aksi git branch -rhalde uzak dalları göreceksiniz.


12
Bu benim için mükemmel çalıştı. Her nasılsa, git fetch -pher zaman yeterli değil mi?
Stefan Hendriks

16
Maalesef bu Windows'ta Git Bash'te çalışmıyor. sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required Herhangi bir fikir?
Ludder

37
Takma ad olarak eklemek için:alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
bryant1410

125
Gelecekteki bir git sürümü için bunu yapacak herhangi bir komut var mı? Bu komut,
Bron Davies

5
git branch -DKomutun sonunda kullanmak bizim için daha iyi çalıştı, çünkü birleştirme konusunda taahhütte bulunma eğilimindeyiz, bu da The branch x is not fully mergedçalışırken hata veriyor -d.
Mateus Gondim

430

Master ile önceden birleştirilen tüm yerel şubeleri silmek istiyorsanız, aşağıdaki komutu kullanabilirsiniz:

git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

Daha fazla bilgi .


4
Mükemmel çalıştı, sanırım! Herkes bu cevabın kabul edilen cevaptan farklı bir şey yapıp yapmadığını açıklayabilir mi?
Andrew

11
Küçük iyileştirme: xargs -r git branch -dSilinecek dal yoksa hiçbir şey yapılmayacak şekilde kullanın. Not -rbayrağı her yerde mevcut olmayabilir
Jacob Wang'a

8
Grep git renkleri nedeniyle eşleşmeyebileceğinden:git branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
Mike D

5
@NickRes çok güzel sorduğunuz gibi görüyorsa, git branch --merged mastermaster ile birleştirilen dalları listeler, daha sonra orta grep kısmı master'ın kendisini hariç tutar (master'ı silmek istemiyoruz!) Ve son xargs kısmı git branch -dher birinde yürütülür (dalı sil) sonuçlar. Veya cevapta sağlanan Daha fazla bilgi bağlantısını okuyabilirsiniz;)
jackocnr

14
İyileştirme: git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d. Git v2.10.1'den çıkış, master teslim edildiğinde "* master" görüntüler. Hem yıldız işaretli hem de yıldız işaretsiz efendiden kurtulurum.
Esteban

162

Tarafından sunulan bilgilerin ortasında git help fetch, bu küçük öğe var:

 -p, --prune
        After fetching, remove any remote-tracking branches which no longer exist on the remote.

Belkide, git fetch -p de aradığınız şey nedir?

EDIT: Tamam, bu cevabı 3 yıl sonra hala tartışanlar için, bu cevabı neden sunduğum hakkında biraz daha bilgi ...

İlk olarak, OP “uzaktaki şubelerden [artık uzaktan kumandada olmayan] oluşturulan yerel şubeleri de kaldırmak istediklerini" söylüyorlar. Bu açık bir şekilde mümkün değil git. İşte bir örnek.

Diyelim ben bir merkezi sunucuda bir repo var der ama bir olarak iki ana dalda sahiptir Ave B. Yerel sistemime bu kopyayı klonlarsam, klonum origin/Ave adlı yerel referanslara (henüz gerçek dallar değil) sahip olur origin/B. Şimdi aşağıdakileri yaptığımı varsayalım:

git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>

Buradaki ilgili gerçekler, bir nedenden dolayı yerel repoumda kökeninden farklı bir adı olan bir şube oluşturmayı seçtiğim ve aynı zamanda (henüz) orijin deposunda bulunmayan bir yerel şubem var.

Şimdi gelelim ben hem kaldırmak demek Ave Buzak repo şube ve (benim yerel repo güncelleştirmek git fetchbenim yerel ref neden bazı formun), origin/Ave origin/Bkaybolmaya. Şimdi, benim yerel repo üç şubesi hala vardır A, Zve C. Bunların hiçbirinin uzak depoda karşılık gelen bir dalı yoktur. Bunlardan ikisi "uzak dallardan yaratıldı", fakat Bköken olarak adlandırılan bir dal olduğunu bilsem bile, bunu bilmem mümkün değilZ , bunun yaratıldığınıB, çünkü muhtemelen iyi bir nedenden ötürü süreçte yeniden adlandırılmıştır. Yani, gerçekten, bazı dış süreç kayıt şube kökenli meta veriler veya geçmişi bilen bir insan olmadan, üç şubeden hangisinin (eğer varsa) OP'nin kaldırmayı hedeflediğini söylemek mümkün değildir. gitSizin için otomatik olarak saklanmayan bazı harici bilgiler olmadan git fetch -p, alabileceğiniz kadar yakındır ve OP'nin sorduğu kelimelerin tam anlamıyla teşebbüsüne yönelik herhangi bir otomatik yöntem, çok fazla şubeyi silme veya OP'nin aksi takdirde alacağı bazı şeyleri kaybetme riski taşır. silinmek istiyor.

Başka bir senaryo da var, örneğin bir origin/Aşeye üç farklı yaklaşımı test etmek için üç ayrı dal oluşturup sonra origin/Agider. Şimdi üç şubem var, ki bu tamamen isim açısından eşleşemiyor, ancak bunlar oluşturuldu origin/Ave bu nedenle OP sorununun gerçek bir yorumu üçünün de kaldırılmasını gerektirecek. Bununla birlikte, bu, onları eşleştirmek için güvenilir bir yol bulabilirseniz, arzu edilmeyebilir ...


108
Bu, yerel şubeleri silmez, yalnızca şubelere uzak işaretçiler
Jaap

4
Yalnızca uzaktan kumandada bulunmayan bu yerel şubeleri siler VE onlara hiç bir ödeme yapmadınız.
Jarek Jakubowski

15
Jaap'ın belirttiği gibi soruyu daha dikkatli okumalısınız. Bu cevaba oy veren insanlar da sorunun gerçekte ne olduğunu okumalıdır.
Søren Boisen

4
Evet, aslında tam olarak yapmak istediğim buydu! @ SørenBoisen Umarım son iki yılda bu fikrinizi tekrar gözden geçirmek için zamanınız olur ... SO'ya gönderilen içerik her zaman sadece bazen gerçekten kafa karıştırıcı OP'lerin istediği ile ilgili olsaydı, çok fazla bilgiyi kaldırırdık. Lütfen insanlara resmi yönergeler dışında bu siteyi nasıl kullanabileceklerini öğretmeyi varsaymayın ve dikey ancak faydalı yanıtları açıkça engellemiyorlar.
Félix Gagnon-Grenier

6
@ FélixGagnon-Grenier İşte bu cevapla ilgili sorunum: 1) Soru çok net, OP açıkça karışık değil. 2) Bu cevap soruyu cevaplamadığını söylemez! 3) Soru, artık mevcut olmayan uzaktan izleme dallarını budamanın bir yolunu zaten belirtiyor, bu nedenle sıfır değeri katıyor.
Søren Boisen

117

Bu, uzaktan izleme dallarının budanmış olduğu yerel dalları silecektir. (Dalda olduğunuzdan emin olun master!)

git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d

Detaylar:

  • git branch -vv uzaktan kumandanın budanmış olduğu yerel dallar için "gitti" görüntüler.

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -dbirleştirilip birleştirilmediğini kontrol eder ( -Dne olursa olsun siler)

    error: The branch 'mybranch' is not fully merged.
    

15
Komutu daha kısa yapabilirsinizgit branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
chiborg

4
Sadece bunu yapmadan önce usta olmanız gerektiğini belirtmek, çünkü git branch -ddalları karşılaştırır HEAD.
Steve Bennett

Mükemmel! Baktım ve aradım. Keşke cevabını kendi başıma çözmeden önce görseydim. Beni birkaç dakika kurtaracaktı. İşte diğer cevabım: stackoverflow.com/questions/15661853/…
Karl Wilbur

1
Ben benzer bir git takma adı ile sona erdi, awk bazı nedenlerle işe yaramadı beri kesim kullanılır:prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Zitrax

3
Ah ahbap ... insanlara usta olmaları gerektiğini söylemek için cevabını güncellemen gerekiyor. Bunu farklı bir daldan yaptım. @ stevebennet2 bilgilendirici yorum için teşekkürler
GrayedFox

53

Git, getirilirken silinen uzak dallara yapılan referansları otomatik olarak kaldıracak şekilde yapılandırılabilir:

git config --global fetch.prune true

Arama yaparken git fetchveya git pullsonrasında silinen uzak dallara yapılan başvurular otomatik olarak kaldırılır.


5
bu yerel şubeleri kaldırmaz, sadece bunlara yapılan göndermeler değil mi?
Clint Eastwood

@ClintEastwood Yalnızca uzak dallara başvuruları siler . Öğesini kullanarak uzak dallara başvuruları listeleyebilirsiniz git branch -r.
wedesoft

52

Bunu sizin için yapan temiz bir NPM paketi var (ve çapraz platformda çalışması gerekir).

Şununla yükle: npm install -g git-removed-branches

Ve sonra git removed-branchessize tüm eski yerel şubeleri gösterecek ve git removed-branches --pruneonları silmek için.

Daha fazla bilgi burada.


1
Bunun gerçekten daha fazla oyu olmalı. Platformdan bağımsız olarak hayatı kolaylaştırdığınız için teşekkürler.
Şifreleme

Kullanışlı küçük uzatma. Yüklendi ve Windows 10 üzerinde iyi çalıştı. Küçük not: Birleştirilmiş olmayan dalları budama olarak kabul eder (şube -d çağrılmış olsa da --prune çalışırken hata) .. ancak, ilk başta bu şekilde belirtilmemişlerdir liste gösteriliyor.
user2864740

1
Bu benim en sevdiğim cevap. npx git-removed-branchesrüya gibi çalışır.
Drazisil

Evet! Bu daha fazla oy olmalı! yeni başlayanlar için çok basit ve sezgisel bir çözüm
geoseong

Git'in bakış açısından aracın ne yaptığına genel bir bakış vermek faydalı olacaktır.
ryanwebjackson

41

Windows Çözümü

Microsoft Windows Powershell için:

git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}

Açıklama

git checkout master ana şubeye geçer

git remote update origin --prune kuru erik uzak dalları

git branch -vvtüm dalların ayrıntılı çıktısını alır ( git başvurusu )

Select-String -Pattern ": gone]" yalnızca uzaktan kumandadan kaldırıldıkları kayıtları alır.

% { $_.toString().Split(" ")[0]} şube adını al

% {git branch -d $_} şubeyi siler


Güzel bir örnek. alternatif olarak git remote prune origin, select-string de git'in en son sürümüyle eşleşmiyor gibi görünüyor. Kullanmayı düşününConvertFrom-String -TemplateContent
Bernie White

3
Git'in en son sürümünde bazı boşluklar eklenmiş gibi görünüyor, bu nedenle Split şube adını almak için çalışmıyor. .ToString (). Trim (). Split ("") ve yapacak
Chris Hynes

İşte benimki:git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Omzig

@Omzig Bu farklı bir şekilde ne yapar? Bir açıklama yapabilir misiniz>
chris31389

@ chris31389, ben master eksik olan her şeyi almak için orada çekme var, ve ben şube --merged ve master değil değiştirdi, ben sadece - birleştirilmiş dalları silmek emin olmak istiyorum. Sadece beni daha iyi hissettiriyor;)
Omzig

27

Uzaktan izleme dalı uzaktan silinen yerel şubeleri listeleyecektir

$ git remote prune origin --dry-run

İzlenmemiş olan bu yerel şubelerden yerel referansı kaldırmak istiyorsanız

$ git remote prune origin

19
Bu soruya cevap vermiyor, OP zaten bunu biliyordu.
Ken Williams

2
Ayrıca katılıyorum, ancak "Artık uzaktan kumandada olmayan yerel izleme dallarını budama" aradığınızda, bu üst bağlantıdır ve bu cevap başlıkla eşleşir (söz konusu açıklamanın tamamını okuduysa değil), yukarı oy nedenidir :)
027

Bu, yerel şubeleri kaldırmaz. Bunu çalıştırdıktan sonra hala orada
Xin

@Xin, komutu gerçekten çalıştırmayacağından --dry-run argümanı olmadan çalıştırmayı dener, ancak neyin değişeceğini gösterir.
Torsten Ojaperv

19

@Tzacks'nin belirttiği gibi ... bunun için kullanışlı bir npm paketi var. Sadece yap:

npx git-removed-branches --prune

(Ben yorum olurdu ama yeterli itibar)


1
Muhteşem. Herhangi bir güçlük yok. Bu tam bir cevap oldu sevindim!
Dan Rayson

1
Bu en üstte olmalıdır. Windows'da da çalışır.
tomtastico

14

Windows ve Powershell kullanıyorsanız, şu anda kullanıma alınmış olan şubeyle birleştirilen tüm yerel şubeleri silmek için aşağıdakileri kullanabilirsiniz:

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

açıklama

  • Geçerli dalı ve onunla birleştirilen dalları listeler
  • Geçerli dalı filtreler
  • gitKalan her dal adı için çıktıdaki ön veya arka boşlukları temizler
  • Birleştirilmiş yerel şubeleri siler

Sadece git branch --mergedbeklediğiniz şeyi kaldıracağından emin olmak için ilk önce kendi başına koşmaya değer .

(Http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/ adresinden taşındı / otomatikleştirildi .)


10

Daha kısa ve daha güvenli tek astar:

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

Çalıştırmadan önce henüz birleştirilmemiş bir şubeye göz atmayı unutmayın. Çünkü şu anda check-in yaptığınız dalı silemezsiniz.


3
bu da 'efendinizi' kaldıracak mı?
dcsan

2
Şu anda master'a giriş yaptıysanız hayır, aksi takdirde evet
FelikZ

1
Usta atlamak için sadece grep ve tersini seçmek için boru olabilir - git branch -d $(git branch --merged | cut -c 3- | grep -v master)
mozillalives

Bu güvensiz ve gelecekte birisi bilmeden kendi ana dalını silecek
jasonseminara

1
@jasonseminara #dcsan Snippet'i güncelledim, bu yüzden ana dalı atlıyor. #mozillalives thanks
FelikZ

9

originUzak dalı silinen ( gone) uzak bir dalı izleyen tüm yerel dalları temizleyecek bir şey istedim . Hiçbir zaman uzak bir dalı izlemek için ayarlanmamış yerel şubeleri silmek istemedim (yani: yerel geliştirici şubelerim). Ayrıca, gitözel komut dosyaları yazmak yerine sadece kullanan basit bir astar veya diğer basit CLI araçlarını istedim . Biraz kullanarak grepve awkbu basit komutu yapmak için sona erdi , sonra benim bir takma ad olarak ekledi ~/.gitconfig.

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

İşte git config --global ...bunu kolayca eklemek için bir komut git prune-branches:

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

NOT: -DBayrağın git branchkullanılması çok tehlikeli olabilir. Yani, yapılandırma komutu kullandığım yukarıda -dseçeneği git branchyerine -D; Kullandığım -Dbenim gerçek config. Ben kullanıyorum -Dçünkü Git'in birleştirilmemiş dallardan şikayet ettiğini duymak istemiyorum, sadece gitmelerini istiyorum. Bu işlevi de isteyebilirsiniz. Öyleyse , bu config komutunun sonunda -Dyerine -dkullanın.


8

Uzak dalları kaldırmak için:

$git remote prune origin

Zaten birleştirilmiş yerel şubeleri kaldırmak için:

$git branch -D $(git branch --merged)

Benim için çalışıyor. Teşekkürler.
AndroidRuntimeException

2
(git branch --merged) benim için de 'master' döndürür. Ve uzaktan kumandadan silinmemiş diğer dallar.
Tom G

8
Bu, ana dalımı sildi.
Greg

5

Güvenli bir tek katmanlı gibi görünmüyor, çok fazla kenar durumu var (adının bir parçası olarak "master" olan bir şube gibi). En güvenli bu adımlar:

  1. git branch -vv | grep 'gone]' > stale_branches.txt
  2. dosyayı görüntülemek ve tutmak istediğiniz dallar için satırları kaldırmak (ana dal gibi!); herhangi bir satırın içeriğini düzenlemenize gerek yoktur
  3. awk '{print $1}' stale_branches.txt | xargs git branch -d

5

Yukarıdaki cevaplara dayanarak bu kısa tek astarı kullanıyorum:

git remote prune origin | awk 'BEGIN{FS="origin/"};/pruned/{print $2}' | xargs -r git branch -d

Ayrıca, zaten budanırsanız ve yerel sarkan dallarınız varsa, bu onları temizler:

git branch -vv | awk '/^ .*gone/{print $1}' | xargs -r git branch -d

1
Şube adları varsa Çalışmaz /onlarda
theicfire

4

hepsini bir kerede nasıl yapacağınızdan emin değilsiniz, ancak git git branch -d <branchname>SADECE tamamen birleştirilirse yerel bir dalı silecektir. Küçük harfe dikkat edin d.

git branch -D <branchname> (büyük harf D'ye dikkat edin), birleştirilen durumundan bağımsız olarak yerel bir dalı silecektir.


Windows'ta, diğer cevaplar benim için işe yaramadı. Bu cevabı basit -D anahtarıyla kullanmak (şube zaten "silinmiş olsa bile).

Tüm şubeler için aynı anda yapabilir miyiz?
Teoman shipahi

3

Bu komutu kullanabilirsiniz:

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

Git Clean: Komutun dökümü dahil, Birleştirilmiş Şubeleri Sil


Gerçekten hiçbir dalı filtrelemeniz gerekmez (eski master). "Birleştirilmiş" ise, bu yalnızca yerel kopyanızı kaldıracağınız anlamına gelir, ancak "git checkout dev" henüz yoksa uzaktan yerel bir şube oluşturur
csga5000

Ancak yerel şube listesi birleştirilse bile hala oradadır. Bu komut, uzaktan silinen bu dalları kaldırmaktır.
sendon1982

Yıldız işareti, geçerli dal anlamına gelir, farklı dalda bu komutu çalıştırdığınızda iyi
çalışmaz

2

Yukarıdaki cevaplara dayanarak bu tek satırlık çözümle geldim:

git remote prune origin; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

2

@ Wisbucky'nin cevabında bir varyant kullanarak, aşağıdakileri dosyama bir takma ad olarak ekledim ~/.gitconfig:

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

git pruneitgoodBöylece, basit birleştirme artık birleştirmeden sonra gerek yerel ve uzak dalları temizler.


2

Powershell Sürümü git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}

Bu, ana birleştirilecek olan tüm yerel şubesi kaldıracaktır master dala iken .

git checkout master değiştirmek.


1

Schleis'in varyantı benim için çalışmıyor (Ubuntu 12.04), bu yüzden (açık ve parlak :) varyantlarımı öneriyorum:

Varyant 1 (Bu seçeneği tercih ederim):

git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D 

Değişke 2:

a. Kuru işletilen:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

b. Dalları kaldır:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D

1

Windows kullanıcıları için @ wisbucky'nin cevabının bir uyarlaması aşağıdadır:

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

Ben posh-git kullanın ve ne yazık ki PS çıplak sevmiyorum for, bu yüzden PruneOrphanBranches.cmd adlı düz bir 'ol komut komut dosyası oluşturdum:

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

Listeyi görmek için parametre olmadan çağırın ve ardından tam olarak birleştirilmemiş ancak yine de silmek istediğiniz dallar için gerçek silme işlemini gerçekleştirmek için "-d" veya "-D" ile çağırın.


Bu benim için işe yaramadı, bir şekilde :veya : (boşluklu) findstrher seferinde her şeye uymasına neden oldu - neredeyse efendiyi sildim. Ancak, bir regex kullanmak iyi çalıştı:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
Josh

1

Sil basli dallara referanslar almak ve budamak için git bash'ta deneyin ve sonra kaldırilmakta olan dallari izleyen yerel dallari budain:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

Öncelikle, silinmeyecek bir şubeyi kontrol etmeyi unutmayın, böylece şubenin silinmesini engellemez.


0

Kabul edilen cevabı sağlam bir senaryoya dönüştürdüm. Git uzantıları havuzumda bulacaksınız .

$ git-prune --help
Remove old local branches that do not exist in <remote> any more.
With --test, only print which local branches would be deleted.
Usage: git-prune [-t|--test|-f|--force] <remote>

0

Bu sayfaya, "artık akış yukarı şubesi olmayan yerel olarak teslim alınmış şubeleri nasıl silebilirim" cevabını arayan bu sayfaya ulaştım

Ayrıca, yerel şubenin henüz birleştirilip birleştirilmediğini umursamadım, çünkü içine borulama git branch -dbirleştirilmemiş yerel şubeleri silmek yerine uyaracaktır.

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff


0

İşte benim çözümüm:

git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
  • -p , artık uzaktan kumandada bulunmayan uzaktan izleme referanslarını kaldırmaktır. Böylece ilk adım uzak dallara yapılan referansları kaldıracaktır.

  • -vv , yukarı akış dalıyla (varsa) ilişkinin yanı sıra, her kafa için sha1 ve kesin konu satırını göstermek içindir. 2. adım tüm yerel şubeleri alacak ve grep komutu silinen şubeleri filtreleyecektir.


-2

Master ile güncel olmayan şubeleri silin

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null

-3

Eminim git remote prune originistediğin budur.

Gibi çalıştırabilirsiniz git remote prune origin --dry-runne görmek istiyorum herhangi bir değişiklik yapmadan yapmak.


12
Bu aslında yerel şubenin kendisini kaldırmaz.
Taytay

-17

GUI mi kullanıyorsunuz? Manuel prosedür, ancak hızlı ve kolay.

$ git gui

"Şube -> Sil" i seçin. Ctrl-click (windows) ile birden çok dal seçebilir ve tümünü kaldırabilirsiniz.


Bu cevabın ne kadar olumsuz algılanması komik. GUI isterseniz Tamamen geçerli yaklaşım IMO.
serraosays
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.