Git'te birden çok uzak dalı sil


129

150'den fazla yerel şubesini istemeden merkez depomuza gönderen bir ekip üyem var. Neyse ki, hepsinin öneki aynı. Bu öneki kullanarak, hepsini bir kerede silecek, kullanabileceğim bir git komutu veya harika küçük bir kabuk betiği var mı?

Yanıtlar:


151

PREFIXUzak sunucuda önekli tüm dalları kaldırmak için aşağıdaki komutu kullanın .

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}

Kaldırmak istediğiniz dalların bu dallar olup olmadığını görmek için önce bir kuru çalıştırma yapmak isteyebilirsiniz:

git branch -r | awk -F/ '/\/PREFIX/{print $2}'

2
Bunu seviyorum çünkü tek astar ve ilk önce kuru bir çalışma yapabilirim. Maalesef bu mesajla hata yapıyor: $ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
Jake A. Smith

İle git branch -r | awk -F/ '/\/APR/{print $2}'listelenen tüm APR önekli şube adlarını görebiliyor musunuz?
neevek

1
Tamam, çünkü APR-04-DPHdal zaten silinmiş. Şu yanıtlanmış sorulara bir bakın: bu , bu ve ayrıca bu . Bu soruların cevapları aynı soruna yöneliktir, çözümleri kendiniz test etmek isteyebilirsiniz.
neevek

26
şube adlarınızda / varsa (git-flow veya başka bir şey kullanıyorsanız), onun yerine {$ 2 "/" $ 3}
yazdırın

4
Windows'ta msysgit kullanıyorum ve aşağıdaki komut benim için çalıştı (@ ajma'nın eğik çizgi içeren dal adları için yorumuyla bağlantılı olarak:git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
rikoe

96

Daha basit bir yaklaşımı seviyorsanız, örneğin 3 veya 4 şubeyi silin:

git push origin --delete <branch1> <branch2> <branch3>

Önemli: Yalnızca Git v1.7.0 ve üzeri sürümlerde çalışır .


6
Kullanmaya son verdimgit branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Aram Kocharyan

36

Harika ve zarif bir çözüm için Neevek'e teşekkürler !

Ancak dal adlarında eğik çizgi ile ilgili bazı sorunlar yaşıyorum (Git Flow kullanıyorum), çünkü awkalan ayırıcı /( -Fseçenek)

Yani benim çözümüm Neevek'e dayanıyor , ancak dal adlarını ile doğru şekilde ayrıştırıyor /. Bu durumda, uzaktan kumandanızın aradığını varsayıyorum origin. Aşağıdakilerle bakan adlara sahip uzak dalları silme komutu PATTERN:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}

Ve neyi sileceğinizi kontrol etmeyi unutmayın:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

FAYDALI İPUCU: Şube adlarınız ( origin/önek olmadan ) bir metin dosyasında (her satırda bir şube adı) saklanıyorsa, şunu çalıştırın:

cat your_file.txt | xargs -I {} git push origin :{}

2
xargs -a file -LBunun yerine kullanın cat file | xargs. Daha da basit xargs -a file git push --delete origin.
musiKk

15

Bu yinelenen bir cevap olabilir, ancak aşağıda test edildi ve benim için mükemmel bir şekilde çalıştı.

  1. Yerel şubeyi zorla silin

git şube-D şube-adı

  1. Uzak şubeyi sil

git itme kaynağı - şube adını sil

  1. 1'den fazla yerel şubeyi silin

git şube-D şube-adı1 şube-adı2

  1. 1'den fazla uzak dalı silin

git itme kaynağı --delete branch-name1 branch-name2

  1. Önek ile yerel şubeyi silin. Örneğin, özellik / *

git dalı -D $ (git dalı - liste 'özelliği / *')

git branch -D backticks $ (git branch --list 'özellik / *' backticks )

  1. Uzak şubeyi önek ile listeleyin.

git şube -r | grep -Eo 'özellik /.*'

  1. Önek ile uzak şubeyi sil

git şube -r | grep -Eo 'özellik /.*' | xargs -I {} git itme kaynağı: {}


