Pregunta limpiando viejas ramas remotas de git


Aquí está mi flujo de trabajo de git.

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

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

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

git push origin :heads/devel

git branch -d devel

Ahora si lo hago git branch -a en la computadora A, me sale

master
origin/HEAD
origin/master

Ahora voy a la computadora B. Do git fetch. Puedo eliminar la rama de desarrollo local

git branch -d devel

Pero no puedo eliminar la rama de desarrollo remoto.

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

Obra git branch -a sigue enumerando origen / desarrollo en ramas remotas.

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


506


origen


Respuestas:


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

Segundo, ya has eliminado heads/devel en origin, así que es por eso que no puedes 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 hasta el final de tu git declaración para ver el resultado de ejecutarlo sin ejecutarlo realmente.


942



Considera ejecutar:

git fetch --prune

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

Esto se puede simplificar aún más

git config remote.origin.prune true

esto es un per-repo configuración que hará que cualquier futuro git fetch or git pull para automáticamente ciruela pasa.

Para configurar esto para su usuario, también puede editar el .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 aplicarlo en todo el sistema (no solo para el usuario)

git config --system fetch.prune true

45



Aquí está el script bash que puede hacerlo por usted. Es una versión modificada de http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git guión. 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

13



Este comando "ejecutará en seco" borrará todo el control remoto (origin) ramas fusionadas, aparte de master. Puede cambiar eso o agregar ramas adicionales después del maestro: 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, elimine --dry-run. Además, es posible que desee probar esto en un tenedor primero.


6



Aquí es cómo hacerlo con SourceTree (v2.3.1):
 1. Haga clic en Buscar
 2. Marque "Podar rastrear ramales ..."
 3. Presione OK
 4.

enter image description here


3



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

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

Al hacerlo así, como lo anterior, git le proporcionará una lista de lo que sucedería si se ejecuta el siguiente comando.

A continuación, ejecute el siguiente comando para eliminar todas las ramas del repositorio remoto que no están en su repositorio local:

git push --all --prune

3



Si git branch -r muestra una gran cantidad de ramas de seguimiento remoto que no le interesan y desea eliminarlas solo de forma local, 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 los fusionados:

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

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

Y este paso por sí solo está incompleto porque esas ramas de rastreo remotas eliminadas aparecerían nuevamente el próximo git fetch.

Para detener la búsqueda de esas ramas de seguimiento remoto, debe especificar explícitamente las referencias 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 buscamos master, develop y suelta ramas, siéntete libre y agrega las tuyas.


2