¿Cómo puedo enumerar todas las sucursales remotas existentes en Git?

7 minutos de lectura

Avatar de usuario de Hum6
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”?

  • ¿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


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 origintu 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 fetchsi 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 -rpero 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 --prunesin embargo, su Git llama a su Git como de costumbre, enumera todos los nombres de sus sucursales y descubre que tiene un duro origin/feature/tallhecho cuando tenían feature/tally 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.2si 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 fetchy 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 establezca fetch.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 que git fetch. Desde git fetch es más corto de escribir, recomiendo usar git 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 como git 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.

Avatar de usuario de CodeWizard
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>

Avatar de usuario de Yevgen
Yevgen

Si lista referencias remotas con --heads parámetro especificado, obtendrá las ramas.

git ls-remote --heads

¿Ha sido útil esta solución?