Come dire quale filiale locale sta monitorando quale filiale remota in Git?


234

Vorrei sapere se c'è un modo per dire quale filiale locale sta monitorando quale filiale remota in Git.

Sto usando un server remoto, che si chiama "origine".


Correggimi se sbaglio, tuttavia non è un ramo remoto che viene chiamato origine per impostazione predefinita anziché il server ??
Chris Halcrow,

Risposte:


196

Usando l'esempio della mia copia di Puppet estratto dal repository Git upstream su Github.com ...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Quindi se dovessi eseguire quanto segue:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

E infine rieseguire nuovamente il git remote show origincomando, vedrò in basso in basso:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

1
Quindi questo significa che puoi tenere traccia di tutti i rami remoti del burattino anche se hai alcuni rami locali. Cosa significano i molti segni "tracciati" che vedi nel risultato del comando? "monitorato" da quale filiale locale?
PJ.

I rami remoti vengono tracciati in quanto se si esegue uno git fetcho gli git pullaggiornamenti ai rami remoti verranno tracciati nel repository clonato. I rami locali sono proprio questo, i rami locali dei rami remoti e quindi gli aggiornamenti ai rami remoti verranno tracciati e uniti quando viene dato il comando appropriato per farlo. Includo esplicitamente l'opzione '-t' quando si crea il ramo locale per assicurarsi che segua il ramo da cui proviene. Ricorda che un ramo locale può anche tenere traccia di un altro ramo locale, quindi non deve essere un ramo remoto.
Jeremy Bouse,

5
@PJ: Il termine "traccia" ha due significati distinti in Git. Le linee "tracciate" in si git remote show remote-nameriferiscono a "rami di tracciamento" (istantanee di rami da repository remoti). Le linee "si fonde con" si riferiscono ai rami locali che hanno una configurazione "ramo a monte" (realizzata con l' opzione --track/ -tdi git branch o git checkout e quindi spesso confusa con "tracking rami").
Chris Johnsen,

" ramo di tracciamento remoto " è la voce di glossario aggiornata per "rami di tracciamento" di cui sopra. Il documento è stato aggiornato in 8b3f3f84 .
ento,

124

Per tutte le filiali:

git branch -avv

Solo per filiali locali:

git branch -lvv

Solo per filiali remote:

git branch -rvv

mostra tutti i rami e il nome del ramo a monte.


2
Questa è di gran lunga la risposta più semplice e completa!

6
Nella versione 1.7.7.5 di git questo mi mostra il ramo locale e lo sha-1 a cui punta, ma non mostra il ramo remoto tracciato ...
mpontillo

Funziona per me su git versione 1.7.4.1 La seconda 'v' è richiesta per mostrare il ramo di tracciamento remoto.
Peter Johnson,

4
per ridurre l'output git branch -lvvpotrebbero essere utili solo le filiali locali con upstream
AB

5
^ git branch -vvfunziona per me ...
notacouch

52

Jeremy Bouse illustra come git remote showvengono visualizzate le informazioni di tracciamento . Ciò dovrebbe essere sufficiente se si desidera solo l'informazione per il consumo umano.

Se si prevede di utilizzare le informazioni in un contesto automatizzato (ad esempio uno script), è necessario utilizzare invece il livello inferiore ("impianto idraulico") git for-each-ref.

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

Il token git for-each-refappreso %(upstream)in Git 1.6.3 . Con le versioni precedenti di Git dovrai estrarre le informazioni di tracciamento con git config branch.<name>.remotee git config branch.<name>.merge(probabilmente usando git for-each-refper creare i comandi per ciascun nome di filiale locale).


L'output delle risposte è molto più conciso e più facile da seguire, quindi ottieni il voto più alto :)
CubanX,

Per renderlo meno sintetico, ma fornire un modo piacevole per verificare visivamente che i nomi remoti siano gli stessi dei nomi delle filiali locali, un git gotcha comune: in bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
piani di cottura

19

Per un ramo specifico, è possibile utilizzare git rev-parsecon il suffisso @{u}o @{upstream}sul nome del ramo, ad esempio:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... o per la forma abbreviata, aggiungere --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

In genere è possibile utilizzare la branch@{upstream}sintassi ovunque sia previsto un commit.


1
+1 La tua risposta mi ha dato esattamente quello di cui avevo bisogno: git rev-parse --symbolic-full-name HEADvs. git rev-parse --symbolic-full-name HEAD@{u}, grazie!
Tino,

10

Uso il seguente script di shell (denominato git-tracks) per mostrare il ramo remoto che viene tracciato dal ramo corrente:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

Questo potrebbe anche usare il menzionato git for-each-ref, ma ho trovato l'accesso diretto un po 'più semplice che filtrare l'output per il ramo corrente.


Potresti prendere in considerazione l'uso di "set -e" nella parte superiore dello script. Ciò ti consentirà di rimuovere tutte le istanze di "|| exit $?" pur mantenendo lo stesso comportamento precoce.
John Whitley,

@JohnWhitley: grazie, ho modificato la mia risposta. Lo so set -e, ma di solito attenersi al controllo esplicito. Ma in questo caso, è davvero meglio.
Ingo Karkat,

Non ci sto lavorando git version 1.9.4. Echos niente :(
Ain

8

.git/config il file fornirà anche le informazioni sul ramo di tracciamento come

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*

5
git branch -vv

mostra esattamente quello che chiedi. Mostra i rami locali insieme al ramo remoto corrispondente che stanno seguendo.


2

Aggiungi queste rune alla [alias]sezione del tuo file .gitconfig:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'

0

Avevo bisogno di trovare il ramo remoto corrispondente (se presente) per ogni ramo locale all'interno di un ciclo che stava agendo su un elenco dei rami locali. Ho finito per usare il seguente:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

Questo non genererà nulla (una stringa vuota) per i rami locali che non hanno un ramo remoto corrispondente ("someremote / somebranch").


-1

Prova git branch con le opzioni :

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

Altrimenti, esamina il tuo .git/config.


3
Mostrano i rami, ma non capisco quale stia rintracciando quale.
PJ.
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.