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ı?
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:
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}'
git branch -r | awk -F/ '/\/APR/{print $2}'listelenen tüm APR önekli şube adlarını görebiliyor musunuz?
git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
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 .
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
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 :{}
xargs -a file -LBunun yerine kullanın cat file | xargs. Daha da basit xargs -a file git push --delete origin.
Bu yinelenen bir cevap olabilir, ancak aşağıda test edildi ve benim için mükemmel bir şekilde çalıştı.
git şube-D şube-adı
git itme kaynağı - şube adını sil
git şube-D şube-adı1 şube-adı2
git itme kaynağı --delete branch-name1 branch-name2
git dalı -D $ (git dalı - liste 'özelliği / *')
git branch -D backticks $ (git branch --list 'özellik / *' backticks )
git şube -r | grep -Eo 'özellik /.*'
git şube -r | grep -Eo 'özellik /.*' | xargs -I {} git itme kaynağı: {}
Grep ile aynı:
git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}.
branch -rgösterir origin/prefix/branchname. Yani alacak prefix/branchname.
xargs -I {} git push origin :{}değil -i.
-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{}
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
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ı.
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
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
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.
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.
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.
git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
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.
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
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 :{}
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.
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
Ö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.
Uzak şubeleri silme yolumun en iyisi olduğunu düşünüyorum .
git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push
$ 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'