Quiero tener mis repositorios locales y remotos siempre sincronizados en términos de sucursales.
Después de una revisión de solicitud de extracción en GitHub, fusiono y elimino mi rama allí (remota). ¿Cómo podría obtener esta información en mi repositorio local y hacer que Git elimine también mi versión local de la rama?
git ls-remote
ygit show-ref
.git symbolic-ref
ygit update-ref
.Respuestas:
El camino rapido
NB: si no está encendido
master
, esto tiene el potencial de eliminar la rama. Sigue leyendo para la "mejor manera".Asegúrate de seguir siendo maestro
Puede asegurarse de que
master
, o cualquier otra rama para el caso, no se elimine porgrep
más. En ese caso irías:Entonces si quisiéramos mantener
master
,develop
ystaging
por ejemplo, iríamos:Haz de esto un alias
Como es un poco largo, es posible que desee agregar un alias a su
.zshrc
o.bashrc
. El mío se llamagbpurge
(paragit branches purge
):Luego recarga tu
.bashrc
o.zshrc
:o
fuente
branch
es un comando de porcelana y no de plomería , tenga cuidado con cualquier cambio en la interfaz de usuario en futuras versiones de Git que pueda romperlo.master
se eliminará.grep -Ev '(\*|master|important-branch)'
~/.gitconfig
lugar, agregue lo siguiente a la[alias]
sección:gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"
(no es necesario usar () en la expresión grep).Utilizo el mismo flujo con GitHub, y no encontré las respuestas anteriores que me satisfacen, ya que
git branch --merged
enumera las ramas que se fusionaron, pero no todas se eliminaron de forma remota en mi caso. Entonces, esto funcionó para mí:git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
dónde:
git fetch --all -p
: actualizar el estado de las sucursales localesgit branch -vv
: enumera el estado de las sucursales localesgrep ": gone]"
: filtra los eliminadosawk '{ print $1 }'
: extraer sus nombresxargs -n 1 git branch -d
: pasar el nombre al comando eliminarNota: si lo prefiere, puede usar -D en lugar de -d, lo que exige la eliminación.
Por ejemplo:
Referencia:
http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches
fuente
git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d
Gran guión y explicación, gracias por eso :)branch -vv
muestra el último mensaje de confirmación de la rama. Si por casualidad se hubiera "ido" en ese mensaje, tambiéngrep gone
llegaría a esa rama. Por lo tanto,grep ": gone]"
es probablemente un poco más seguro de usar.awk '$3 $4 ~ /:gone]$/ { print $1 }'
-D
lugar de-d
esto, es la respuesta perfecta!tratar:
que elimina su sucursal local, si su sucursal remota correspondiente se elimina.
Actualizado:
La declaración anterior no es tan correcta.
De hecho, correr
git pull --prune
será sólo eliminan las ramas remotas de seguimiento , tales comoLuego, puede ejecutar
git branch -r
para verificar las ramas de seguimiento remoto que quedan en su máquina. Supongamos que las ramas izquierdas son:lo que significa que
origin/fff
se elimina la rama .Entonces, después de correr
git pull --prune
, solo corre:git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)
Puede encontrar todas las sucursales locales que:
luego,
<the command above> | xargs git branch -d
puede eliminarlos todos.fuente
--prune
bandera solo eliminará las ramas de seguimiento remoto, no las ramas locales.git fetch --prune
, esa es mi forma de eleccióngit pull --prune
resultó en "Solicitó extraer del control remoto '--prune', pero no especificó una rama. Debido a que este no es el control remoto configurado por defecto para su rama actual, usted debe especificar una rama en la línea de comando ".Esto debería funcionar para evitar eliminar las ramas maestra y de desarrollo con la solución aceptada:
fuente
Para las personas que usan powershell, este es el equivalente a la respuesta anterior :
git branch -D
a cada una de las ramas encontradasfuente
Nada de esto estaba funcionando para mí. Puedes ver mi otra respuesta aquí: https://stackoverflow.com/a/34969726/550454
Pero esencialmente, ahora tengo esto en mi
~/.gitconfig
:fuente
Solución muy simple: elimine su repositorio local y clone el remoto nuevamente. Puede que no parezca muy elegante, pero es simple y comprenderá exactamente lo que está haciendo sin leer las páginas de manual :-).
fuente
He escrito esta línea para enumerar todas las ramas locales que no tienen la rama remota correspondiente:
Una vez hecho esto, eliminar estas sucursales locales es fácil con
xargs
:fuente
master
también me está enumerando , no funciona como se esperaba; ten cuidadoSolo hago eso para eliminar ramas locales fusionadas:
y en caso de que quiera eliminar también los registros inexistentes:
fuente
En el caso de que haya presionado y fusionado su rama para dominar, haga lo siguiente en git bash:
Si actualmente estás en esa rama, te empujará de regreso al dominio. En este punto, haz un tirón con
fuente
La respuesta votada tiene el potencial de eliminar master. Considere el siguiente ejemplo práctico.
Tenía dos ramas de características hemen_README y hemen_BASEBOX que se fusionaron en desarrollo, y luego desarrollo se fusionó en maestro. Las ramas de funciones hemen_README y hemen_BASEBOX se eliminaron de forma remota, pero aún se mostraban localmente. Además, no estoy en master localmente, sino en desarrollo.
En ese caso
Entonces, si ejecuto el comando parcial anterior
Tenga en cuenta que también muestra master, que eventualmente se eliminará.
En cualquier caso pude hacerlo. Estoy compartiendo mi registro de sesión con usted sobre cómo lo logré.
Acabo de comprobar qué será podado y luego lo pode. mirando el comando de rama a continuación nos hemos ocupado de los controles remotos
Ahora adelante y elimine las sucursales locales
Bien ahora las ramas están como se desea.
fuente