Tengo un miembro del equipo que, sin darse cuenta, empujó a más de 150 de sus sucursales locales a nuestro repositorio central. Afortunadamente, todos tienen el mismo prefijo. Usando ese prefijo, ¿hay un comando git o un pequeño script de shell que pueda usar que elimine todos esos a la vez?
128
$ 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'
git branch -r | awk -F/ '/\/APR/{print $2}'
, ¿podría ver todos los nombres de sucursales con prefijo APR enumerados?APR-04-DPH
rama ya fue eliminada. Eche un vistazo a estas preguntas respondidas: esto y esto y también esto . Las respuestas a esas preguntas abordan el mismo problema, es posible que desee probar las soluciones usted mismo.git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
Si desea un enfoque más simple, por ejemplo, elimine 3 o 4 ramas:
Importante: solo funciona en Git v1.7.0 y superior.
fuente
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
¡Gracias a Neevek por su excelente y elegante solución!
Pero tengo algunos problemas con las barras en los nombres de las ramas (estoy usando Git Flow), debido al
awk
separador de campo/
(-F
opción)Por lo tanto, mi solución se basa en Neevek , pero analiza correctamente los nombres de rama con
/
. En este caso, supongo que su control remoto llamóorigin
. Comando para eliminar ramas remotas con nombres que comienzan conPATTERN
:Y no olvide verificar lo que va a eliminar:
CONSEJO ÚTIL: Si los nombres de sus sucursales (sin
origin/
prefijo) se almacenan en un archivo de texto (un nombre de sucursal por línea), simplemente ejecute:fuente
xargs -a file -L
lugar decat file | xargs
. Aún más simplexargs -a file git push --delete origin
.Esta puede ser una respuesta duplicada, pero a continuación la probé y funcionó perfectamente.
git branch -D backticks $ (git branch --list 'feature / *' backticks )
fuente
Lo mismo con grep:
git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}
.branch -r
muestraorigin/prefix/branchname
. Entonces tomaráprefix/branchname
.fuente
xargs -I {} git push origin :{}
, no-i
.-i
que utiliza el reemplazo predeterminado para{}
pero con-I
usted puede declarar el suyo propio. ... acabo de encontrar en el manual:-i ... the same as -I{}
La solución de Neevek es elegante, pero puede ser mejor: la solución como se propone llama 'git push' una vez por rama, lo que significa que se eliminará un viaje de ida y vuelta de red adicional por rama. Dado que de todos modos está usando awk, ¿por qué no usarlo para prefijar el ':' y luego xargs puede llamar a 'git push' exactamente una vez y eliminar todas las ramas a la vez:
Ejecutar en seco para enumerar las ramas que se eliminarían:
Solución final para empujar realmente las eliminaciones:
fuente
xargs: replstr may not be empty
con la solución de Neevek, tal vez la versión git ...git version 1.9.5
Pero esto funcionó muy bien para mí. Gracias a los dosrecurso https://coderwall.com/p/eis0ba
fuente
Gracias a Steve y Neevek, encontré una solución que funcionó bastante bien para mí y pensé que valía la pena compartirla:
La solución de Steve funcionó para mí con un pequeño ajuste. Mis mandos a distancia fueron nombrados,
origin/feature/some-feature-name
así que recorté tuawk
:Ahora está haciendo un pequeño flujo de eliminación:
Sin embargo, me preguntaba si alguien tenía alguna idea para una solución más elegante, que podría generar algo como esto (mi secuencia de comandos CLI es bastante pobre, por lo que me tomaría un tiempo resolver esto):
Esto daría como resultado una salida única agradable con una solicitud de red:
fuente
Gracias a Neevek Esto funcionó bien después de reconfigurarlo para mi propósito:
También necesitaba tener en cuenta la estructura de la carpeta. Mis ramas de características están en una estructura de carpetas como origin / feature / PREFIX-FEATURENUMBER. Así que tuve que construir mi patrón desde $ 2 = carpeta + $ 3 = nombre de sucursal.
fuente
Todos están usando
awk
, no estoy seguro de por qué. Siento que eso es más complejo. Esto es lo que uso para eliminar todas las ramas remotas en mifork
control remoto:Agregue
grep
entrexargs
ysed
si necesita filtrar la lista solo a un subconjunto de ramas remotas.fuente
origin/blaprefix_anotherbla
. Pero el uso losed
manejó bien. Otra ventaja de este enfoque es que uso bitbucket y no necesito ingresar la contraseña de autenticación para cada eliminación de sucursal manualmente. Éste elimina todas las ramas en un solo lote.git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
Me doy cuenta de que esto es para el comando git, pero si está buscando una solución alternativa para hacer el mismo resultado o similar:
Puedes hacerlo desde aquí (Git Eliminar ramas remotas):
Luego seleccione las ramas que desea:
Asegúrese de tener los permisos para eliminar las ramas remotas.
fuente
Github también tiene una interfaz de usuario agradable y un mecanismo para eliminar ramas rápidamente, eso es si prefieres usar una interfaz de usuario
fuente
Traté de eliminar todas las ramas remotas de origen / lanzamiento / r1-1 *, por lo tanto, la siguiente línea de comando funcionó muy bien.
fuente
No pude usar awk porque estamos usando una estructura de barra para el nombre de nuestras sucursales.
Esto obtiene todas las ramas remotas, obtiene solo la de un solo usuario, remueve la cadena "origin /" y ejecuta una eliminación en cada una de ellas.
fuente
Funcionamiento en seco:
Eliminar ramas remotas:
Eliminar solo ramas remotas completamente fusionadas:
Explicación:
sed "s/origin\///"
se eliminaráorigin/
del nombre de la sucursal. Sin quitar eso, obtuve:remote ref does not exist
fuente
Las respuestas anteriores me ayudaron a eliminar todas las ramas de lanzamiento de 2018. Ejecuté esto en mi símbolo del sistema de Windows 10. He instalado clink , por lo que Linux como comandos funciona para mí.
Funcionamiento en seco:
Si la ejecución en seco muestra ramas que no están en remoto / origen. Ejecute debajo del comando git prune para corregir y verificar nuevamente.
Elimine una vez que esté satisfecho con el resultado anterior:
Si ves:
error: unable to delete 'release-...2018': remote ref does not exist
. Luego ejecute el comando de poda anterior e intente nuevamente.fuente
Advertencia: Esto eliminará todas las ramas remotas. Usar con precaución.
Creo que mi forma de eliminar ramas remotas es la mejor.
Advertencia: Esto eliminará todas las ramas remotas. Usar con precaución.
fuente