Me gustaría limpiar mi repositorio local, que tiene un montón de ramas viejas: por ejemplo 3.2
, 3.2.1
, 3.2.2
, etc.
Esperaba una forma astuta de eliminar muchos de ellos a la vez. Dado que en su mayoría siguen una convención de lanzamiento de puntos, pensé que tal vez había un atajo para decir:
git branch -D 3.2.*
y mata todas las ramas 3.2.x.
Intenté ese comando y, por supuesto, no funcionó.
git branch -D $(git branch | grep 3.2*)
- Esto funcionó para mí. Elimina las ramas cuyo nombre comienza con "3.2".grep
- coincidencia de patrones en la salida (degit branch
en este caso).$()
- significa ejecutar y colocar el resultado.|
- encadenamiento-D
es una fuerza de eliminación, debe utilizar-d
en la mayoría de los casos a ser más seguro en primer lugar.Respuestas:
No con esa sintaxis. Pero puedes hacerlo así:
Básicamente, git branch eliminará múltiples sucursales para usted con una sola invocación. Lamentablemente, no completa el nombre de sucursal. Aunque, en bash, puedes hacer:
fuente
git branch -D/-d
funciona bien para mí. Es posible que desee actualizar la suya (tal vez desde el directorio más reciente de git.git contrib).git branch | ...
puedas usar$(git for-each-ref --format='%(refname:short)' refs/heads/3.*)
. Es más largo, lo sé, pero está garantizado que será un resultado adecuado, mientras quegit branch
tiene un resultado bastante bueno con cosas como*
y->
(para symrefs) que pueden confundirlo en scripts / líneas simples.grep
alias de incluir siempre la bandera--color=always
,git branch -D
lancéerror: branch 'my_branch' not found.
hasta que corrí sin la bandera de color.git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
git branch -D 3.2{,.1,.2}
para eliminar las tres ramas gnu.org/software/bash/manual/html_node/Brace-Expansion.htmlBueno, en el peor de los casos, podrías usar:
fuente
| xargs git branch -d
parte para verificar qué se va a eliminar realmente.grep
la salida degit branch
, ya que está destinado a leer, no a analizar. Podría cambiar en cualquier momento. usefor-each-ref
junto con los--format
parámetros, como se sugiere en otras respuestas, y luego combine con las sugerencias en esta respuesta.EDITAR:
Una versión más segura (sugerida por Jakub Narębski y Jefromi), ya que la salida de git branch no está destinada a ser utilizada en scripts:
... o sin xargs:
fuente
git branch
salida para las secuencias de comandos. Usogit for-each-ref
.git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
-D
es una fuerza de eliminación, debe utilizar-d
en la mayoría de los casos a ser más seguro en primer lugar.Puede usar git branch --list para enumerar las ramas elegibles, y usar git branch -D / -d para eliminar las ramas elegibles.
Un ejemplo de línea:
fuente
error: branch 'package.json' not found.
. Parece que el * se expande demasiado pronto e intenta eliminar una rama correspondiente al nombre de cada archivo y directorio.gitconfig
...git branch --list '3.2.*'
git branch -d (git branch --list '3.2.*').trim()
Recientemente, estaba buscando la solución del mismo problema, finalmente encontré una respuesta y está funcionando muy bien:
Esta solución es increíble y si desea una explicación completa de cada comando y cómo está funcionando, se proporciona aquí .
fuente
Utilizar
fuente
alias grefs='git for-each-ref --format="%(refname:short)"'
así puedo hacerlogrefs | grep 'regexpattern' | xargs git branch -D
Tal vez le resulte útil:
Si desea eliminar todas las ramas que no son, por ejemplo, 'master', 'foo' y 'bar'
grep -v 'algo' es un emparejador con inversión.
fuente
-D
opción en comparación con otra respuesta. Gracias por la respuesta aquí @Adi. Las soluciones me funcionan.Puse mis iniciales y un guión (at-) como los primeros tres caracteres del nombre de la rama por esta razón exacta:
fuente
Si no está limitado a usar el símbolo del sistema git, siempre puede ejecutar
git gui
y usar el elemento de menú Rama-> Eliminar. Seleccione todas las ramas que desea eliminar y deje que se rasgue.fuente
Solución Powershell:
Si está ejecutando Windows, puede usar PowerShell para eliminar varias ramas a la vez ...
También puede ajustar cómo debería funcionar la coincidencia de patrones con el comando Seleccionar cadena de Powershell. Echa un vistazo a los documentos de PowerShell .
fuente
Mantener "desarrollar" y eliminar todos los demás en local
fuente
Hice una pequeña función que podría ser útil en función de la respuesta proporcionada por @gawi (arriba).
Agregue eso a su
.bash_profile
y reinicie su terminal. Luego puede llamar desde la línea de comandos de esta manera:Nota
Actualmente lo tengo configurado para una eliminación suave, lo que significa que no eliminará las ramas a menos que ya se hayan fusionado. Si te gusta vivir en el borde, el cambio
-d
de-D
y va a eliminar todo con el prefijo sin tener en cuenta!fuente
Si realmente necesita limpiar todas sus ramas, intente
git branch -d $(git branch)
Eliminará todas sus sucursales locales fusionadas, excepto la que está registrando actualmente.
Es una buena manera de limpiar tu local
fuente
Puede que le guste este pequeño elemento ... Extrae la lista y solicita la confirmación de cada elemento antes de eliminar finalmente todas las selecciones ...
Use -D para forzar eliminaciones (como de costumbre).
Para facilitar la lectura, aquí está esa línea dividida línea por línea ...
aquí está el enfoque xargs ...
finalmente, me gusta tener esto en mi .bashrc
De esa manera solo puedo decir
fuente
Para las almas puras que usan PowerShell aquí, el pequeño script
git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })
fuente
funciona correctamente para mi:
eliminar todas las sucursales locales
fuente
Use el siguiente comando para eliminar todas las ramas (la rama desprotegida no se eliminará).
Editar: estoy usando un Mac Os
fuente
Si estás en Windows, puedes usar PowerShell para hacer esto:
reemplace
feature/*
con cualquier patrón que desee.fuente
Puedes usar este comando:
git branch -D $(printf "%s\n" $(git branch) | grep '3.2')
fuente
Puede usar
git gui
para eliminar varias ramas a la vez. Desde Símbolo del sistema / Bash ->git gui
-> Remoto -> Eliminar rama ... -> seleccione ramas remotas que desea eliminar -> Eliminar.fuente
Hoy limpié un gran conjunto de sucursales locales / remotas obsoletas.
A continuación se muestra cómo lo hice:
1. enumere todos los nombres de las ramas en un archivo de texto:
git branch -a >> BranchNames.txt
2. agregue las ramas que quiero eliminar al comando "git branch -D -r":
git branch -D -r origin / dirA / branch01 origin / dirB / branch02 origin / dirC / branch03 (... agregue cualquier nombre de rama)
3. ejecutar el cmd
Y este funciona mucho más rápido y confiable que " git push origin --delete ".
Puede que esta no sea la forma más inteligente como se enumera en otras respuestas, pero esta es bastante sencilla y fácil de usar.
fuente
Si ha instalado Git GUI, que es un complemento predeterminado para Windows, entonces es el más simple. Puede usar ctrl para elegir varias ramas y eliminarlas con un solo clic.
fuente
Si está utilizando Fish Shell, puede aprovechar las
string
funciones :Esto no es muy diferente de las opciones de Powershell en algunas de las otras respuestas.
fuente
Si tuviera que eliminar todas las ramas en un archivo de texto (sucursales a del.txt) (una rama por línea), podría hacer esto para eliminar todas las ramas del control remoto (origen):
xargs -a branches-to-del.txt git push --delete origin
fuente
Para eliminar varias ramas en función de un patrón especificado, haga lo siguiente:
Abra el terminal o equivalente y escriba los siguientes comandos:
Elimine todas las ramas 3.2.x, debe escribir
¡Eso es todo!
tú eres bueno para irte.
fuente
Como en Git, todas las ramas no son nada por referencias al repositorio de git, ¿por qué no eliminas las ramas que van
.git/ref
y luego, si queda algo fuera que no sea interesante en el repositorio, automáticamente se recolectará basura para que no lo hagas? Necesito molestar.fuente
git branch -D <branchName>
fuente
Puede eliminar todas las ramas eliminando todas las referencias innecesarias:
rm .git/refs/heads/3.2.*
fuente
git gc
). No hagas eso.