2011-11-22 20 views
26

En el trabajo estamos utilizando ramas temáticas que están integradas en algunas (3) ramas principales en algún momento. Ahora me gustaría eliminar todas las ramas de temas de mi remoto repositorio que se han integrado completamente en una rama principal. Si eso no es posible, recuperar una lista de sucursales locales que se han integrado también estaría bien.¿Cómo eliminar todas las sucursales de git remotas que ya se han integrado?

Respuesta

35

Editar:

Mejor respuesta del comentario de skalee:

git branch -a --merged remotes/origin/master | grep -v master | grep "remotes/origin/" | cut -d "/" -f 3- | xargs -n 1 git push --delete origin 

vieja respuesta:

git push --delete remote topicbranch 

o

git push remote :topicbranch 

Dar una lista de ramas, sería algo con git branch --merged master

+1

Gracias, 'git branch --merged' se ve bien. Lamentablemente, no funcionará correctamente con las ramas que se han vuelto a instalar durante la integración ... pero bueno, al menos * algunas de mis ramas de mierda (160) se enumeran como superseguras para eliminarlas. – ThiefMaster

+0

Las ramas reajustadas son más complicadas ... Eso podría ser posible, pero requeriría al menos el shellscript que dibujará la lista de revisiones después del punto de ramificación y luego buscará firmas de parche a lo largo de la rama principal ... Estoy no estoy al tanto de ninguna solución precocinada para esto. –

+0

Esto es fantástico, aunque logré un pequeño inconveniente. Nombro mis ramas con un '/', p. uno de mis nombres de rama podría ser 'sf/correct-typo-7'. Debido al parámetro '-f 3' en ** corte **, este nombre de rama se truncaría a' sf'. Al cambiar el parámetro a '-f 3-', se corrige este problema y se manejan las ramas con cualquier número de barras inclinadas. –

14

Puede hacerlo de una sola vez con

git branch --merged master | grep -v master | xargs -n 1 git push --delete origin 

volcado que en un script llamado 'limpia' si encuentras que estás haciendo esto a menudo.

+12

Si desea eliminar todas las sucursales remotas, no solo las que tienen sus contrapartes locales: 'git branch -a - remotes remotos/origin/master | grep -v master | grep "remotos/origen /" | cut -d "/" -f 3 | xargs -n 1 git push --delete origin'. Además, recomiendo usar 'remotes/origin/master' en lugar de' master' simple para excluir cosas que se fusionaron localmente pero que aún no se han enviado, en caso de que eventualmente olvide o decida no presionar. – skalee

+2

@skalee ¡gracias! esto funcionó para mí, excepto cuando las sucursales están en carpetas; en su lugar, use 'cut -d"/"-f 3-'. También tuve que agregar un 'grep -v develop' para detenerlo tratando de eliminar mi rama dev. – antonyh

+0

'xargs -n 1' es demasiado lento, si tiene muchas ramas use' xargs -n 20' en su lugar. – mozillazg

9

Si desea eliminar ramas remotas desde el repositorio de origen:

git branch -r --merged develop | egrep -iv '(master|develop)' | sed 's/origin\///g' | xargs -n 1 git push --delete origin 
+0

Esto también es útil para eliminar todas las ramas ascendentes después de un tenedor – ianstarz

+0

esta es la verdadera respuesta correcta :), ya que los otros no parecen eliminar las ramas incluidas las barras, que usamos (aunque mezcladas) función/mi-característica, bugfix/my-feature –

+0

Esto se ve bastante bien, excepto que es bastante importante usar origen/maestro o origen/desarrollar como el estándar por el cual se puede eliminar algo. No está bien eliminar algo del control remoto solo porque lo fusionó en su versión local de la rama principal, existe la posibilidad de que olvide transferir esa rama al control remoto, lo que puede significar eliminar las ramas no fusionadas del origen. –

1

Estos son los comandos que estoy usando para eliminar todo lo que se funden en origin/master. Básicamente, elimino todas las ramas fusionadas en master desde GitHub.

git remote update -p && 
git branch -r --merged origin/master | 
grep origin | 
grep -v master | 
cut -d"/" -f2- | 
xargs git push origin --delete 
0

Solo para usuarios de Powershell y Windows.

git branch -r --merged | findstr /v "origin/master" | %{git push origin --delete $_.Trim().Substring(7)} 
Cuestiones relacionadas