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 origin / master y origin / devel.
Ahora, mientras estoy en la computadora A, elimino el desarrollo de sucursales, en local y remoto.
git push origin :heads/devel
git branch -d devel
Ejecutando git branch -aen la computadora A, obtengo la siguiente lista de ramas.
- Maestro
- origen / CABEZA
- origen / maestro
Ejecutando git fetchen la computadora B, puedo eliminar la rama de desarrollo local con git branch -d devel, pero no puedo eliminar la rama de desarrollo remoto.
git push origin :heads/devel devuelve los siguientes mensajes de error.
error: no se puede enviar a un destino no calificado: heads / proxy3d
La especificación de referencia de destino no coincide con una referencia existente en el control remoto ni comienza con referencias /, y no podemos adivinar un prefijo basado en la referencia de origen.
fatal: el extremo remoto colgó inesperadamente
git branch -a todavía enumera origen / desarrollo en las ramas remotas.
¿Cómo puedo limpiar las ramas remotas de la computadora B?
fuente

Respuestas:
Primero, ¿cuál es el resultado de la
git branch -amáquina B?En segundo lugar, ya ha eliminado
heads/develelorigin, así que por eso no puede eliminarla de la máquina B.Tratar
o
o
y siéntase libre de agregar
--dry-runal final de sugitdeclaración para ver el resultado de ejecutarlo sin ejecutarlo realmente.Documentos para
git remote pruneygit branch.fuente
git remote prune originfuncionó para mí =>* [pruned] origin/my-old-branchgit remote prune origin --dry-runmuestra lo que se eliminaría sin hacerlo realmente.git fetch origin --prunefue perfecto para eliminar ramas eliminadasgit branch -vvseguido porgit branch -D branchnamey finalmente la ciruela es la mejor manera.git config remote.origin.prune trueConsidera correr:
De forma regular en cada repositorio para eliminar sucursales locales que han estado rastreando una sucursal remota que se elimina (ya no existe en el repositorio GIT remoto).
Esto se puede simplificar aún más mediante
esto es un
per-repoconfiguración que hará que cualquier futuro seagit fetch or git pullautomáticamente pode .Para configurar esto para su usuario, también puede editar el archivo .gitconfig global y agregar
Sin embargo, se recomienda que esto se haga usando el siguiente comando:
o para aplicarlo en todo el sistema (no solo para el usuario)
fuente
Aquí hay un script bash que puede hacerlo por usted. Es la versión modificada del http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git script. Mi modificación le permite admitir diferentes ubicaciones remotas.
fuente
seds. Reemplazarsed 's/\(.*\)\/\(.*\)/\1/g'porsed 's/\([^/]*\)\/\(.*\)/\1/g'Este comando "ejecutará en seco" eliminará todas las
originramas combinadas remotas ( ), aparte demaster. Puede cambiar eso o agregar ramas adicionales después del maestro:grep -v for-example-your-branch-here |Si se ve bien, retire el
--dry-run. Además, es posible que desee probar esto en una bifurcación primero.fuente
Si
git branch -rmuestra muchas ramas de seguimiento remoto que no le interesan y desea eliminarlas solo de local, use el siguiente comando:Una versión más segura sería eliminar solo las fusionadas:
Esto podría ser útil para proyectos grandes, donde no necesita las ramas de características de otros compañeros de equipo, pero hay muchas ramas de seguimiento remoto obtenidas en el clon inicial.
Sin embargo, este paso por sí solo no es suficiente, porque esas ramas de seguimiento remoto eliminadas volverían a aparecer a continuación
git fetch.Para dejar de buscar esas ramas de seguimiento remoto, debe especificar explícitamente las referencias para recuperar en .git / config :
En el ejemplo anterior, sólo recuperamos
master,developy liberamos ramas, sentir la libertad de adaptar como sea necesario.fuente
git fetch origin branchnameo crear un aliasft = "!f() { git fetch origin $(git rev-parse --abbrev-ref HEAD);}; f"para recuperar solo la rama actual (mi favorito personal). Salud.-rbandera? Veo quexargstiene una-Rdiscusión pero no encontré nada al respecto-r. Quiero decir, en teoría, si recuerdo correctamente cómoxargsfunciona, incluso sin-rque debería funcionar.| xargs git branch -d. Además, al eliminar la-ropción (--remotes) degit branch -d, solo limpiamos las ramas locales (lo cual puede ser suficiente teniendo en cuenta que, de forma predeterminadagit branch, no muestra ramas remotas de todos modos).xargs -r, es decir--no-run-if-empty, es una extensión GNU significa, aquí hay una buena explicación .¡La eliminación siempre es una tarea desafiante y puede ser peligrosa ! Por lo tanto, primero ejecute el siguiente comando para ver qué sucederá:
Al hacerlo como lo anterior,
gitle proporcionará una lista de lo que sucedería si se ejecuta el siguiente comando.Luego ejecute el siguiente comando para eliminar todas las ramas del repositorio remoto que no están en su repositorio local:
fuente
-n(ejecución en seco) a este comando para que pueda obtener una vista previa de los cambios y luego, si todo está bien, vuelva a llamarlo sin-n.Aquí se explica cómo hacerlo con SourceTree (v2.3.1):
1. Haga clic en Recuperar
2. Marque "Podar ramas de seguimiento ..."
3. Presione OK
4. 😀
fuente
Tendré que agregar una respuesta aquí, porque las otras respuestas no cubren mi caso o son innecesariamente complicadas. Uso github con otros desarrolladores y solo quiero que todas las sucursales locales cuyos controles remotos fueron (posiblemente fusionados y) eliminados de un github PR se eliminen de una vez de mi máquina. No, cosas como
git branch -r --mergedno cubren las ramas que no se fusionaron localmente, o las que no se fusionaron (abandonaron), etc., por lo que se necesita una solución diferente.De todos modos, el primer paso lo obtuve de otras respuestas:
Una carrera en seco de
git remote prune originParecía que haría lo mismo en mi caso, así que elegí la versión más corta para que sea simple.Ahora, a
git branch -vdebería marcar las ramas cuyos controles remotos se eliminan como[gone]. Por lo tanto, todo lo que necesito hacer es:Tan simple como eso, elimina todo lo que quiero para el escenario anterior.
La
xargssintaxis menos común es que también funciona en Mac y BSD además de Linux. Cuidado, este comando no es una ejecución en seco, por lo que forzará la eliminación de todas las ramas marcadas como[gone]. Obviamente, al ser esto, nada se ha ido para siempre, si ve que se eliminan las ramas que recuerda que quería mantener, siempre puede recuperarlas (el comando anterior habrá enumerado su hash en la eliminación, por lo que es muy simple)git checkout -b <branch> <hash>.fuente
Pode las mismas ramas de referencias locales y remotas (en mi ejemplo de
origin).fuente