Git ile tek bir komutta birden çok dalı silebilir misiniz?


355

Örneğin: Ben eski kollarının bir ton vardır benim yerel depo, temizlemek istiyorum 3.2, 3.2.1, 3.2.2vb

Bir kerede birçoğunu kaldırmak için sinsi bir yol umuyordum. Çoğunlukla nokta bırakma kuralını izlediklerinden, belki de söylemek için bir kısayol olduğunu düşündüm:

git branch -D 3.2.*

ve tüm 3.2.x dallarını öldür.

Bu komutu denedim ve elbette işe yaramadı.


12
git branch -D $(git branch | grep 3.2*)- bu benim için çalıştı. Adı "3.2" ile başlayan şubeleri siler. grep- çıktıda desen eşleşmesi ( git branchbu durumda). $()- sonucu yürütmek ve yerleştirmek anlamına gelir. |- zincirleme.
Eduard

4
Bilmeyenler, yani -Dbir kuvvetin silinmesi için dikkat çekmeye değer -d, çoğu durumda önce daha güvenli olmak için kullanılmalıdır.
redfox05

Yanıtlar:


363

Bu sözdizimiyle değil. Ama bunu şu şekilde yapabilirsiniz:

git branch -D 3.2 3.2.1 3.2.2

Temel olarak, git dalı tek bir çağrı ile sizin için birden fazla dalı silecektir. Maalesef şube adı tamamlama yapmıyor. Bash'da şunları yapabilirsiniz:

git branch -D `git branch | grep -E '^3\.2\..*'`

3
Tamamlanması git branch -D/-dbenim için iyi çalışıyor. Sizinkini güncellemek isteyebilirsiniz (belki de en son git.git katkıda bulunan dizinden).
Cascabel

19
Bunun yerine git branch | ...kullanabilirsiniz $(git for-each-ref --format='%(refname:short)' refs/heads/3.*). Daha uzun, biliyorum, ama uygun çıktı olması garanti edilirken git branch, *ve / ->symrefs gibi şeylerle güzel çıktılar var, bu da komut dosyalarında / tek satırlarda sizi kirletebilir.
Cascabel

3
Belki bu konuyla ilgili tek kişiyim, ama grepher zaman bayrağı dahil etmek için takma ad verdim --color=always- renk bayrağı olmadan git branch -Dkoşana error: branch 'my_branch' not found.kadar fırlatıyordu .
eebbesen

@eebbesen Küresel olarak devre dışı bıraktınız mı? git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
Çalışırken

2
Brace genişletme ile git branch -D 3.2{,.1,.2}üç şubeyi de silmek için yazabilirsiniz gnu.org/software/bash/manual/html_node/Brace-Expansion.html
robstarbuck

147

En kötü durumda, şunları kullanabilirsiniz:

git branch | grep '3\.2' | xargs git branch -d

22
Bu, şube adları için standartlaştırılmış bir önek notasyonu kullanan herkes için mükemmel bir yöntemdir (örneğin "fix / ..." veya "feature / ...").
Haz

4
Basit ve verimli! | xargs git branch -dAslında silinecek ne olduğunu kontrol etmek için ilk bölümü olmadan çalışan olsa tavsiye ederim .
mathielo

O değil tavsiye grepçıkışında git branchonun okuma değil ayrıştırma için bir anlamı olarak,. Her zaman değişebilir. diğer cevaplarda önerildiği gibi parametrelerle for-each-refbirlikte kullanın --formatve sonra bu cevaptaki önerilerle birleştirin.
redfox05

138
git branch  | cut -c3- | egrep "^3.2" | xargs git branch -D
  ^                ^                ^         ^ 
  |                |                |         |--- create arguments
  |                |                |              from standard input
  |                |                |
  |                |                |---your regexp 
  |                |
  |                |--- skip asterisk 
  |--- list all 
       local
       branches

DÜZENLE:

Git şubesi çıktısının komut dosyalarında kullanılması amaçlanmadığı için daha güvenli bir sürüm (Jakub Narębski ve Jefromi tarafından önerilir):

git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D

... veya xargs-free:

