Purgar twigs networkingundantes de git

Aquí está el escenario: alguien tiene un repository git (en github si eso importa) que he bifurcado. En mi sucursal, he creado muchas sucursales con los cambios que ha producido el upstream. O en algunos casos aplicaba la diferencia de mi twig en lugar de tirar correctamente de la twig.

Lo que quiero encontrar es una list de todas mis sucursales que se haya fusionado por completo con la twig principal de las fonts ascendentes. De esa forma, puedo eliminar esas twigs de forma segura porque la git branch y otras herramientas muestran más de 30 twigs y parece desorderada.

Pensé que había explicado correctamente por qué esta pregunta es diferente de la relacionada: O en algunos casos aplicó la diferencia de mi twig en lugar de tirar de la twig, por ejemplo, git branch --merged no es una respuesta completa, pero bueno …

Dependiendo de la frecuencia con la que desee hacerlo, le recomendamos que lo haga de forma manual (explicado primero) o que lo guíe (se explica a continuación).

En lo que sigue, se supone que hay un control remoto "aguas arriba" apuntando al logging que bifurcó, por ejemplo:

 $ git remote -v origin git@github.com:you/repo.git (fetch) origin git@github.com:you/repo.git (push) upstream git://github.com/original/repo.git (fetch) upstream git://github.com/original/repo.git (push) 

Enumerar todas las sucursales locales fusionadas

Para get una list de las sucursales que ya se fusionaron con el maestro de nivel superior:

 $ git fetch upstream $ git branch --merged upstream/master my-feature my-other-feature master 

Luego puede eliminarlos:

 $ git branch -d my-feature $ git branch -d my-other-feature 

Si los cambios se aplicaron manualmente, es posible que no estén en el historial anterior, por lo que la sucursal local con los cambios de código equivalentes puede no aparecer en la list. Las sucursales donde este es el caso deben detectarse manualmente.

Eliminar references locales a sucursales remotas que no existen

Si tiene twigs locales que representan una twig remota que ya ha sido eliminada (la twig era para una request de extracción, y después de fusionar la request de extracción borró la twig a través de la GUI de github) hay un command git estándar para limpiar estas references de twig :

 $ git remote prune origin 

Eliminar twigs remotas que se han fusionado

Para get una list de twigs remotas en su fork que se han fusionado, es similar al primer command, pero use el -r (twigs remotas):

 $ git branch -r --merged upstream/master origin/my-feature origin/my-other-feature upstream/someone-elses-branch 

Para eliminar sus propias sucursales remotas que se han fusionado:

 $ git push origin :my-feature $ git push --delete origin my-other-feature # equivalent, just different syntax 

Solución de script

Tenga cuidado al usar una solución con guiones ya que es bastante fácil eliminar accidentalmente una twig que no tenía la intención de hacerlo. Dicho esto, recuerde que las twigs son solo references / nombres: eliminar una twig (por crash) no significa que los contenidos se pierden, sino que pueden recuperarse fácilmente (simplemente marque git reflog por ejemplo).

La secuencia de commands siguiente elimina las twigs locales y remotas que comienzan con "característica": esta es una forma de garantizar que su propia twig maestra actualizada, por ejemplo, no se borre por crash.

 #!/bin/bash # Eg save as ~/bin/git-cleanup, make executable and have ~/bin in your path # call as `git cleanup` echo -n "Fetching latest ... " git fetch origin git fetch upstream echo "done" echo "Deleting merged local feature branches ... " branches=`git branch --no-color --merged upstream/master` for branch in $branches; do if [[ "$branch" =~ ^feature ]]; then git branch -d $branch; fi done echo "done" echo "Deleting local refs to remote branches that don't exist ... " git remote prune origin git remote prune upstream echo "done" echo "Deleting merged remote feature and hotfix branches ... " branches=`git branch -r --no-color --merged upstream/master` for branch in $branches; do if [[ "$branch" =~ ^(origin)\/(feature.*$) ]]; then remote=${BASH_REMATCH[1]}; branch=${BASH_REMATCH[2]}; git push $remote :$branch; fi done echo "done" echo "" echo "all finished" 

Si ha actualizado su fork con las últimas confirmaciones del repository de subida (el que ha bifurcado), puede seguir " ¿Cómo puedo eliminar todas las twigs de git que ya están fusionadas? ".

 git branch --merged | grep -v "\*" | xargs -n 1 git branch -d 

Pero eso solo mostrará una list de las twigs fusionadas (a través de requestes de extracción, por ejemplo), no de selección selectiva (cuando solo se aplica la diferencia de una twig a otra).

Para la segunda categoría, es posible que tenga que diferenciar esas twigs locales y ver si todavía tienen diferencias que aún no forman parte de las twigs principales.