Hum6
Yo he tratado git remote -r
para ver todas las sucursales existentes remotas, pero encontré que el resultado incluye aquellas sucursales que se eliminan de forma remota.
¿Hay alguna manera de filtrar estas ramas “zombie”?
Esta pregunta tiene varios significados subyacentes posibles, por lo que tiene varias respuestas posibles. La cuestión clave aquí es que hay al menos dos diferentes Repositorios de Git involucrados.
Controles remotos
Antes de llegar a las dos respuestas, mencionemos que un remoto es solo un nombre corto como origin
. El mando a distancia en sí tiene la URL por el cual su Git llama a algún otro Git. Puedes tener tantos controles remotos como quieras. Hay cosas adicionales que puede hacer con un control remoto, además de simplemente almacenar una URL, pero almacenar una URL es lo más importante. El git remote
El comando es el principal comando de cara al usuario para trabajar con controles remotos, pero dado que git clone
crea el control remoto llamado origin
para usted inicialmente, casi nunca necesita usar git remote
.
Nombres de seguimiento remoto
Tu Git, en tu computadora, guarda y actualiza su repositorio Git. Tu Git tiene su nombres de ramas, nombres de etiquetas y otros nombres, y una colección de confirmaciones. El comete son la parte que su Git comparte con otros repositorios de Git, aunque también hay cierto grado de uso compartido de nombres.
Mientras tanto, debido a que Git ha llamado a otro Git antes y recuerda la URL para ese otro Git bajo el nombre origin
tu Git también recuerda su Los nombres de las ramas de Git. Para hacer esto, tu Git crea, en tu repositorio, nombres de seguimiento remoto1 como origin/master
. Estos nombres simplemente recuerdan que, la última vez que su Git llamó al otro Git en origin
, ellos dijo eso su master
era una identificación de hash particular.
cuando corres git fetch origin
(o solo git fetch
si solo hay un control remoto llamado origin
), su Git llama al otro Git en ese punto, obtiene cualquier compromiso nuevo que tengan y usted no, y actualiza todos sus seguimientos remotos origin/*
nombres
Correr git branch -r
enumerará sus nombres de seguimiento remoto, por lo que git branch -r
le muestra lo que su Git vio en su Git, la última vez que su Git se actualizó usando su Git. Tenga en cuenta que git branch -a
incluye git branch -r
pero agrega la palabra remotes/
en frente de origin/master
nombres2
Sin embargo, un problema que ocurre aquí es que pueden borrar algunos nombres de sucursales. Supongamos, por ejemplo, que su Git tenía una rama llamada feature/tall
ayer, pero ya no tiene esa sucursal. Su Git llamó a su Git ayer y creó o actualizó su origin/feature/tall
para que coincida con su feature/tall
. Ahora tu Git llama a su Git y ellos no enumere un feature/tall
.
-
De forma predeterminada, su Git no hace nada al respecto.
-
Si tu corres
git fetch --prune
sin embargo, su Git llama a su Git como de costumbre, enumera todos los nombres de sus sucursales y descubre que tiene un duroorigin/feature/tall
hecho cuando teníanfeature/tall
y elimina él.
Entonces, en general, debes agregar --prune
a cada git fetch
, para que los nombres de seguimiento remoto de su Git se eliminen tan pronto como su Git se dé cuenta de que están obsoletos (pero no antes). Puede configurar tu Git para hacer esto automáticamente:
git config fetch.prune true
Puede configurar su Git para tener esto como predeterminado para todo sus repositorios, en su computadora portátil o en cualquier máquina que use, con:
git config --global fetch.prune true
Ver el git config
documentación para una lista (muy larga) de todo git config
realmente puede hacer.
1La documentación de Git llama principalmente a estos nombres de sucursales de seguimiento remotopero creo que el significado es eventualmente más claro si dejamos la palabra rama fuera de aquí.
2Todos los nombres de Git (nombres de sucursales, nombres de etiquetas, nombres de seguimiento remoto y otros nombres similares) viven en espacios de nombres y tener nombres más largos y completos para hacerlos explícitos. Por ejemplo, su master
rama es realmente refs/heads/master
; tu etiqueta v1.2
si tienes uno, es realmente refs/tags/v1.2
. Nombres de seguimiento remoto como origin/master
son realmente refs/remotes/origin/master
.
Git normalmente quita el refs/heads/
parte de los nombres de las sucursales, el refs/tags/
parte de los nombres de las etiquetas, y la refs/remotes/
parte de los nombres de seguimiento remoto, al mostrarle estos nombres abreviados. Por alguna razón, git branch -a
solo se quita el refs/
parte cuando se muestran los nombres de seguimiento remoto, aunque git branch -r
se quita el refs/remotes/
parte. (La razón de esto no está clara para mí.)
Nombres de sucursales en el control remoto
Debido a que hay un segundo Git involucrado aquí, también puede hacer que su Git lo llame ahora mismo, haga que enumere todos los nombres de sus sucursales y haga que su Git imprima esos nombres. El git ls-remote
comando hace exactamente esto:
git ls-remote origin
llama al Git en origin
, les pide que enumeren su sucursal y etiqueta y otros nombres similares, y luego los imprime todos. (Él no es actualice cualquiera de sus nombres de seguimiento remoto: eso queda para git fetch
y también a git remote update
.)
El git remote show
dominio poder también llame al otro Git y obtenga información directamente de él, y muéstrelo. A veces lo hace ya veces no. Este es documentado, aunque no muy claramente; ver el git remote
documentación para detalles.
Resumen
-
git branch -r
muestra los nombres de seguimiento remoto de su Git. Esto es rápido ya que es completamente local. Pero puede estar desactualizado. -
git fetch
actualiza los nombres de seguimiento remoto de su Git; agregar-p
o--prune
para que limpie los obsoletos, o establezcafetch.prune
a la verdad Esto es lento ya que también agrega nuevas confirmaciones que tienen que usted no tiene, pero luego, sus nombres de seguimiento remoto son rápidos de usar. -
git remote update
básicamente hace lo mismo quegit fetch
. Desdegit fetch
es más corto de escribir, recomiendo usargit fetch
en cambio. -
git ls-remote
llama a otro Git y obtiene los nombres de sus sucursales. Esto es algo lento, pero no tan lento comogit fetch
si hay nuevas confirmaciones, ya que no obtiene las confirmaciones, solo los nombres y los ID de hash correspondientes. git remote show
a veces funciona localmente y, a veces, llama al otro Git. Encuentro su comportamiento algo confuso y no muy útil, y generalmente recomiendo evitarlo.
Asistente de código
Para listar sucursales:
# -a = all branches
$ git branch -a
# -r = remote branches
$ git branch -r
Para quitar ramas
git fetch
git fetch
actualizará su repositorio local con el contenido del control remoto.
agregando --prune
voluntad eliminar sucursal eliminada del control remoto pero no los eliminará localmente si están desprotegidos
$ git fetch --all --prune
git remote prune
Para limpiar las ramas de seguimiento remoto, lo que significa eliminar las referencias a ramas remotas que no existen, use el comando “git remote prune” y especifique el nombre remoto.
$ git remote prune <remote name>
Yevgen
Si lista referencias remotas con --heads
parámetro especificado, obtendrá las ramas.
git ls-remote --heads
¿Responde esto a tu pregunta? Eliminar las ramas de seguimiento que ya no están en el control remoto
– mkrieger1
28 de febrero de 2020 a las 20:03
git fetch --prune
– Fredrik
28 de febrero de 2020 a las 20:03
Por favor, checa el ls-remoto documentación.
– Lasse V. Karlsen
28 de febrero de 2020 a las 21:06
Este es definitivamente un mega duplicado. ¿Por qué no se ha cerrado hace mucho tiempo? No debemos responder las mismas preguntas de principiante una y otra vez.
-Peter Mortensen
11/04/2022 a las 20:02