Come elenco tutti i rami remoti in Git 1.7+?


635

Ci ho provato git branch -r, ma questo elenca solo i rami remoti che ho localizzato localmente. Come trovo l'elenco di quelli che non ho? (Non mi importa se il comando elenca tutti i rami remoti o solo quelli che non sono tracciati.)


11
Vuoi dire che è stato modificato il refspec di default, in modo che git fetche git remote updatenon recuperare tutti i rami del telecomando? Perché altrimenti potresti semplicemente recuperare e poi usare git branch -r...
Cascabel,

2
Devo avere. git branch -rmi mostrava solo rami remoti che avevo localizzato localmente. Ora funziona meglio.
James A. Rosen,

Risposte:


805

Per la stragrande maggioranza [1] dei visitatori qui, la risposta corretta e più semplice alla domanda "Come posso elencare tutte le filiali remote in Git 1.7+?" è:

git branch -r

Per una piccola minoranza [1] git branch -r non funziona. Se git branch -rnon funziona, prova:

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

Se git branch -rnon funziona, allora forse come Cascabel dice "è stato modificato il refspec di default, in modo che git fetche git remote updatenon recupera tutte le remote's rami" .


[1] Al momento della stesura di questa nota a piè di pagina 2018-febbraio, ho esaminato i commenti e ho visto che i git branch -rlavori per la stragrande maggioranza (circa il 90% o 125 su 140 ).

Se git branch -rnon funziona, controlla git config --get remote.origin.fetchcontiene un carattere jolly ( *) come da questa risposta


15
Puoi anche farlo in git ls-remote [url]modo da non
doverlo

142
Questa risposta è corretta ma fuorviante, la prima cosa che gli utenti che arrivano qui dai motori di ricerca dovrebbe vedere è: git branch -rpoiché questa è la risposta corretta e più semplice, il richiedente ha avuto un caso speciale in cui ha modificato il comportamento del suo git branch -rche la maggior parte degli utenti che vengono qui non lo faranno avere
Stephan,

24
@Stephan: ne sei sicuro? git branch -rinoltre non ha funzionato per me. Sta solo elencando i rami già tracciati localmente. Ma git ls-remote --heads
ho

2
Se uno vuole recuperare dai rami elencati tramite git ls-remote (e non elencati in git branch -r), è necessario eseguire git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"prima di recuperare come descritto su stackoverflow.com/a/26649770/873282 .
Koppor,

11
Non dimenticare di fare git fetch --allprima di ottenere tutti gli attuali rami remoti.
A. Attia,

173

remote show mostra tutti i rami sul telecomando, inclusi quelli che non sono tracciati localmente e anche quelli che non sono stati ancora recuperati.

git remote show <remote-name>

Prova anche a mostrare lo stato dei rami rispetto al tuo repository locale:

> 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)

Esattamente. Non recuperato, non localizzato localmente.
Giovedì

3
branch_that_is_not_tracked tracked?
Piotr Dobrogost,

3
@PiotrDobrogost Sì! branch_that_is_not_trackedè un ramo che non è tracciato da nessun ramo git locale. Tuttavia, è stato recuperato nel repository locale (quindi è presente un ramo remoto). Per qualche strana ragione git remote showchiama questo stato tracked, anche se non esiste un ramo locale che traccia il telecomando. In questo caso, l'opposto di trackedè new, che significa "non recuperato".
Klas Mellbourn,

questo non funziona a livello di programmazione, troppo difficile da analizzare
Alexander Mills,

Ciò ha riscontrato un caso speciale in cui avevo estratto localmente un ramo remoto che era stato rimosso sul telecomando. Quindi git branch -rsuggerisce che esiste ancora un ramo remoto, ma lo git remote show origindimostra refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove). Molto più utile!
icc97,

