Eliminar sucursales locales de Git después de eliminarlas en el repository remoto

Quiero tener mis repositorys 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 twig allí (remota). ¿Cómo podría get esta información en mi repository 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 twig. Sigue leyendo para la "mejor manera".

Asegúrate de mantener el maestro

Puede asegurarse de que el master , o cualquier otra twig, no se elimine mediante grep ing para get 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 

tratar:

 git pull --prune

que borra su twig local, si se borra su twig remota correspondiente.

Actualizado:

La statement anterior no es tan correcta.

De hecho, ejecutar git pull --prune solo git pull --prune las twigs de seguimiento remoto como

 controles remotos / origen / fff
 controles remotos / origen / dev
 controles remotos / origen / maestro

Luego, puede ejecutar git branch -r para verificar las twigs de seguimiento remoto que quedan en su máquina. Supongamos que las twigs de la izquierda son:

 origen / dev
 origen / maestro

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:

  1. ya no tiene twigs remotas correspodientes;
  2. 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.

Utilizo el mismo flujo con GitHub y no encontré las respuestas anteriores que me satisfagan, ya que git branch --merged enumera las twigs 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 : list el estado de las sucursales locales
  • grep ": gone]" : filters eliminados
  • awk '{ print $1 }' : extrae sus nombres
  • xargs -n 1 git branch -d : pasa el nombre al command 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:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches

Esto debería funcionar para evitar eliminar las twigs maestra y de desarrollo con la solución aceptada:

 git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d 

Para las personas que usan powershell, esto es el equivalente a la respuesta anterior :

 git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ } 
  1. Filtra todas las twigs marcadas como desaparecidas
  2. Llamada git branch -D en cada una de las twigs encontradas

Nada de esto estaba funcionando para mí. Puedes ver mi otra respuesta aquí: http://sofes.miximages.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 

Solución muy simple: elimine su repository 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 :-).

Escribí este delineador para enumerar todas las sucursales locales que no tienen la twig 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 

La respuesta elegida tiene el potencial de eliminar maestro. Conserve el siguiente ejemplo práctico.

Tenía dos twigs de características, hemen_README y hemen_BASEBOX, que se fusionaron para desarrollar, y luego se fusionaron en master. Las twigs 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 command parcial anterior

  hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*" hemen_BASEBOX hemen_README master 

Tenga en count que también muestra el maestro, que eventualmente será eliminado.

En cualquier caso, pude hacerlo. Estoy compartiendo mi logging de session con usted sobre cómo lo logré.

  hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run Pruning origin URL: git@bitbucket.org: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: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git * [pruned] origin/hemen_BASEBOX * [pruned] origin/hemen_README 

Acabo de comprobar que se podarán y luego lo podaré. mirando command de twig 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 twigs 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)