Mevcut şube dışındaki tüm yerel şubeleri silebilir miyim?


101

Çıktısında listelenen tüm dalları silmek istiyorum ...

$ git branch

... ancak mevcut şubeyi tek adımda tutmak . Mümkün mü? Öyleyse nasıl?




Yanıtlar:


67

@Pankijs cevabına dayanarak, iki git takma adı yaptım:

[alias]
    # Delete all local branches but master and the current one, only if they are fully merged with master.
    br-delete-useless = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
    }; f"
    # Delete all local branches but master and the current one.
    br-delete-useless-force = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
    }; f"

Eklenecek ~/.gitconfig


Ve @torek'in belirttiği gibi:

Küçük -dharfin "tam olarak birleştirilmemiş" bir dalı silmeyeceğini unutmayın (belgelere bakın). Kullanılması -D bu tür dalları siler , bu işlemlerin "kaybolmasına" neden olsa bile; bunu büyük bir özenle kullanın , çünkü bu, daldaki yeniden logları da siler, böylece olağan "kazara silme işleminden kurtarma" işleri de işe yaramaz.

Temel olarak, -forceönemli bir şeyi kaybetmeyeceğinizden% 300 emin değilseniz , sürümü asla kullanmayın . Çünkü sonsuza dek kayboldu .


2
silinmiş bir şubeye yapılan taahhütler bir süre daha reflog'da kalmalıdır.
CaptRespect

Gerçekten de, taahhütler reflog'da kalacaktı. Ancak şubenin kendisi değil. Denemem ama sanırım taahhütlerinizi bulursunuz ama şube durumuna geri dönün? Sanmıyorum. Cherry-pick, silinmiş bir şubedeki taahhütleri almak için kullanılabilir, ancak şubenin kendisini geri yükleyemezsiniz.
Vadorequest

1
@Vadorequest yaparak, belirli bir commit yaparak şubeyi yeniden oluşturabilirsinizgit branch branchname commitid
pqnet

@pqnet Bunun o şubenin tüm tarihini yeniden yaratacağını bilmiyordum, teşekkürler, bilmek güzel!
Vadorequest

1
@Vadorequest commit nesneleri değişmez olduğundan (ve hash olarak indekslendiğinden), her düzenleme yeni bir nesne (farklı bir hash ile) oluşturmayı gerektirir
pqnet

197
$ git branch | grep -v "master" | xargs git branch -D 

ana dal hariç tüm dalları siler (ana dalı, korumak istediğiniz dalla değiştirin, ancak sonra ana birim silinir)


32
Mevcut şubeyi saklamak istiyorsanız kullanın grep -v ^*.
Schwern

2
Birçok kaynak bana bu komut dosyasını gösteriyor, ancak çalıştırdığımda her zaman bana dalların bulunmadığını söyleyin :(
tucq88

1
bu doğru değil master-copy, örneğin
mvallebr

2
O zaman normal ifadeyi gerektiği gibi değiştirin, örneğingrep -v "^ *master$"
Brad Koch

9
Tutmak istiyorsanız iki dal kullanın grep -v "master\|my-other-branch".
Derek Soike

27

ilk (tutmak istediğiniz şubeye geçin> ex : master ):

git checkout master

ikinci ( usta olduğunuzdan emin olun )

git branch -D $(git branch)

3
çok hızlı ve kolaydır. Neden buna olumlu oy verilmedi?
princebillyGK

1
Bana verilecek en basit ve en iyi cevap bu.
Saleh Enam Shohag

4
PowerShell kullanıyorsanız git branch -D $(git branch).Trim().
NatoBoram

$(git branch)alıntı yapmamız gerekiyor mu? Bu çalışmıyor: hata: dal '$ (git' bulunamadı. Hata: dal 'dal)' bulunamadı.
saran3h

1
En iyi cevap, oylanmalı,
xelber

13

git branch -d(veya -D) birden çok şube adına izin verir, ancak en azından biraz kod yazmadan "şu anda bulunduğum dışındaki tüm yerel şubeleri" otomatik olarak sağlamak biraz zordur.

"En iyi" (resmi olarak doğru) yöntem, git for-each-refşube adlarını almak için kullanmaktır :

git for-each-ref --format '%(refname:short)' refs/heads

ama o zaman hangi dalda olduğunuzu anlamak daha da zordur ( git symbolic-ref HEADsüslü bir senaryo yazmak istiyorsanız, bunun için "resmi olarak doğru" yöntemdir).

Daha rahat bir şekilde, git branchyerel şube adlarınızı önünde iki boşluk bırakarak veya (geçerli dal için) bir yıldız işaretiyle yazdıran seçeneğini kullanabilirsiniz *. Öyleyse, *sürümü kaldırmak için bunu bir şeyden geçirin ve boşlukla ayrılmış dal adlarıyla kalırsınız, daha sonra bunlara geçebilirsiniz git branch -d:

git branch -d $(git branch | grep -v '^*')

veya:

git branch | grep -v '^*' | xargs git branch -d

Küçük harf olduğunu unutmayın -d harfin "tam olarak birleştirilmemiş" bir dalı silmeyeceğini (belgelere bakın). Kullanılması -Dbu tür dalları siler, bu işlemlerin "kaybolmasına" neden olsa bile; bunu büyük bir özenle kullanın, çünkü bu, daldaki yeniden logları da siler, böylece olağan "kazara silme işleminden kurtarma" işleri de işe yaramaz.


git branch -D $(git branch | grep -v '^*')Birleşen dalları silmek istiyorsanız, öyle olmalıdır .
Pratik Singhal

@PratikSinghal: Bu sadece Git'in "birleştirilmiş" olarak kabul ettiği dalları değil, diğer tüm dalları da siler . Bu nadiren iyi bir fikirdir. Cevabımda bu iki maddeye zaten işaret ettim.
torek

12

Tüm birleştirilmiş dalları kaldırmak için (şu anki hariç -v ‘*’):

git branch --merged | grep -v '*' | xargs git branch -D

ayrıca repo tam temizleme için böyle bir komut verdim:

alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"

buradan alınır .


1
Bu yalnızca birleştirilen dalları siler.
Pratik Singhal

10

Belirli bir dal dışındaki tüm dalları silin :

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

Develop ve master dışında tüm yerel şubeleri sil

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

6

Windows için Powershell'de şunları kullanın:

git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }

