Quero excluir todos os ramos listados na saída de ...
$ git branch
... mas mantendo o branch atual, em uma única etapa . Isso é possível? Se sim, como?
Quero excluir todos os ramos listados na saída de ...
$ git branch
... mas mantendo o branch atual, em uma única etapa . Isso é possível? Se sim, como?
Respostas:
Com base na resposta de @pankijs, criei dois aliases git:
[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"
Para ser adicionado em ~/.gitconfig
E, como @torek apontou:
Observe que letras minúsculas
-d
não excluirão um branch "não totalmente mesclado" (consulte a documentação). Usar-D
irá deletar tais branches , mesmo que isso faça com que os commits se tornem "perdidos"; use isso com muito cuidado , pois isso exclui os reflogs do branch também, de modo que o material usual de "recuperação de exclusão acidental" também não funcione.
Basicamente, nunca use a -force
versão se não tiver 300% de certeza de que não perderá nada importante. Porque está perdido para sempre .
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
irá deletar todos os branches exceto o master (substitua o master pelo branch que você deseja manter, mas então irá deletar o master)
grep -v ^*
.
master-copy
, por exemplo
grep -v "^ *master$"
grep -v "master\|my-other-branch"
.
primeiro (mude para o branch que deseja manter> ex : master ):
git checkout master
segundo ( certifique - se de que você está no mestre )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
.
git branch -d
(ou -D
) permite vários nomes de branch, mas é um pouco complicado fornecer automaticamente "todos os branches locais, exceto aquele em que estou agora" sem escrever pelo menos um pouco de código.
O "melhor" método (formalmente correto) é usar git for-each-ref
para obter os nomes dos ramos:
git for-each-ref --format '%(refname:short)' refs/heads
mas então é ainda mais difícil descobrir em qual branch você está ( git symbolic-ref HEAD
é o método "formalmente correto" para isso, se você quiser escrever um script sofisticado).
Mais convenientemente, você pode usar o git branch
, que imprime os nomes dos seus ramos locais precedidos por dois espaços ou (para o ramo atual) por um asterisco *
. Então, execute isso por meio de algo para remover a *
versão e você ficará com nomes de branch separados por espaço, que você pode então passar para git branch -d
:
git branch -d $(git branch | grep -v '^*')
ou:
git branch | grep -v '^*' | xargs git branch -d
Observe que letras minúsculas -d
não excluirão um branch "não totalmente mesclado" (consulte a documentação). Usar -D
irá deletar tais branches, mesmo que isso faça com que os commits se tornem "perdidos"; use isso com muito cuidado, pois isso exclui os reflogs do branch também, de forma que as coisas usuais de "recuperação de exclusão acidental" também não funcionem.
git branch -D $(git branch | grep -v '^*')
, se você quiser deletar aquelas ramificações que foram mescladas.
Para remover todas as ramificações mescladas (exceto as atuais -v ‘*’
):
git branch --merged | grep -v '*' | xargs git branch -D
também fiz esse comando para limpeza completa do repo:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
tirado daqui .
Exclua todos os ramos, exceto um ramo específico :
git branch | grep -v "branch name" | xargs git branch -D
Exclua todos os branches locais, exceto Develop e Master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Para Windows, no Powershell use:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Exclua todas as ramificações mescladas localmente:
git branch -D `git branch --merged | grep -v \* | xargs`
Exclua todos os ramos, exceto um ramo específico :
git branch | grep -v "branch name" | xargs git branch -D
Exclua todos os branches locais, exceto Develop e Master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Certa vez, criei essa construção para meu ambiente Windows. Talvez ajude outra pessoa. Durante a execução, o master e o branch atual não são excluídos . Todas as outras ramificações mescladas serão excluídas independentemente.
@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
Portanto, vejo muitos nomes de branch codificados aqui ... E acho que minha resposta aqui é mais precisa para a parte "branch atual" da pergunta, mantendo-a em uma única linha e legível para iniciantes como eu. Apenas para colocar o crédito onde é devido, a resposta é obviamente também baseada na resposta de @pankijs.
git branch | grep -v $(git branch --show-current) | xargs git branch -d
e eu tenho um alias em uma linha em meu .bash_aliases no debian também.
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(Embora eu ache que alguns recursos do bash precisam ser habilitados para que o subcomando seja executado em algumas linhas de comando)
Uso isso porque consigo ser mais seletivo no que não quero excluir. O comando abaixo remove todos os ramos, exceto master, desenvolver e o ramo atual.
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Então eu coloquei isso no meu ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
IMHO, a maneira mais segura de remover filiais locais é:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
Além disso, mais informações relacionadas a este tópico você pode encontrar Delete all git branches locais
gone
marcador que você deve usar -vv
(verbose duas vezes), embora -a
não vá ajudá-lo (ele lista também branches remotos)