¿Cómo enumero todas las sucursales remotas en Git 1.7+?


635

Lo intenté git branch -r, pero eso solo enumera ramas remotas que he rastreado localmente. ¿Cómo encuentro la lista de los que no tengo? (No me importa si el comando enumera todas las ramas remotas o solo aquellas que no están rastreadas).


11
¿Quiere decir que ha modificado el refspec defecto, por lo que git fetchy git remote updateno recupera todas las ramas del mando a distancia? Porque de lo contrario, podrías buscar y luego usar git branch -r...
Cascabel

2
Debo tener. git branch -rsolo me mostraba ramas remotas que había rastreado localmente. Funciona mejor ahora.
James A. Rosen

Respuestas:


805

Para la gran mayoría [1] de visitantes aquí, la respuesta correcta y más simple a la pregunta "¿Cómo enumero todas las sucursales remotas en Git 1.7+?" es:

git branch -r

Para una pequeña minoría [1] git branch -r no funciona. Si git branch -rno funciona, intente:

git ls-remote --heads <remote-name>

Si git branch -resto no funciona, entonces tal como Cascabel dice "has modificado el refspec defecto, por lo que git fetchy git remote updateno recupera todas las remoteramas 's" .


[1] Al momento de escribir esta nota al pie de página 2018-feb, miré los comentarios y vi que git branch -rfunciona para la gran mayoría (alrededor del 90% o 125 de 140 ).

Si git branch -rno funciona, la verificación git config --get remote.origin.fetchcontiene un comodín ( *) según esta respuesta


15
También puede hacerlo git ls-remote [url]para no tener que clonarlo primero :)
Zsub

142
Esta respuesta es correcta pero engañosa, lo primero que deberían ver los usuarios que vienen aquí de los motores de búsqueda es: git branch -rdado que esa es la respuesta correcta y más simple, el autor de la pregunta tuvo un caso especial en el que modificó el comportamiento suyo git branch -rque la mayoría de los usuarios que vienen aquí no verán tener
Stephan

24
@Stephan: ¿estás seguro de esto? git branch -rTampoco funcionó para mí. Solo enumera las sucursales que ya se rastrean localmente. Pero git ls-remote --headsenumeró todas las ramas disponibles en el repositorio remoto ...
rexford

2
Si se desea obtener de las ramas enumeradas a través de git ls-remote(y no enumeradas en git branch -r), se debe ejecutar git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"antes de recuperar como se describe en stackoverflow.com/a/26649770/873282 .
koppor

11
No olvide hacer git fetch --allantes para obtener todas las ramas remotas actuales.
A. Attia

173

remote show muestra todas las ramas en el control remoto, incluidas las que no se rastrean localmente e incluso las que aún no se han recuperado.

git remote show <remote-name>

También intenta mostrar el estado de las ramas en relación con su repositorio local:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)

Exactamente. No recuperado, no rastreado localmente.
Thufir

3
branch_that_is_not_tracked tracked?
Piotr Dobrogost

3
@PiotrDobrogost ¡Sí! branch_that_is_not_trackedes una rama que no es rastreada por ninguna rama local de git. Sin embargo, se ha recuperado en el repositorio local (por lo que hay una rama remota). Por alguna extraña razón git remote showllama a este estado tracked, a pesar de que no hay una rama local que rastrea el control remoto. En este caso, lo contrario de trackedes new, que significa "no obtenido".
Klas Mellbourn

esto no funciona programáticamente, demasiado difícil de analizar
Alexander Mills

Esto captó un caso especial que tuve en el que había extraído una rama remota localmente que luego había sido eliminada en el control remoto. Luego git branch -rsugiere que todavía hay una rama remota, pero git remote show originmuestra eso refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove). Mucho más útil!
icc97

54
git branch -a | grep remotes/*

10
Esto es básicamente equivalente a lo git branch -rque el OP dijo que no era lo suficientemente bueno.
Cascabel

99
en realidad ambos git branch -ay git branch -renumero todas las ramas remotas para mí, no estoy seguro de si lo que dijo el OP es cierto. Acabo de configurar un repositorio de prueba y verifiqué esto (solo tenía el origen de seguimiento maestro / maestro pero aún vi todas las ramas remotas con ambas banderas).
Idan K

2
parece que esto no enumera todas las ramas remotas si clono desde un repositorio extraído existente y luego apunto manualmente el origen al servidor git. La respuesta aceptada maneja este caso.
nielsbot

Esta solución no parece enumerar ramas remotas creadas desde la última vez que busqué.
Anubian Noob

Lo extraño: durante años he usado git fetchseguido git branch -a, que recientemente comenzó a fallar para mí. Tal vez el comportamiento git fue cambiado?
Sebastian Mach

39

El uso git branch -renumera todas las ramas remotas y git branch -aenumera todas las ramas en local y remoto. Sin embargo, estas listas quedan desactualizadas. Para mantener estas listas actualizadas, ejecute

git remote update --prune

que actualizará su lista de sucursales locales con todas las nuevas del control remoto y eliminará las que ya no estén allí. Ejecutar este comando de actualización sin --prune recuperará nuevas ramas pero no eliminará las que ya no están en el control remoto.

Puede acelerar esta actualización especificando un control remoto, de lo contrario, obtendrá actualizaciones de todos los controles remotos que haya agregado, como así

git remote update --prune origin

Esto solucionó mi problema: 'git branch -r' ahora funciona para mí.
Francis Norton

27

Pero

git branch -ar

Deberías hacerlo.


41
Pasar ambos argumentos es redundante. solo-r devuelve ramas remotas. devuelve ramas locales y remotas. Por lo tanto, y ambos producen la misma salida. -agit branch -agit branch -ar
Walter Roman

19

También puede hacerlo git fetchseguido de a git branch -r. Sin buscar no verá las ramas más actuales.


git fetch --alltener todas las sucursales actuales
A. Attia



9

TL; TR;

Esta es la solución de su problema:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

o:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches

5

El mejor comando para ejecutar es git remote show [remote]. Esto mostrará todas las sucursales, remotas y locales, con seguimiento y sin seguimiento.

Aquí hay un ejemplo de un proyecto de código abierto:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

Si solo queremos obtener las ramas remotas, podemos usar grep. El comando que nos gustaría usar sería:

grep "\w*\s*(new|tracked)" -E

Con este comando:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

También puede crear un alias para esto:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

Entonces puedes simplemente correr git branches.




4

Solo ejecuta un git fetchcomando. Atraerá todas las ramas remotas a su repositorio local y luego hará una git branch -alista de todas las ramas.


1

Si hay una rama remota que sabe que debería estar en la lista, pero no aparece en la lista, es posible que desee verificar que su origen esté configurado correctamente con esto:

git remote show origin

Si todo está bien, tal vez debería ejecutar una actualización:

git remote update

Suponiendo que se ejecuta con éxito, debe poder hacer lo que dicen las otras respuestas:

git branch -r

1

Usando este comando,

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

Enumera todas las ramas remotas, incluidos los mensajes de confirmación y los ID de confirmación a los que se refieren las ramas remotas.


1

Yo usaría:

git branch -av

Este comando no solo le muestra la lista de todas las ramas, incluidas las ramas remotas que comienzan /remote, sino que también le proporciona *comentarios sobre lo que actualizó y los últimos comentarios de confirmación.


0

Asegúrese de que el origen remoto que está enumerando es realmente el repositorio que desea y no un clon más antiguo.


0

Terminé haciendo un desorden para conseguir lo que quería. Acabo de fusionar ramas del control remoto de origen:

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.