Scopri quale ramo remoto sta monitorando un ramo locale

Guarda anche:
come posso ottenere git per mostrarmi quali rami stanno tenendo traccia di cosa?

Come posso scoprire quale ramo remoto sta monitorando un ramo locale?

Devo analizzare l’output di git config o c’è un comando che farebbe questo per me?

Ecco un comando che ti dà tutti i rami di tracciamento (configurato per ‘pull’), vedi:

 $ git branch -vv main aaf02f0 [main/master: ahead 25] Some other commit * master add0a03 [jdsumsion/master] Some commit 

Devi attraversare lo SHA e tutti i messaggi di commit a lungo termine, ma è veloce da digitare e ottengo i rami di tracciamento allineati verticalmente nella 3a colonna.

Se hai bisogno di informazioni sulla configurazione ‘pull’ e ‘push’ per filiale, vedi l’altra risposta git remote show origin .


Aggiornare

A partire da git versione 1.8.5 è ansible mostrare il ramo upstream con git status e git status -sb

Due 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 

Penso che git branch -av ti dica solo quali rami hai e quali sono i loro commit, lasciandoti intendere quali rami remoti i rami locali stanno seguendo.

git remote show origin indica esplicitamente quali rami tracciano quali rami remoti. Ecco un esempio di output da un repository con un singolo commit e un ramo remoto chiamato abranch :

 $ git branch -av * abranch d875bf4 initial commit master d875bf4 initial commit remotes/origin/HEAD -> origin/master remotes/origin/abranch d875bf4 initial commit remotes/origin/master d875bf4 initial commit 

contro

 $ git remote show origin * remote origin Fetch URL: /home/ageorge/tmp/d/../exrepo/ Push URL: /home/ageorge/tmp/d/../exrepo/ HEAD branch (remote HEAD is ambiguous, may be one of the following): abranch master Remote branches: abranch tracked master tracked Local branches configured for 'git pull': abranch merges with remote abranch master merges with remote master Local refs configured for 'git push': abranch pushes to abranch (up to date) master pushes to master (up to date) 

Aggiornamento: Beh, sono passati diversi anni da quando ho postato questo! Per il mio scopo specifico di confrontare HEAD a monte, ora uso @{u} , che è una scorciatoia che si riferisce all’HEAD del ramo di monitoraggio a monte. (Vedi https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemsterupstreamememuem ).

Risposta originale: ho incontrato anche questo problema. Uso spesso più telecomandi in un unico repository ed è facile dimenticare su quale è il tracciato attuale. E a volte è utile saperlo, ad esempio quando vuoi controllare i tuoi commit locali tramite git log remotename/branchname..HEAD .

Tutto questo materiale è memorizzato nelle variabili git config, ma non è necessario analizzare l’output di git config. Se invochi git config seguito dal nome di una variabile, stamperà semplicemente il valore di tale variabile, senza alcuna analisi richiesta. Con questo in mente, ecco alcuni comandi per ottenere informazioni sulla configurazione di monitoraggio del tuo attuale ramo:

 LOCAL_BRANCH=`git name-rev --name-only HEAD` TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge` TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote` REMOTE_URL=`git config remote.$TRACKING_REMOTE.url` 

Nel mio caso, poiché sono interessato solo a scoprire il nome del mio attuale telecomando, lo faccio:

 git config branch.`git name-rev --name-only HEAD`.remote 

Le filiali locali e i loro telecomandi.

 git branch -vv 

Tutti i rami e i telecomandi di tracciamento.

 git branch -a -vv 

Scopri dove i rami locali sono configurati in modo esplicito per push and pull.

 git remote show {remote_name} 

Questo ti mostrerà il ramo su cui ti trovi:

 $ git branch -vv 

Questo mostrerà solo il ramo corrente su cui ti trovi:

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

per esempio:

 myremote/mybranch 

Puoi trovare l’URL del telecomando utilizzato dal ramo corrente su cui ti trovi:

 $ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1) 

per esempio:

 https://github.com/someone/somerepo.git 

Non so se questo conta come l’analisi dell’output di git config, ma questo determinerà l’URL del remoto che il master sta monitorando:

 $ git config remote. $ (git config branch.master.remote) .url

Puoi usare git checkout , cioè “controlla il ramo attuale”. Questo è un 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'. 

Ancora un altro modo

 git status -b --porcelain 

Questo ti darà

 ## BRANCH(...REMOTE) modified and untracked files 

Un altro modo semplice è usare

cat .git/config in un repository git

Questo elencherà i dettagli per le filiali locali

Un altro metodo (grazie osse), se vuoi solo sapere se esiste o meno:

 if git rev-parse @{u} > /dev/null 2>&1 then printf "has an upstream\n" else printf "has no upstream\n" fi 
 git branch -r -vv 

elencherà tutti i rami incluso remoto.

Io uso EasyGit (aka “eg”) come un wrapper super leggero sopra (o lungo il lato) di Git. EasyGit ha un sottocomando “info” che ti fornisce tutti i tipi di informazioni super utili, incluso il branch di monitoraggio remoto dei rami correnti. Ecco un esempio (dove il nome attuale del ramo è “foo”):

 pknotz @ s883422: (foo) ~ / workspace / bd
 $ es. info
 Impegni totali: 175
 Archivio locale: .git
 Repository remoti nominati: (nome -> posizione)
   origine -> git: //sahp7577/home/pknotz/bd.git
 Succursale attuale: foo
   Somma di controllo crittografica (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
   Repository pull / push predefinito: origine
   Opzioni di pull / push predefinite:
     branch.foo.remote = origine
     branch.foo.merge = refs / heads / aal_devel_1
   Numero di contributori: 3
   Numero di file: 28
   Numero di directory: 20
   Dimensione del file più grande, in byte: 32473 (pygooglechart-0.2.0 / COPYING)
   Impegni: 62

Io uso questo alias

 git config --global alias.track '!sh -c " if [ \$# -eq 2 ] then echo \"Setting tracking for branch \" \$1 \" -> \" \$2; git branch --set-upstream \$1 \$2; else git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v; fi " -' 

poi

 git track 

si noti che lo script può essere utilizzato anche per impostare il tracciamento.

Altri ottimi alias su https://github.com/orefalo/bash-profiles

Se stai usando Gradle,

“ `

 def gitHash = new ByteArrayOutputStream() project.exec { commandLine 'git', 'rev-parse', '--short', 'HEAD' standardOutput = gitHash } def gitBranch = new ByteArrayOutputStream() project.exec { def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d' -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'" commandLine "bash", "-c", "${gitCmd}" standardOutput = gitBranch } 

“ `

Seguendo il comando si farà riferimento alla fork corrente dell’origine remota

git remote -v

Per aggiungere un percorso remoto,

git remote aggiungi origine nome_percorso