git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*`

14
git branchKomut dosyası oluşturmak için çıktı kullanmayın . Kullanın git for-each-ref.
Jakub Narębski

1
@ git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
Simgesiyle

Yazım hatası var. "/3.2*" değil "/3.2/*" olmalıdır. Ayrıca, yapıştırılan diğer yanıtları kendinize kopyaladığınız anlaşılıyor.
Max MacLeod

Burada yazım hatası yok. Adam sayfasından:If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
gawi

1
Bilmeyenler, yani -Dbir kuvvetin silinmesi için dikkat çekmeye değer -d, çoğu durumda önce daha güvenli olmak için kullanılmalıdır.
redfox05

115

Uygun dalları listelemek için git branch --list öğesini, uygun dalları kaldırmak için git -D / -d dalını kullanabilirsiniz.

Bir astar örneği:

git branch -d `git branch --list '3.2.*'`

Bunu denediğimde, bir sürü hata mesajı alıyorum error: branch 'package.json' not found.. * Çok erken genişletilmiş gibi görünüyor ve her dosya ve dizinin adına karşılık gelen bir dalı silmeye çalışıyor.
Antimon

Bu iyi çalışıyor! Bununla birlikte bir takma ad olarak kullanmakta sorun yaşıyorum gitconfig...
whomaniac

6
Bu cevabın listede daha yüksek olması gerekiyor, Süper temiz, çalışıyor, grep yok
jemiloii

1
Sadece bunu vererek ilk test etmek kolay güzelgit branch --list '3.2.*'
Will

3
Pencerelerdegit branch -d (git branch --list '3.2.*').trim()
Mattias Josefsson

38

Son zamanlarda, aynı sorunun çözümünü arıyordum, sonunda bir cevap buldum ve çok iyi çalışıyor:

  1. Terminali veya eşdeğerini açın.
  2. Git dalına yaz | silinecek dalların önizlemesi için grep "pattern".
  3. Git dalına yaz | grep "desen" | xargs git şube -D

Bu çözüm harika ve her komutun ve nasıl çalıştığının tam olarak açıklanmasını istiyorsanız, burada verilmiştir .


28

kullanım

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
   xargs git branch -D

7
küçük ipucu "| xargs git branch -D" komutunun ikinci kısmını kaldırırsanız, sadece eşleşen dalları çıkarır. Böylece, silinecek dalları önizleyebilirsiniz
Max MacLeod

1
Ayrıca bunu basitleştirmek için bir takma ad ekledim: alias grefs='git for-each-ref --format="%(refname:short)"'böylece yapabilirimgrefs | grep 'regexpattern' | xargs git branch -D
angularsen

Sevdim. Güzel ve basit!
Bhargav Ponnapalli

15

Belki bunu yararlı bulacaksınız:

Örneğin 'master', 'foo' ve 'bar' olmayan tüm dalları kaldırmak istiyorsanız

git branch -D `git branch | grep -vE 'master|foo|bar'`

grep -v 'bir şey' inversiyonlu bir eşleştiricidir.


Ben şahsen -Ddiğer cevaba göre seçenek seviyorum . Cevap için teşekkürler @Adi. Çözümler benim için çalışıyor.
AMIC MING

9

Baş harfleri ve kısa çizgi (at-) bu nedenle dal isminin ilk üç karakteri olarak koydum:

git branch -D `git branch --list 'at-*'`

Tüm cevaplar temel olarak bunu söylüyor, bu sadece en basit şey.
tfantina

7

Git komut istemini kullanmakla sınırlı değilseniz, her zaman git guiBranch-> Delete menü öğesini çalıştırabilir ve kullanabilirsiniz. Silmek istediğiniz tüm dalları seçin ve kopmasına izin verin.


bu sadece yerel şubeleri silmenizi sağlar
Stealth Rabbi

7

Powershell Çözümü:

Windows çalıştırıyorsanız, aynı anda birden çok dalı kaldırmak için PowerShell'i kullanabilirsiniz ...

git branch -D ((git branch | Select-String -Pattern '^\s*3\.2\..*') | foreach{$_.ToString().Trim()})
//this will remove all branches starting with 3.2.

git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})
// this will delete all branches that contains the word "feature-" as a substring.

Ayrıca, Powershell'in Select-String komutunu kullanarak desen eşleşmesinin nasıl çalışması gerektiğini de ayarlayabilirsiniz. Powershell belgelerine bir göz atın .


6

"Geliştir" i tutun ve diğerlerini yerel olarak silin

    git branch | grep -v "develop" | xargs git branch -D 

5

@Gawi (yukarıda) tarafından verilen cevaba dayanarak faydalı olabilecek küçük bir işlev yaptım.

removeBranchesWithPrefix() {
  git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d
}

Bunu kendinize ekleyin .bash_profileve terminalinizi yeniden başlatın. Sonra komut satırından şöyle çağrı yapabilirsiniz:

removeBranchesWithPrefix somePrefix

Not

Şu anda bir yumuşak silme için ayar yaptım, yani zaten birleştirilmedikçe dalları silmeyecek. Eğer kenar, değişim yaşamak istiyorsanız -diçin -Dve ne olursa olsun öneki ile her şeyi silecektir!


5

Tüm şubelerinizi gerçekten temizlemeniz gerekiyorsa,

git branch -d $(git branch)

Şu anda check-in yaptığınız dışındaki tüm yerel birleştirilmiş şubelerinizi silecektir.

Yerelinizi temizlemenin iyi bir yolu


Bu benim için yeterince işe yaradı. Daha sonra aynı komutu kullanarak ancak "-d" yerine büyük bir "-D" kullanarak kaldırdığım biri dışında iki dal bıraktı. Git dosyaları bulamama konusunda birkaç hata aldım ama şubeler silindi.
Lurifaxel

3

Bu küçük öğeyi beğenebilirsiniz ... Listeyi çeker ve sonunda tüm seçimleri silmeden önce her öğenin onayını ister ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done`

