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 -a
en la computadora A, obtengo la siguiente lista de ramas.
- Maestro
- origen / CABEZA
- origen / maestro
Ejecutando git fetch
en 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 -a
máquina B?En segundo lugar, ya ha eliminado
heads/devel
elorigin
, así que por eso no puede eliminarla de la máquina B.Tratar
o
o
y siéntase libre de agregar
--dry-run
al final de sugit
declaración para ver el resultado de ejecutarlo sin ejecutarlo realmente.Documentos para
git remote prune
ygit branch
.fuente
git remote prune origin
funcionó para mí =>* [pruned] origin/my-old-branch
git remote prune origin --dry-run
muestra lo que se eliminaría sin hacerlo realmente.git fetch origin --prune
fue perfecto para eliminar ramas eliminadasgit branch -vv
seguido porgit branch -D branchname
y finalmente la ciruela es la mejor manera.git config remote.origin.prune true
Considera 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-repo
configuración que hará que cualquier futuro seagit fetch or git pull
automá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
sed
s. Reemplazarsed 's/\(.*\)\/\(.*\)/\1/g'
porsed 's/\([^/]*\)\/\(.*\)/\1/g'
Este comando "ejecutará en seco" eliminará todas las
origin
ramas 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 -r
muestra 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
,develop
y liberamos ramas, sentir la libertad de adaptar como sea necesario.fuente
git fetch origin branchname
o crear un aliasft = "!f() { git fetch origin $(git rev-parse --abbrev-ref HEAD);}; f"
para recuperar solo la rama actual (mi favorito personal). Salud.-r
bandera? Veo quexargs
tiene una-R
discusión pero no encontré nada al respecto-r
. Quiero decir, en teoría, si recuerdo correctamente cómoxargs
funciona, incluso sin-r
que debería funcionar.| xargs git branch -d
. Además, al eliminar la-r
opció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,
git
le 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 --merged
no 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 origin
Parecí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 -v
deberí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
xargs
sintaxis 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