Quiero eliminar todas las ramas que se enumeran en la salida de ...
$ git branch
... pero manteniendo la rama actual, en un solo paso . ¿Es eso posible? ¿Si es así, cómo?
Quiero eliminar todas las ramas que se enumeran en la salida de ...
$ git branch
... pero manteniendo la rama actual, en un solo paso . ¿Es eso posible? ¿Si es así, cómo?
Respuestas:
Basado en la respuesta de @pankijs, hice dos alias de 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 añadido ~/.gitconfig
Y, como señaló @torek:
Tenga en cuenta que las minúsculas
-d
no eliminarán una rama "no fusionada completamente" (consulte la documentación). El uso-D
eliminará dichas ramas , incluso si esto hace que las confirmaciones se "pierdan"; utilícelo con mucho cuidado , ya que también borra los reflogs de la rama, por lo que las cosas habituales de "recuperación de borrado accidental" tampoco funcionan.
Básicamente, nunca uses la -force
versión si no estás 300% seguro de que no perderás nada importante. Porque está perdido para siempre .
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
eliminará todas las ramas excepto la maestra (reemplace la maestra con la rama que desea conservar, pero luego eliminará la maestra)
grep -v ^*
.
master-copy
, por ejemplo
grep -v "^ *master$"
grep -v "master\|my-other-branch"
.
primero (cambie a la rama que desea mantener> ex : master ):
git checkout master
segundo ( asegúrate de estar en maestro )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
.
git branch -d
(o -D
) permite varios nombres de sucursales, pero es un poco complicado proporcionar automáticamente "todas las sucursales locales, excepto la que tengo ahora" sin escribir al menos un poco de código.
El método "mejor" (formalmente correcto) es utilizar git for-each-ref
para obtener los nombres de las ramas:
git for-each-ref --format '%(refname:short)' refs/heads
pero luego es aún más difícil averiguar en qué rama estás ( git symbolic-ref HEAD
es el método "formalmente correcto" para esto, si quieres escribir un script elegante).
Más convenientemente, puede usar git branch
, que imprime los nombres de sus sucursales locales precedidos por dos espacios o (para la sucursal actual) por un asterisco *
. Entonces, ejecute esto a través de algo para eliminar la *
versión y quedará con nombres de rama separados por espacios, que luego puede pasar a git branch -d
:
git branch -d $(git branch | grep -v '^*')
o:
git branch | grep -v '^*' | xargs git branch -d
Tenga en cuenta que las minúsculas -d
no eliminarán una rama "no fusionada completamente" (consulte la documentación). El uso -D
eliminará dichas ramas, incluso si esto hace que las confirmaciones se "pierdan"; utilícelo con mucho cuidado, ya que también borra los reflogs de la rama, por lo que las cosas habituales de "recuperación de borrado accidental" tampoco funcionan.
git branch -D $(git branch | grep -v '^*')
, si desea eliminar las ramas que se han fusionado.
Para eliminar todas las ramas fusionadas (excepto la actual -v ‘*’
):
git branch --merged | grep -v '*' | xargs git branch -D
también hice ese comando para la limpieza completa del repositorio:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
tomado de aquí .
Elimina todas las ramas excepto una rama específica :
git branch | grep -v "branch name" | xargs git branch -D
Eliminar todas las ramas locales excepto desarrollar y master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Para Windows, en Powershell use:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Una vez creé esta construcción para mi entorno Windows. Quizás ayude a alguien más. Durante la ejecución, el maestro y la rama actual no se eliminan . Todas las demás ramas fusionadas se eliminarán independientemente.
@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
Elimine todas las ramas fusionadas localmente:
git branch -D `git branch --merged | grep -v \* | xargs`
Elimina todas las ramas excepto una rama específica :
git branch | grep -v "branch name" | xargs git branch -D
Eliminar todas las ramas locales excepto desarrollar y master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Veo un montón de nombres de rama codificados aquí ... Y creo que mi respuesta aquí es más precisa para la parte de la "rama actual" de la pregunta mientras la mantengo en una sola línea y legible para los novatos como yo. Solo para colocar el crédito donde se debe, la respuesta obviamente también se basa en la respuesta de @ pankijs.
git branch | grep -v $(git branch --show-current) | xargs git branch -d
y también tengo un alias en una línea en mi .bash_aliases en Debian.
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(Aunque creo que algunas funciones de bash deben habilitarse para que el subcomando se ejecute en algunas líneas de comando)
Utilizo esto porque puedo ser más selectivo en lo que no quiero eliminar. Este comando a continuación elimina todas las ramas excepto master, desarrollar y la rama actual.
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Así que puse esto en mi ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
En mi humilde opinión, la forma más segura de eliminar sucursales locales es:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
Además, para obtener más información relacionada con este tema, puede encontrar Eliminar todas las ramas de git locales
gone
marcador que debe usar -vv
(detallado dos veces), mientras -a
que no lo ayudará (también enumera las ramas remotas)