5

Geçerli şube dışındaki tüm dalları tek adımda silmek için:

git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D


3

Bu yapıyı bir keresinde Windows ortamım için yaratmıştım. Belki başkasına yardımcı olur. Yürütme sırasında, ana dal ve geçerli dal silinmez . Birleştirilmiş diğer tüm dallar ne olursa olsun silinecektir.

@echo off
cd PATH_TO_YOUR_REPO

REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%

REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    >>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
    endlocal
)

REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
    git branch -D %%a
)

REM -- remove temp-file with branch information inside
DEL %textFile%

REM -- show local branches after the cleaning
echo Local branches:
git branch

pause 
exit

2

Yerel olarak birleştirilmiş tüm şubeleri silin:

git branch -D `git branch --merged | grep -v \* | xargs`

Belirli bir dal dışındaki tüm dalları silin :

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

Develop ve master dışında tüm yerel şubeleri sil

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

2

Varsayıldığında git branch, mevcut şubenin önünde *; Powershell'i kullanarak, aşağıdaki bir satır, başlamayan tüm dalları silecektir *.

git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }

? = Nerede-Nesne

% = Foreach-Nesne


2

Bunu kullanıyorum çünkü silmek istemediğim şeyde daha seçici oluyorum. Aşağıdaki komut, master, development ve current branch hariç her dalı kaldırır.

BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES

Bu yüzden bunu benim ~/.zshrc

delete_branches() {
  BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
  echo $BRANCHES
}

alias cleanup_branches=delete_branches

1

Bu yüzden burada birçok sabit kodlanmış dal adı görüyorum ... Ve bence buradaki cevabım, sorunun "mevcut dal" kısmına daha doğru olurken, onu tek satırda tutuyor ve benim gibi yeni başlayanları basmak için okunabilir. Verilmesi gereken yere krediyi koymak için, cevap oldukça açık bir şekilde @ pankijs'in cevabına dayanıyor.

git branch | grep -v $(git branch --show-current) | xargs git branch -d

ve debian'daki .bash_aliases'imde bir satıra takma ad verdim.

alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'

(Alt komutun bazı komut satırlarında çalışması için bazı bash özelliklerinin etkinleştirilmesi gerektiğini düşünmeme rağmen)


0

IMHO, yerel şubeleri kaldırmanın en güvenli yolu:

git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d

Ayrıca, bu konuyla ilgili daha fazla bilgi bulabilirsiniz Tüm yerel git şubelerini sil


yazdırmak için gonekullanmanız gereken işaretleyici -vvederken, (ayrıntılı iki kez) -asize yardımcı olmayacaktır (o da uzak dalları listeler)
pqnet
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.