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_upstream
una 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-unbranched
o tal vez hacer una gema súper simple comogit-branch-delete-orphans
fuente
Respuestas:
Recientemente descubrí
git branch -vv
cuál es la versión "muy detallada" delgit branch
comando.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
cut
yawk
obtener su lista:Resultados en la siguiente salida:
La
cut
parte simplemente normaliza los datos eliminando los dos primeros caracteres (incluidos*
) de la salida antes de pasarlos aawk
.La
awk
parte 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
.gitconfig
archivo 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
origin
para 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 hacerdiff
dos 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 origin
es 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é
-d
a-D
en 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-D
lugar de-d
al 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
-r
es para evitar que sexargs
ejecutegit branch -d
sin 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-r
argumentoxargs
y 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
ifne
antesxargs
, lo que dejaráxargs
de ejecutarse con datos vacíos. NOTA :ifne
considera 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 config
lí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 -23
en la salida degit branch|sed|sort
ygit 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/***: gone
ramas:git remote prune origin && git branch -vv
imprimirá 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 -d
imprimirá elgit branch -d
comando 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 -D
si 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