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