ver remotas remota ramas rama comandos cambiar git git-branch

comandos - limpiar viejas ramas de git remotas



git push (7)

Aquí está cómo hacerlo con SourceTree (v2.3.1):
1. Haga clic en Fetch
2. Marque "Poder ramas de seguimiento ..."
3. presiona OK
4. 😀

Aquí está mi flujo de trabajo git.

Trabajo desde dos computadoras diferentes (A y B) y almaceno un remoto git común en el directorio de Dropbox.

Digamos que tengo dos ramas maestro y desarrollo. Ambos están rastreando sus contrapartes remotas origin / master y origin / devel.

Ahora, mientras estoy en la computadora A, borro el desarrollo de sucursales, tanto local como remoto, de la siguiente manera:

git push origin :heads/devel git branch -d devel

Ahora si hago git branch -a en la computadora A, obtengo

master origin/HEAD origin/master

Ahora voy a la computadora B. Haz git fetch . Puedo quitar la rama de desarrollo local por

git branch -d devel

Pero no puedo quitar la rama de desarrollo remota.

git push origin :heads/devel error: unable to push to unqualified destination: heads/proxy3d The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. fatal: The remote end hung up unexpectedly

Haciendo git branch -a todavía muestra el origen / desarrollo en ramas remotas.

¿Cómo puedo limpiar la entrada remota de devel desde la máquina B?


Aquí está el script de bash que puede hacerlo por usted. Es la versión modificada de http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git script. Mi modificación le permite soportar diferentes ubicaciones remotas.

#!/bin/bash current_branch=$(git branch --no-color 2> /dev/null | sed -e ''/^[^*]/d'' -e ''s/* /(.*/)//1/'') if [ "$current_branch" != "master" ]; then echo "WARNING: You are on branch $current_branch, NOT master." fi echo -e "Fetching merged branches.../n" git remote update --prune remote_branches=$(git branch -r --merged | grep -v ''/master$'' | grep -v "/$current_branch$") local_branches=$(git branch --merged | grep -v ''master$'' | grep -v "$current_branch$") if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then echo "No existing branches have been merged into $current_branch." else echo "This will remove the following branches:" if [ -n "$remote_branches" ]; then echo "$remote_branches" fi if [ -n "$local_branches" ]; then echo "$local_branches" fi read -p "Continue? (y/n): " -n 1 choice echo if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then remotes=`echo "$remote_branches" | sed ''s//(.*/)///(.*/)//1/g'' | sort -u` # Remove remote branches for remote in $remotes do branches=`echo "$remote_branches" | grep "$remote/" | sed ''s//(.*/)///(.*/)/:/2 /g'' | tr -d ''/n''` git push $remote $branches done # Remove local branches git branch -d `git branch --merged | grep -v ''master$'' | grep -v "$current_branch$" | sed ''s/origin////g'' | tr -d ''/n''` else echo "No branches removed." fi fi


Considera ejecutar:

git fetch --prune

De forma regular en cada repositorio para eliminar las sucursales locales que han estado siguiendo una rama remota que se ha eliminado (ya no existe en el repositorio de GIT remoto).

Esto puede ser simplificado aún más por

git config remote.origin.prune true

esta es una configuración per-repo que hará que cualquier git fetch or git pull futuro se git fetch or git pull automáticamente.

Para configurar esto para su usuario, también puede editar el archivo .gitconfig global y agregar

[fetch] prune = true

Sin embargo, se recomienda que esto se haga usando el siguiente comando:

git config --global fetch.prune true

o para aplicarlo a todo el sistema (no solo para el usuario)

git config --system fetch.prune true


Este comando "ejecutará en seco" eliminará todas las ramas fusionadas remotas ( origin ), aparte de la master . Puede cambiar eso o agregar ramas adicionales después de master: grep -v for-example-your-branch-here |

git branch -r --merged |   grep origin |   grep -v ''>'' |   grep -v master |   xargs -L1 |   awk ''{sub(/origin///,"");print}''|   xargs git push origin --delete --dry-run

Si se ve bien, quite el --dry-run . Además, es posible que desee probar esto en un tenedor primero.


Primero, ¿cuál es el resultado de git branch -a en la máquina B?

En segundo lugar, ya ha eliminado heads/devel en origin , por lo que no puede eliminarlo de la máquina B.

Tratar

git branch -r -d origin/devel

o

git remote prune origin

o

git fetch origin --prune

y siéntase libre de agregar --dry-run al final de su declaración git para ver el resultado de ejecutarlo sin ejecutarlo realmente.


Si git branch -r muestra muchas sucursales de seguimiento remoto en las que no está interesado y desea eliminarlas solo de las locales, use el siguiente comando:

git branch -r | grep -Ev ''HEAD|master|develop'' | xargs -r git branch -rd

Una versión más segura sería eliminar solo las fusionadas:

git branch -r --merged | grep -Ev ''HEAD|master|develop'' | xargs -r git branch -rd

Esto podría ser útil para proyectos grandes, en los que no necesita las ramas de características de otros compañeros de equipo, pero tiene muchas ramas de seguimiento remoto en el clon inicial.

Y solo este paso está incompleto porque esas ramas de seguimiento remoto eliminadas se mostrarán de nuevo en la próxima git fetch .

Para detener la captura de esas ramas de seguimiento remoto, debe especificar explícitamente las referencias que se van a buscar en .git / config :

[remote "origin"] # fetch = +refs/heads/*:refs/remotes/origin/* fetch = +refs/heads/master:refs/remotes/origin/master fetch = +refs/heads/develop:refs/remotes/origin/develop fetch = +refs/heads/release/*:refs/remotes/origin/release/*

En el ejemplo anterior solo obtenemos master , develop y liberamos sucursales, siéntete libre y agrega la tuya.


La eliminación es siempre una tarea desafiante y puede ser peligrosa !!! Por lo tanto, primero ejecute el siguiente comando para ver qué sucederá:

git push --all --prune --dry-run

Al hacer esto como en el ejemplo anterior, git le proporcionará una lista de lo que sucedería si se ejecutara el siguiente comando.

Luego ejecute el siguiente comando para eliminar todas las ramas del repositorio remoto que no estén en su repositorio local:

git push --all --prune