Adam'ın cevabını yıllardır kullanıyorum. Bununla birlikte, beklediğim gibi davranmadığı bazı durumlar olduğunu söyledi:
- "ana" kelimesini içeren şubeler dikkate alınmadı, örneğin yalnızca ana dal yerine "notmaster" veya "usta"
- "dev" kelimesini içeren dallar, yalnızca geliştirici daldan ziyade "dev-test" olarak göz ardı edildi.
- geçerli şubenin HEAD'ından ulaşılabilen dalları silme (yani, mutlaka master olması gerekmez)
- mevcut HEAD durumundan erişilebilen her dalı silme
1 & 2, regex'te sadece bir değişiklikle doğrudan anlaşılabilirdi. 3, ne istediğinizin içeriğine bağlıdır (örneğin, yalnızca ana sisteme veya mevcut şubenize karşı birleştirilmemiş dalları silin). git reflog
Eğer istemeden HEAD durumunda çalıştırırsanız, 4'ün (kurtarılabilir olmasına rağmen ) felaket olma potansiyeli vardır .
Son olarak, bunun ayrı bir (Bash | Ruby | Python) komut dosyası gerektirmeyen tek satırda olmasını istedim.
TL; DR
İsteğe bağlı -f
bayrağı kabul eden bir git takma adı "süpürme" oluşturun :
git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'
ve şununla çağır:
git sweep
veya:
git sweep -f
Uzun, ayrıntılı cevap
Benim için en kolay yoldan bazı dalları ile git repo oluşturmak ve doğru davranışı test etmek için taahhüt:
Tek bir taahhütle yeni bir git repo oluşturun
mkdir sweep-test && cd sweep-test && git init
echo "hello" > hello
git add . && git commit -am "initial commit"
Yeni şubeler oluşturun
git branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful
git branch --list
bar
develop
foo
* master
masterful
notmaster
İstenen davranış: ana, geliştirme veya akım hariç tüm birleştirilmiş şubeleri seçin
Orijinal regex "usta" ve "notmaster" dallarını özlüyor:
git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
bar
Güncellenmiş normal ifadeyle (şimdi "dev" yerine "geliştirme" yi hariç tutuyor):
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster
Şube foo'ya geçin, yeni bir taahhütte bulunun, ardından foo'ya dayalı yeni bir şube, foobar atın:
echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"
Geçerli şubem foobar ve silmek istediğim dalları listelemek için yukarıdaki komutu yeniden çalıştırırsam, "foo" dalı master ile birleştirilmemiş olsa da dahil edilir:
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
foo
masterful
notmaster
Ancak, master üzerinde aynı komutu çalıştırırsanız, şube "foo" dahil değildir:
git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster
Bunun nedeni git branch --merged
, aksi belirtilmedikçe, geçerli dalın HEAD'inin varsayılan değerlerinin olmasıdır. En azından benim iş akışı için, master için birleştirilmedikçe yerel şubeleri silmek istemiyorum, bu yüzden aşağıdaki varyantı tercih ediyorum:
git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster
Müstakil HEAD durumu
Varsayılan davranışına güvenmek, git branch --merged
ayrılmış HEAD durumunda daha da önemli sonuçlara yol açar:
git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
foo
foobar
masterful
notmaster
Bu, ben sadece "foobar" ile birlikte "foo" ile birlikte, neredeyse kesinlikle istenen sonuç değildir şube silecek olurdu. Bununla birlikte, revize edilmiş komutumuzla:
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster
Gerçek silme dahil bir satır
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d
Tüm bir git takma "süpürme" içine sarılmış:
git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'
Takma ad isteğe bağlı bir -f
bayrağı kabul eder . Varsayılan davranış, yalnızca kalıpla birleştirilen dalları silmektir, ancak -f
bayrak geçerli dalla birleştirilen dalları siler.
git sweep
Deleted branch bar (was 9a56952).
Deleted branch masterful (was 9a56952).
Deleted branch notmaster (was 9a56952).
git sweep -f
Deleted branch foo (was 2cea1ab).
git branch -D
, birleştirilmiş olsun olmasın herhangi bir dalı siler.