Come posso vedere quali rami Git stanno monitorando quale ramo remoto / upstream?


Risposte:


1146

Molto un comando di porcellana, non va bene se lo si desidera per gli script:

git branch -vv   # doubly verbose!

Nota che con git 1.8.3, quel ramo a monte viene visualizzato in blu (vedi " Che cos'è questo tracciamento del ramo (se presente) in git? ")


Se vuoi un output pulito, vedi la risposta di arcresu : usa un comando di porcellana che non credo esistesse al momento in cui ho scritto originariamente questa risposta, quindi è un po 'più conciso e funziona con i rami configurati per rebase, non solo unisci.


3
Il primo metodo sopra non fornisce le informazioni desiderate per me. Il secondo ... sembra eccessivo, specialmente perché la risposta di Kubi funziona. Mi sto perdendo qualcosa?
garyp,

3
@garyp Non sei tu quello che ha posto la domanda. Il primo forniva ciò di cui aveva bisogno l'OP e il secondo forniva esattamente ciò di cui aveva bisogno, nel caso in cui lo volesse in un formato pulito per gli script o volesse semplicemente salvarlo come alias. ("Overkill" va bene se ti dà quello che vuoi e non devi ripeterlo.) Dal punto di vista di questa domanda, la risposta di kubi fornisce alcune informazioni estranee, e se c'è più di un telecomando, non lo fa mostra tutto, ma se soddisfa le tue esigenze, usalo sicuramente.
Cascabel,

2
Devo scuse. Quando mi sono imbattuto in origine il primo metodo, ho ricevuto alcuna informazione su ciò che le tracce che cosa, e avrei dichiarato che in modo esplicito. Ma ora vedo le informazioni di tracciamento, quindi devo aver avuto qualcosa di sbagliato nella mia configurazione. Così mi stavo perdendo qualcosa.
garyp,

2
FWIW Ero confuso perché -v e -vv mostrano un output simile. Il ramo tracciato viene mostrato tra parentesi quadre dopo l'hash e prima del commit più recente (sulla mia installazione homebrew OSX predefinita).
jerclarke,

3
Tutto ciò che fa per me è stampare l'ultimo hash di commit e commentare per ogni ramo.
capybaralet,

263

git remote show origin

Sostituisci "origine" con qualunque sia il nome del tuo telecomando.


11
Anche se questo comando di porcellana funziona un po 'per un essere umano (non tanto per uno script, quanto dovrebbe analizzare l'output di porcellana), ciò che non mi piace di questo approccio è che il git remote showcomando si collega effettivamente al repository remoto ... e quindi fallisce se ti capita di essere off-line o incapace di connetterti al repository per qualsiasi motivo ...
pvandenberk

17
@pvandenberk È possibile utilizzare git remote show -n originper ottenere alcune informazioni anche offline. Dalla documentazione di git remote : "Con l'opzione -n, le testine remote non vengono prima interrogate con git ls-remote <nome>; al loro posto vengono utilizzate le informazioni memorizzate nella cache."
Cerran,

5
Una cosa strana di questo comando: elenca i rami remoti come "tracciati", anche se non ci sono rami locali configurati per pull / push. Lo trovo sempre confuso. In realtà non sono chiaro cosa significhi "tracciato" in questo output. I documenti git sull'argomento fanno sembrare che un ramo remoto sia "tracciato" solo quando è collegato / associato a un ramo locale per push / pull ...
Hawkeye Parker

Il problema è che devo chiamarlo per tutti i nomi remoti fino a quando non vedo quello che sto effettivamente cercando.
jolvi,

2
@jolvi È possibile eseguire git remote show | xargs git remote show -nper visualizzare le informazioni di tracciamento combinate per tutti i telecomandi.
Synoli,

107

Se guardi la pagina man per git-rev-parse, vedrai che è descritta la seguente sintassi:

<branchname>@{upstream}, ad es master@{upstream}.@{u}

Il suffisso @{upstream}per un nome di ramo (forma abbreviata <branchname>@{u}) si riferisce al ramo su cui è impostato il ramo specificato da nome di ramo. Un nome di ramo mancante viene impostato automaticamente su quello corrente.

Quindi per trovare l'upstream del ramo master, faresti:

git rev-parse --abbrev-ref master@{upstream}
# => origin/master

Per stampare le informazioni per ogni ramo, potresti fare qualcosa del tipo:

while read branch; do
  upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
  if [[ $? == 0 ]]; then
    echo $branch tracks $upstream
  else
    echo $branch has no upstream configured
  fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)

