Problema: quiero una forma de eliminar todas las sucursales locales que tengo que no tienen control remoto. Es bastante fácil canalizar los nombres de las ramas en un git branch -D {branch_name}, pero ¿cómo obtengo esa lista en primer lugar?
Por ejemplo:
Creo una nueva rama sin control remoto:
$ git co -b no_upstream
Enumero todas mis sucursales, y solo hay una con control remoto
$ git branch -a
master
* no_upstream
remotes/origin/HEAD -> origin/master
remotes/origin/master
¿Qué comando puedo ejecutar para obtener no_upstreamuna respuesta?
Puedo correr git rev-parse --abbrev-ref --symbolic-full-name @{u}y eso mostrará que no tiene control remoto:
$ git rev-parse --abbrev-ref --symbolic-full-name @{u}
error: No upstream configured for branch 'no_upstream'
error: No upstream configured for branch 'no_upstream'
fatal: ambiguous argument '@{u}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Pero como esto es un error, no me dejará usarlo o canalizarlo a otros comandos. Tengo la intención de usar esto como un alias de script de shell git-delete-unbranchedo tal vez hacer una gema súper simple comogit-branch-delete-orphans
fuente

Respuestas:
Recientemente descubrí
git branch -vvcuál es la versión "muy detallada" delgit branchcomando.Genera las ramas junto con las ramas remotas si existen, en el siguiente formato:
Una vez que tenga esta salida bien formateada, es tan fácil como pasarla
cutyawkobtener su lista:Resultados en la siguiente salida:
La
cutparte simplemente normaliza los datos eliminando los dos primeros caracteres (incluidos*) de la salida antes de pasarlos aawk.La
awkparte imprime la primera columna si no hay corchetes en la tercera columna.Bono: crea un alias
Facilite la ejecución creando un alias en su
.gitconfigarchivo global (o donde sea):Importante: la barra invertida debe tener un escape en el alias o, de lo contrario, tendrá un archivo gitconfig no válido.
Bono: filtrado remoto
Si por alguna razón tiene varios controles remotos de seguimiento para diferentes sucursales, es bastante fácil especificar con qué control remoto desea verificar. Simplemente agregue el nombre remoto al patrón awk. En mi caso, es
originpara que pueda hacer esto:fuente
WIP:Qué es eso de todos modos ..? ¿No es eso lo que crea un comando de alijo ...?git branch -vv, incluso si existe una rama remota y coincide con mi rama local, no vería[origin/branch-name]el resultado junto con el. Tuve que hacerdiffdos listas de sucursales para averiguar qué era solo local.git branch -vv | grep -v origin/es suficiente para mígone?git branch(sin opciones) enumera solo las sucursales locales, pero no sabe si están rastreando una sucursal remota o no.Por lo general, esas ramas locales deben eliminarse una vez fusionadas
master(como se ve en este número de git-sweep ):Esto no es tan completo como quisiera, pero es un comienzo.
fuente
git branch -a --merged.Tengo un problema similar. Quiero eliminar todas las sucursales locales que estaban rastreando sucursales remotas que ahora se eliminan. Me parece que eso
git remote prune origines insuficiente para eliminar las ramas que quiero que se vayan. Una vez que se elimina el control remoto, quiero que el local también desaparezca. Esto es lo que funcionó para mí:De mi
~/.gitconfig:Aquí hay un
git config --global ...comando para agregarlo fácilmente comogit prune-branches:NOTA : Cambié
-da-Den mi configuración actual, porque no quiero escuchar a Git quejarse de las ramas no fusionadas. Es posible que también desee esta funcionalidad. Si es así, simplemente use en-Dlugar de-dal final de ese comando.Además, FWIW, su archivo de configuración global casi siempre será
~/.gitconfig.(Corrección de OS X)
Como está escrito, esto no funciona en OS X debido al uso de
xargs -r(gracias, Korny ).El
-res para evitar que sexargsejecutegit branch -dsin un nombre de rama, lo que resultará en un mensaje de error "fatal: branch name required". Si no le importa el mensaje de error, simplemente puede eliminar el-rargumentoxargsy listo.Sin embargo, si no desea ver un mensaje de error (y realmente, quién podría culparlo), entonces necesitará algo más que busque una tubería vacía. Si es posible que pueda utilizar ifne de moreutils . Insertaría
ifneantesxargs, lo que dejaráxargsde ejecutarse con datos vacíos. NOTA :ifneconsidera que cualquier cosa no está vacía, esto incluye líneas en blanco, por lo que aún puede ver ese mensaje de error. No lo he probado en OS X.Aquí está esa
git configlínea conifne:fuente
Edición tardía:
Mejor es
En GNU / cualquier cosa
Si es probable que haya más de un puñado de ramas, habría mejores formas, utilizando
comm -23en la salida degit branch|sed|sortygit config -l|sed|sort.fuente
Esto funciona para mi:
git branch -vv | grep -v origin(si su control remoto tiene otro nombre que no sea el origen, sustitúyalo).
Esto mostrará una lista de todas las ramas que no están rastreando un control remoto, que suena como lo que está buscando.
fuente
git fetch --prune.Sintetizo mi propio comando Git para obtener las
origin/***: goneramas:git remote prune origin && git branch -vvimprimirá ramas en modo detallado.cut -c 3-eliminará los primeros caracteres.grep ': gone]'imprimirá solo las ramas remotas que se hayan ido .awk '{print $1}'imprimirá el nombre de la rama.xargs -n1 -r echo git branch -dimprimirá elgit branch -dcomando para eliminar ramas (-n1 administrará un comando por vez, -r para evitar emitir un comando si no hay una rama presente).SUGERENCIA: elimine el comando "echo" para ejecutar los comandos en lugar de imprimir solo, lo dejé en el comando para verificar los comandos antes de ejecutar git.
SUGERENCIA 2: emita
git branch -Dsi y solo si está seguro de que desea eliminar las ramas no fusionadasfuente
awk, no sabía que pudieras hacer eso.Aquí hay algo que he usado en PowerShell con comentarios para explicar lo que está haciendo. En un intento por aclarar lo que está sucediendo, no he usado ningún comando abreviado de PowerShell (alias). Siéntase libre de comprimirlo al nivel deseado de críptica :)
fuente
Combinando algunas de las respuestas existentes:
P.ej:
fuente