Silme işlemlerini zorlamak için -D'yi kullanın (her zamanki gibi).

Okunabilirlik için, işte satır satır ayrılmış ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* |
    while read -r line; do 
        read -p "remove branch: $line (y/N)?" answer </dev/tty;
        case "$answer" in y|Y) echo "$line";; 
        esac; 
    done`

İşte xargs yaklaşımı ...

git for-each-ref --format="%(refname:short)" refs/heads/\* |
while read -r line; do 
    read -p "remove branch: $line (y/N)?" answer </dev/tty;
    case "$answer" in 
        y|Y) echo "$line";; 
    esac; 
done | xargs git branch -D

Sonunda bunu .bashrc dosyamda kullanmayı seviyorum

alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done'

Bu şekilde söyleyebilirim

gitSelect | xargs git branch -D.

3

Burada PowerShell kullanan saf ruhlar için küçük komut dosyası git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })


2

benim için doğru çalışıyor:

git branch | xargs git branch -d

git branch | xargs git branch -D

tüm yerel şubeleri sil


2

Tüm dalları kaldırmak için aşağıdaki komutu kullanın (kullanıma alınmış dal silinmeyecektir).

git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d

Düzenleme: Mac Os kullanıyorum


0

Windows'tayım, bunu yapmak için powershell'i kullanabilirsiniz:

 git branch | grep 'feature/*' |% { git branch -D $_.trim() }

feature/*istediğiniz herhangi bir desenle değiştirin .


6
grep benim için tanınmayan bir cmdlet ... bu yüzden git git dalı için değiştim | burada {$ _. Trim (). StartsWith ("bug")} | % {git branch -D $ _. Trim ()} ve çalıştı!
Alex


0

Aynı git guianda birden çok dalı silmek için kullanabilirsiniz . Komut İstemi / Bash -> git gui-> Uzak -> Şubeyi sil ... -> kaldırmak istediğiniz uzak dalları seçin -> Sil.


0

Bugün çok sayıda eski yerel / uzak şubeyi temizledim.

Aşağıda nasıl yaptım:

1. tüm şube adlarını bir metin dosyasına listeleyin:

git branch -a >> BranchNames.txt

2. "git branch -D -r" komutuna silmek istediğiniz dalları ekleyin:

git branch -D -r orijin / dirA / branch01 orijin / dirB / branch02 orijin / dirC / branch03 (... her hangi şube ismini eklerse)

3. cmd'yi yürütün

Ve bu " git push origin --delete " den çok daha hızlı ve güvenilir çalışır .

Bu, diğer cevaplarda listelenen en akıllı yol olmayabilir, ancak bu oldukça basittir ve kullanımı kolaydır.


0

Windows için varsayılan bir eklenti olan Git GUI'yi yüklediyseniz, en basit olanıdır. Birden fazla dal seçmek ve tek bir tıklatmayla silmek için ctrl tuşunu kullanabilirsiniz.



0

Bir metin dosyasında (branş-del.txt) (satır başına bir dal) silinecek tüm dallara sahipseniz, uzaktan (orijinden) tüm bu dalları silmek için bunu yapabilirsiniz: xargs -a branches-to-del.txt git push --delete origin


0

Belirtilen bir desene göre birden çok dalı silmek için aşağıdakileri yapın:

Terminali veya eşdeğerini açın ve aşağıdaki komutları yazın:

git branch | grep "<pattern>" (preview of the branches based on pattern)

git branch | grep "<pattern>" | xargs git branch -D (replace the <pattern> with a regular expression to match your branch names)

Tüm 3.2.x dallarını kaldırın, yazmanız gerekir

git branch | grep "3.2" | xargs git branch -D

Bu kadar!

Senin gitmen iyidir!


-1

Git'te olduğu gibi, tüm şubeler git repo'suna atıfta bulunarak hiçbir şey değildir, neden sadece gidecek dalları silmiyorsunuz .git/refve daha sonra depoda ilginç olmayan bir şey bırakılırsa otomatik olarak çöp toplanacak, böylece rahatsız etmek gerekir.



-4

Tüm gereksiz kaldırmaları kaldırarak tüm dalları kaldırabilirsiniz:

rm .git/refs/heads/3.2.*


2
İki nedenden dolayı indirildi: 1. bir uygulama ayrıntısı kullanır (Git'in geçerli sürümlerinin dalları belirli bir dizinde dosya olarak saklaması). Bu, gelecekteki sürümlerde değişebilir ve yanıtı geçersiz kılar. 2. Depo ayrı bir dizinde bulunuyorsa çalışmaz .
axiac

Ayrıca, bunu paketlenmiş bir depoda ( git gc) çalıştırırsanız çok beklenmedik sonuçlar üretir . Bunu yapma.
Matthieu Moy
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.