2
sanırım 5. adımda ters vuruşlardan kaçmak istediniz
GPL

Ters işaretler nasıl eklenir?
Naren

1
@Naren: Sorun şu ki, işaretleme biçimlendirmesi geri işaretlerinizi bir stil komutuna dönüştürüyor. Bunları farklı bir komut ikame yöntemiyle değiştirdim (örneğin, "$ (command)", "command" ile eşdeğerdir, ancak işaretleme ile tuhaf bir şeye çevrilmemiştir.) Yapabileceğiniz diğer şey, geri işaretlerden '\' ile kaçmaktır.
Stabledog

13

Grep ile aynı: git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}.

branch -rgösterir origin/prefix/branchname. Yani alacak prefix/branchname.


Sanırım demek istedin xargs -I {} git push origin :{}değil -i.
jojo

1
@jojo, AFAIK, çünkü -ibunun için varsayılan değiştirme kullanır, {}ancak -Isizinle kendi bir tane ilan edebilirsiniz. ... kılavuzda yeni bulundu:-i ... the same as -I{}
Kirby

10

Neevek'in çözümü zariftir, ancak daha iyi olabilir: Önerilen çözüm, şube başına bir kez 'git push' çağrısı yapar, bu da silinecek şube başına ek bir ağ gidiş-dönüşü anlamına gelir. Yine de awk kullandığınız için, neden ':' önekini kullanmıyorsunuz ve sonra xargs tam olarak bir kez 'git push' çağrısı yapıp tüm dalları bir defada silebilir:

Silinecek dalları listelemek için kuru çalıştırma:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

Silinenleri gerçekten zorlamak için nihai çözüm:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin

2
Daha düşük bir bash sürümüne sahip olduğunuzda veya bir windows sürümü git bash kullandığınızda xargs için "-I" seçeneğini kullanamadığınız durumlarda mükemmel çalışır.
zchholmes

xargs: replstr may not be emptyNeevek'in çözümüyle, belki git sürümüyle bir fikrim vardı .. git version 1.9.5Ama bu benim için harika çalıştı.
İkinize

8

kaynak https://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote prune origin

Teşekkürler bu benim için çalıştı. Benim durumumda, birden fazla yerel şubeyi silebilirim. Teşekkürler!
Prashant Kabade

5

Steve ve Neevek sayesinde, benim için oldukça iyi çalışan bir çözüm buldum, paylaşmaya değer olduğunu düşündüm:

Steve'in çözümü benim için küçük bir düzeltmeyle çalıştı. Uzaktan kumandalarımın adı verildi, origin/feature/some-feature-nameben de senin awk:

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}

Şimdi güzel bir silme akışı yapıyor:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

Daha zarif bir çözüm için herhangi bir fikri olup olmadığını merak ediyor muydunuz? Bu, şöyle bir sonuç çıkarabilir (benim CLI komut dosyam oldukça zayıf, bu yüzden bunu anlamam biraz zaman alacaktı):

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

Bu, tek bir ağ isteğiyle güzel bir tek çıktıyla sonuçlanır:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk

4

Neevek'e teşekkürler. Bu, amacım için yeniden yapılandırdıktan sonra iyi çalıştı:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}

Klasör yapısını da hesaba katmam gerekiyordu. Özellik dallarım, origin / feature / PREFIX-FEATURENUMBER gibi bir klasör yapısında. Bu yüzden kalıbımı $ 2 = klasör + $ 3 = şube adı ile oluşturmak zorunda kaldım.


4

Herkes kullanıyor awk, nedenini bilmiyorum. Bunun daha karmaşık olduğunu hissediyorum. Uzaktan kumandamdaki tüm uzak dalları silmek için kullandığım şey fork:

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork

Bir atmak greparasında xargsve seduzak dalları yalnızca bir alt aşağı listeye filtre ihtiyaç olduğuna.


