repositorio - git push origin master
Eliminar sucursales locales de Git después de eliminarlas en el repositorio remoto (11)
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, me fusiono y elimino mi rama allí (remota). ¿Cómo podría obtener esta información en mi repositorio local y hacer que Git también elimine mi versión local de la sucursal?
La manera rápida
git branch --merged | grep -v "/*" | xargs -n 1 git branch -d
Nota: si no master
, esto tiene el potencial de eliminar la rama. Sigue leyendo para la "mejor manera".
Asegúrate de mantener el maestro
Puede asegurarse de que el master
, o cualquier otra rama, no se elimine mediante grep
ing para obtener más información. En ese caso irías:
git branch --merged | grep -v "/*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d
Entonces, si quisiéramos mantener el master
, develop
y staging
por ejemplo, iríamos:
git branch --merged | grep -v "/*" | grep -Ev "(/*|master|develop|staging)" | xargs -n 1 git branch -d
Hacer esto un alias
Dado que es un poco largo, es posible que desee agregar un alias a su .zshrc
o .bashrc
. El mío se llama gbpurge
(para git branches purge
):
alias gbpurge=''git branch --merged | grep -Ev "(/*|master|develop|staging)" | xargs -n 1 git branch -d''
A continuación, vuelva a cargar su .bashrc
o .zshrc
:
. ~/.bashrc
o
. ~/.zshrc
En el caso de que haya empujado y fusionado su rama para dominar, haga lo siguiente en git bash:
git branch -d branch_name_to_delete
Si se encuentra actualmente en esa rama, lo empujará de nuevo a la maestría. En este punto haz un tirón con
git pull
Escribí este delineador para enumerar todas las sucursales locales que no tienen la rama remota correspondiente:
diff -u <(git branch|sed ''s/..//'') <(git branch -r|sed ''s/..origin////'')|tail -n +4|sed -n "s/^-//p" -
Una vez hecho esto, eliminar estas sucursales locales es fácil con xargs
:
diff -u <(git branch|sed ''s/..//'') <(git branch -r|sed ''s/..origin////'')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d
Esto debería funcionar para evitar eliminar las ramas maestra y de desarrollo con la solución aceptada:
git branch --merged | egrep -v "^/*|master|development" | xargs -n 1 git branch -d
La respuesta elegida tiene el potencial de eliminar maestro. Conserve el siguiente ejemplo práctico.
Tenía dos ramas de características, hemen_README y hemen_BASEBOX, que se fusionaron para desarrollar, y luego se fusionaron en master. Las ramas de características hemen_README y hemen_BASEBOX se eliminaron de forma remota, pero aún se mostraban localmente. También no estoy en maestro localmente, sino en desarrollo.
En ese caso
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
* develop 671ad6c Merged in hemen_README (pull request #1)
hemen_BASEBOX a535c0f added global exec paths to puppet manifest
hemen_README ba87489 Updated Readme with considerable details
master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
remotes/origin/hemen_README ba87489 Updated Readme with considerable details
remotes/origin/master 2f093ce Merged in develop (pull request #3)
Entonces, si ejecuto el comando parcial anterior
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "/*"
hemen_BASEBOX
hemen_README
master
Tenga en cuenta que también muestra el maestro, que eventualmente será eliminado.
En cualquier caso, pude hacerlo. Estoy compartiendo mi registro de sesión con usted sobre cómo lo logré.
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
Pruning origin
URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git
* [would prune] origin/hemen_BASEBOX
* [would prune] origin/hemen_README
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin
Pruning origin
URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git
* [pruned] origin/hemen_BASEBOX
* [pruned] origin/hemen_README
Acabo de comprobar que se podarán y luego lo podaré. mirando comando de rama a continuación hemos cuidado de controles remotos
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
* develop 671ad6c Merged in hemen_README (pull request #1)
hemen_BASEBOX a535c0f added global exec paths to puppet manifest
hemen_README ba87489 Updated Readme with considerable details
master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
remotes/origin/master 2f093ce Merged in develop (pull request #3)
Ahora adelante y elimine las sucursales locales
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX
Deleted branch hemen_BASEBOX (was a535c0f).
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README
Deleted branch hemen_README (was ba87489).
Bien ahora las ramas son como se desea.
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
* develop 671ad6c Merged in hemen_README (pull request #1)
master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
remotes/origin/master 2f093ce Merged in develop (pull request #3)
Nada de esto estaba funcionando para mí. Puedes ver mi otra respuesta aquí: https://.com/a/34969726/550454
Pero esencialmente, ahora tengo esto en mi ~/.gitconfig
:
[alias]
prune-branches = !git remote prune origin && git branch -vv | grep '': gone]'' | awk ''{print $1}'' | xargs -r git branch -d
Para las personas que usan powershell, esto es el equivalente a la respuesta above :
git branch -vv | Select-String -Pattern '': gone]'' | ForEach-Object{($_ -split "/s+")[1]} | %{ git branch -D $_ }
- Filtra todas las ramas marcadas como desaparecidas
- Llamada
git branch -D
en cada una de las ramas encontradas
Solo hago eso para eliminar las sucursales locales fusionadas:
git branch -d $(git branch --merged)
y en caso de que quiera eliminar los rastreos inexistentes también:
git pull --prune
Solución muy simple: elimine su repositorio local y clone el remoto nuevamente. Puede que no parezca muy elegante, pero es simple y comprenderás exactamente lo que estás haciendo sin leer páginas man :-).
Utilizo el mismo flujo con GitHub y no encontré las respuestas anteriores que me satisfagan, 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
: actualiza el estado de las sucursales locales -
git branch -vv
: lista el estado de las sucursales locales -
grep ": gone]"
: filtros eliminados -
awk ''{ print $1 }''
: extrae sus nombres -
xargs -n 1 git branch -d
: pasa el nombre al comando delete
Nota: si lo prefiere, puede usar -D en lugar de -d, lo que aplica la eliminación.
Por ejemplo:
someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services
someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk ''{ print $1 }'' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).
someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services
Referencia:
tratar:
git pull --prune
que borra su rama local, si se borra su rama remota correspondiente.
Actualizado:
La declaración anterior no es tan correcta.
De hecho, ejecutar git pull --prune
solo git pull --prune
las ramas de seguimiento remoto como
remotes/origin/fff remotes/origin/dev remotes/origin/master
Luego, puede ejecutar git branch -r
para verificar las ramas de seguimiento remoto que quedan en su máquina. Supongamos que las ramas de la izquierda son:
origin/dev origin/master
lo que significa que el origin/fff
la sucursal origin/fff
se elimina.
Entonces, después de ejecutar git pull --prune
, simplemente ejecuta:
git branch --merged | grep -vFf <(git branch -r | cut -d''/'' -f2-)
puedes encontrar todas las sucursales locales que:
- ya no tiene ramas remotas correspodientes;
- se puede eliminar de forma segura.
luego, <the command above> | xargs git branch -d
<the command above> | xargs git branch -d
puede eliminarlos a todos.