54
git branch -a | grep remotes/*

10
Questo è sostanzialmente equivalente a git branch -r, che l'OP ha detto non era abbastanza buono.
Cascabel,

9
in realtà entrambi git branch -aed git branch -relenco tutti i rami remoti per me, non sono sicuro se quello che ha detto l'OP è vero. Ho appena installato un repository di prova e verificato questo (aveva solo l'origine / master di tracciamento principale ma ho ancora visto tutti i rami remoti con entrambe le bandiere).
Idan K,

2
sembra che questo non elenchi tutti i rami remoti se clono da un repository pull esistente e quindi punto manualmente l'origine sul server git. La risposta accettata gestisce questo caso.
Nielsbot,

Questa soluzione non sembra elencare i rami remoti creati dall'ultima volta che ho recuperato.
Anubian Noob,

La cosa strana: per anni l'ho git fetchseguito git branch -a, che solo di recente ha iniziato a fallire per me. Forse il comportamento git è stato cambiato?
Sebastian Mach,

39

Utilizzando git branch -relenca tutti i rami remoti ed git branch -aelenca tutti i rami su locale e remoto. Queste liste però sono obsolete. Per mantenere aggiornati questi elenchi, esegui

git remote update --prune

che aggiornerà l'elenco delle filiali locali con tutti quelli nuovi dal telecomando e rimuoverà quelli che non ci sono più. L'esecuzione di questo comando di aggiornamento senza --prune recupererà i nuovi rami ma non li cancellerà più sul telecomando.

Puoi velocizzare questo aggiornamento specificando un telecomando, altrimenti estrarrà gli aggiornamenti da tutti i telecomandi che hai aggiunto, in questo modo

git remote update --prune origin

Questo risolto il mio problema - 'git branch -r' ora funziona per me.
Francis Norton,

27

Ma

git branch -ar

dovrebbe farlo.


41
Il passaggio in entrambi gli argomenti è ridondante. -rrestituisce solo filiali remote. -arestituisce filiali locali e remote. Pertanto, git branch -aed git branch -arentrambi producono lo stesso output.
Walter Roman,

19

Puoi anche farlo git fetchseguito da a git branch -r. Senza recupero non vedrai i rami più attuali.


git fetch --allper avere tutte le filiali attuali
A. Attia

19

Git Branching - Branch remoti

git ls-remote

Documentazione Git .


git ls-remote - teste per ottenere risultati più specifici
Wolfgang Fahl

1
Questo è l'unico comando che elenca anche il mio ramo che ho inserito accidentalmente senza heads/dentro refs/heads/features/my-branch, grazie!
MSA


9

TL; TR;

Questa è la soluzione del tuo 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

Il miglior comando da eseguire è git remote show [remote]. Questo mostrerà tutti i rami, remoti e locali, tracciati e non tracciati.

Ecco un esempio da un progetto open source:

> 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)

Se vogliamo solo ottenere i rami remoti, possiamo usare grep. Il comando che vorremmo usare sarebbe:

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

Con questo 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

Puoi anche creare un alias per questo:

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

Quindi puoi semplicemente correre git branches.




4

Basta eseguire un git fetchcomando. Tirerà tutti i rami remoti nel tuo repository locale, quindi eseguirà un git branch -aelenco per elencare tutti i rami.


1

Se c'è un ramo remoto che sai dovrebbe essere elencato, ma non viene elencato, potresti voler verificare che l'origine sia impostata correttamente con questo:

git remote show origin

Se va bene, forse dovresti eseguire un aggiornamento:

git remote update

Supponendo che funzioni correttamente, dovresti essere in grado di fare ciò che dicono le altre risposte:

git branch -r

1

Usando questo 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

Elenca tutti i rami remoti inclusi i messaggi di commit e gli ID di commit a cui fanno riferimento i rami remoti.


1

Io userei:

git branch -av

Questo comando non solo mostra l'elenco di tutti i rami, inclusi quelli remoti che iniziano con /remote, ma fornisce anche il *feedback su ciò che hai aggiornato e gli ultimi commenti di commit.


0

Assicurati che l'origine remota che stai elencando sia davvero il repository che desideri e non un clone più vecchio.


0

Ho finito per fare una pipeline di pasticcio per ottenere ciò che volevo. Ho appena unito i rami dal telecomando di origine:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.