1
Çok teşekkürler. Bu benim için tüm çözümlerin arasında gerçekten çalıştı .. grep tam şube gibi uzak adla geri dönüyordu origin/blaprefix_anotherbla. Ama kullanmak sedonu iyi idare etti. Bu yaklaşımın bir başka avantajı da, bitbucket kullanmam ve her şube silme işlemi için manuel olarak kimlik doğrulama şifresi girmem gerekmemesidir. Bu, tek bir gruptaki tüm dalları siler.
Madhur Bhaiya

Tüm greenkeeper şubelerini silmek içingit branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
abhisekp

4

Bunun git komutu için olduğunun farkındayım, ancak benzer veya aynı sonucu yapmak için alternatif bir çözüm arıyorsanız:

Bunu buradan yapabilirsiniz (Git Uzak Dalları Kaldır):

Ardından istediğiniz şubeleri seçin:

Uzak dalları kaldırma izinlerine sahip olduğunuzdan emin olun.


Bu en iyi cevap olmalı, platformdan bağımsızdır.
karmington

Yazılım nedir ve linux için mevcut mu?
abhisekp

1

Github ayrıca dalları hızlı bir şekilde silmek için güzel bir kullanıcı arayüzüne ve mekanizmaya sahiptir, bu bir kullanıcı arayüzü kullanmayı tercih ederseniz


1
Evet, burada belgelenmiştir , ancak yine de her şube için bir kez tıklamanız gerekir. Buradaki en çok oy alan çözüm, eşleştirmek için bir normal ifade yazabileceğiniz birçok dal yapmanın en iyi yoludur.
thewoolleyman

0

Tüm origin / release / r1-1 * uzak dalları silmeye çalıştım, bu nedenle aşağıdaki komut satırı iyi çalıştı.

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git push origin :{}

0

Awk kullanamadım çünkü şubelerimizin adı için eğik çizgi yapısı kullanıyoruz.

git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git push origin --delete {}'

Bu, tüm uzak şubeleri alır, tek bir kullanıcı için yalnızca birini alır, "origin /" dizesini uzak tutar ve her birinde bir silme işlemi gerçekleştirir.


0

Kuru çalışma:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} echo {}

Uzak şubeleri silin:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

Yalnızca tam olarak birleştirilmiş uzak dalları sil:

git branch -r --merged --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

Açıklama:

sed "s/origin\///"origin/şube adından kaldırılacaktır . Bunu sıyırmadan aldım:remote ref does not exist


0

Önceki cevaplar 2018'deki tüm sürüm dallarını kaldırmama yardımcı oldu. Bunu Windows 10 komut isteminde çalıştırdım. Clink'i kurdum , bu yüzden Linux benzeri komutlar benim için çalışıyor.

Kuru Çalıştırma:

git branch -a | grep -o "release-.*2018" | xargs -I {} echo {}

Kuru çalıştırma uzak / başlangıç ​​konumunda olmayan dalları gösteriyorsa. Düzeltmek ve tekrar kontrol etmek için git prune komutunun altında çalıştırın.

git remote prune origin

Yukarıdaki sonuçtan memnun kaldığınızda silin:

git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {}

Eğer bakın: error: unable to delete 'release-...2018': remote ref does not exist. Ardından önceki prune komutunu çalıştırın ve tekrar deneyin.


-4

Uyarı: Bu, tüm uzak dalları silecektir. Dikkatle kullanın.

Uzak şubeleri silme yolumun en iyisi olduğunu düşünüyorum .

git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push

Uyarı: Bu, tüm uzak dalları silecektir. Dikkatle kullanın.


4
Bariz bir trol olarak olumsuz oy verildi. Haklarım olsaydı silerdim.
Jake A. Smith

trolü nerede buldun?
Dmytro Gorpynenko

2
bu doğru değil, xargs için bazı hayati argümanları kaçırıyorsunuz ve bu soruya cevap vermiyor.
Rob

@ JakeA.Smith Jake, sanırım bu kodun remote master'ı kaldıracağını düşündünüz - grep -v master, master dışında her şeyi bulduğu için durum böyle değil .
Vadim Samokhin

@Rob burada yanlış olan ne? Son çalıştırılan ifade, git push: some_branch: another_branch gibi olacaktır, bu kesinlikle doğru.
Vadim Samokhin
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.