# Output:
# master tracks origin/master
# ...

Questo è più pulito dell'analisi dei ref e della configurazione manuale.


Non riuscivo a capire quel pezzo in rev-parse nonostante lo trovassi, quindi grazie per la chiara spiegazione!
Alice Purcell,

3
Per quelli di noi che usano git-flow, con i rami denominati "feature / blahblah", la frase di chiusura del ciclo while dovrebbe leggere: done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)Nota i due asterischi alla fine del modello glob.
markeissler,

2
git rev-parse --abbrev-ref HEAD@{upstream}sembra funzionare bene per l'attuale ramo. È anche un bel gias alias.
Digikata,

La whilesintassi del loop mi sembra un po 'strana. Puoi semplicemente usare quello git for-each-ref ... | while read branch; do ...che non ha bisogno di un FIFO e funziona nello stesso ordine dei comandi scritti.
Daniel Böhmer,

Almeno da git 2.5.1, hai una linea congit for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
Mat M

81

Un'alternativa alla risposta di Kubi è dare un'occhiata al .git/configfile che mostra la configurazione del repository locale:

cat .git/config


6
Inoltre git config --get-regex branch
Tamir Daniely il

6
O, più specificamente, 'git config --get-regexp branch. * Merge'
yoyo

41
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

mostrerà una linea per ogni filiale locale. Un ramo di tracciamento sarà simile a:

master <- origin/master

Una non tracciabile sarà simile a:

test <- 

Bello, aggiungere un po 'di ordinamento e output TAB-bed: git for-each-ref --sort upstream --format ='% (refname: short)% 09 <-% (upstream: short) '
refs

Splendidamente conciso e l'output è in realtà molto più leggibile di quello accettato git branch -vv. 🙏
joki

L'unico problema è che non me lo ricordo, quindi l'ho usatogit config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
joki il

38

Per il ramo attuale , ecco due buone scelte:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

o

% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline

Questa risposta è anche qui , a una domanda leggermente diversa che era (erroneamente) contrassegnata come duplicata.


5
Sulla base di questo, tutti i rami possono essere elencati in un modo amichevole script: git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads.
Daniel James,

15

Per il ramo corrente, potresti anche dire git checkout(senza alcun ramo). Questa è una no-op con effetti collaterali per mostrare le informazioni di tracciamento, se esistenti, per il ramo corrente.

$ git checkout 
Your branch is up-to-date with 'origin/master'.

Abbastanza giusto, ma è possibile digitare accidentalmente git checkout ., che non è una no-op.
Tomasz Gandor,

6

Uso questo alias

git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'

poi

git track

5
Penso che valga la pena notare che con due parametri il tuo comando configura un ramo di traccia.
albfan,

3

Basato sulla risposta di Olivier Refalo

if [ $# -eq 2 ] 
then
    echo "Setting tracking for branch " $1 " -> " $2
    git branch --set-upstream $1 $2
else
    echo "-- Local --" 
    git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
    echo "-- Remote --" 
    REMOTES=$(git remote -v) 
    if [ "$REMOTES" != '' ]
    then
        echo $REMOTES
    fi  
fi

Mostra solo locale con traccia configurata.

Scrivilo su uno script chiamato git-track sul tuo percorso e otterrai un comando git track

Una versione più elaborata su https://github.com/albfan/git-showupstream


1

git config --get-regexp "branch\.$current_branch\.remote"

ti darà il nome del telecomando che viene monitorato

git config --get-regexp "branch\.$current_branch\.merge"

ti darà il nome del ramo remoto che viene monitorato.

Dovrai sostituire $ current_branch con il nome della tua filiale attuale. Puoi farlo in modo dinamico congit rev-parse --abbrev-ref HEAD

Il seguente mini-script combina queste cose. Inseriscilo in un file chiamato git-tracking, rendilo eseguibile e assicurati che sia nel tuo percorso.

allora puoi dire

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

notare che il nome della filiale remota può essere diverso dal nome della filiale locale (anche se di solito non lo è). Per esempio:

$git tracking 
xxx_xls_xslx_thing -> origin/totally_bogus

come puoi vedere nel codice, la chiave è estrarre i dati dalla configurazione di git. Uso solo sed per cancellare i dati estranei.

#!/bin/sh

current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
  sed -e "s/^.* //" -e "s/refs\/.*\///")

echo "$current_branch -> $remote/$remote_branch"

1

Eccone uno pulito e semplice. Può controllare git remote -v, che mostra tutta l'origine e l'upstream del ramo corrente.

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.