Jak stwierdzić, który oddział lokalny śledzi, który oddział zdalny w Git?

234

Chciałbym wiedzieć, czy istnieje sposób, aby stwierdzić, który oddział lokalny śledzi, który oddział zdalny w Git.

Korzystam z jednego zdalnego serwera o nazwie „origin”.

PJ
źródło
Popraw mnie, jeśli się mylę, jednak nie jest to gałąź zdalna, która domyślnie nazywa się origin, a nie serwer?
Chris Halcrow

Odpowiedzi:

196

Na przykładzie mojej kopii Puppet pobranej z wcześniejszego repozytorium Git na 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)

Jeśli miałbym wykonać następujące czynności:

$ 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'

I w końcu ponownie uruchom git remote show originkomendę, a następnie zobaczę w dolnej części:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master
Jeremy Bouse
źródło
1
Czy to oznacza, że ​​możesz śledzić wszystkie odległe gałęzie w marionetce, chociaż masz kilka lokalnych oddziałów. Co oznacza wiele „śledzonych” znaków w wyniku polecenia? „śledzone” przez który oddział lokalny?
PJ.
Zdalne oddziały są śledzone, że jeśli zrobić git fetchlub git pullaktualizacje do odległych oddziałów będą śledzone w sklonowanego repozytorium. Lokalne gałęzie są po prostu tym, że lokalne gałęzie zdalnych gałęzi, a tym samym aktualizacje zdalnych gałęzi, będą śledzone i łączone, gdy wydane zostanie odpowiednie polecenie. Podczas tworzenia gałęzi lokalnej wyraźnie dołączam opcję „-t”, aby upewnić się, że śledzi gałąź, z której pochodzi. Pamiętaj, że oddział lokalny może również śledzić inny oddział lokalny, więc nie musi to być oddział zdalny.
Jeremy Bouse
5
@PJ: Termin „ścieżka” ma dwa różne znaczenia w Git. „Śledzone” linie git remote show remote-nameodnoszą się do „gałęzi śledzących” (migawek gałęzi ze zdalnych repozytoriów). Linie „scala się z” odnoszą się do lokalnych gałęzi, które mają konfigurację „gałęzi upstream” (wykonanej z opcją --track/ gałęzi git lub kasy git i dlatego często mylone z „gałęziami śledzącymi”). -t
Chris Johnsen
gałąź zdalnego śledzenia ” jest aktualnym hasłem w słowniku dotyczącym „gałęzi śledzenia” wymienionych powyżej. Dokument został zaktualizowany w 8b3f3f84 .
ENTO
124

Dla wszystkich oddziałów:

git branch -avv

Tylko dla lokalnych oddziałów:

git branch -lvv

Tylko dla zdalnych oddziałów:

git branch -rvv

pokazuje wszystkie gałęzie, a także nazwę gałęzi upstream.

snew
źródło
2
To zdecydowanie najprostsza i najpełniejsza odpowiedź!
6
Na git wersji 1.7.7.5 to pokazuje mi się z lokalnym oddziałem i SHA-1 wskazuje na to, ale nie pokazuje śledzone zdalnego oddział ...
mpontillo
Działa dla mnie w wersji git 1.7.4.1 Drugie „v” jest wymagane do wyświetlenia gałęzi zdalnego śledzenia.
Peter Johnson
4
zmniejszenie wyjściowego git branch -lvvpokaz tylko lokalne oddziały z poprzedzającym może być przydatna
AB
5
^ git branch -vvdziała dla mnie ...
notacouch
52

Jeremy Bouse ilustruje sposób git remote showwyświetlania informacji o śledzeniu . To powinno wystarczyć, jeśli chcesz tylko informacje przeznaczone do spożycia przez ludzi.

Jeśli planujesz używać informacji w zautomatyzowanym kontekście (np. Skrypcie), powinieneś git for-each-refzamiast tego użyć niższego poziomu („hydraulika”) .

% 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

git for-each-refNauczył się %(upstream)żeton w Git 1.6.3 . We wcześniejszych wersjach Git będziesz musiał wyodrębnić informacje o śledzeniu za pomocą git config branch.<name>.remotei git config branch.<name>.merge(prawdopodobnie używając git for-each-refdo zbudowania poleceń dla każdej nazwy lokalnego oddziału).

Chris Johnsen
źródło
Rezultaty
Aby było to mniej zwięzłe, ale zapewniło dobry sposób na wizualne sprawdzenie, czy nazwy zdalne są takie same jak nazwy lokalnych oddziałów, wspólny git gotcha: w bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
płyty
19

Dla danej branży, można korzystać git rev-parsez @{u}lub @{upstream}przyrostek na nazwę oddziału, na przykład:

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

... lub dla skróconego formularza dodaj --abbrev-ref

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

Ogólnie można użyć branch@{upstream}składni tam, gdzie oczekuje się zatwierdzenia.

Mark Longair
źródło
1
+1 Twoja odpowiedź dała mi dokładnie to, czego potrzebowałem: git rev-parse --symbolic-full-name HEADkontra git rev-parse --symbolic-full-name HEAD@{u}, dzięki!
Tino
10

Używam następującego skryptu powłoki (o nazwie git-tracks), aby wyświetlić gałąź zdalną, która jest śledzona przez bieżącą gałąź:

#!/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:?}"

Przydałoby się również wspomniane wyżej git for-each-ref, ale znalazłem bezpośredni dostęp nieco prostszy niż filtrowanie danych wyjściowych dla bieżącej gałęzi.

Ingo Karkat
źródło
Możesz rozważyć użycie „set -e” na górze skryptu. To pozwoli ci usunąć wszystkie wystąpienia „|| exit $?” zachowując to samo zachowanie wczesnego niepowodzenia.
John Whitley,
@JohnWhitley: Dzięki, zredagowałem swoją odpowiedź. Wiem o tym set -e, ale zwykle trzymam się jawnego sprawdzania. Ale w tym przypadku jest naprawdę lepiej.
Ingo Karkat
Nie działa dla mnie git version 1.9.4. Echos nic :(
Ain
8

.git/config plik dostarczy również informacje o gałęzi śledzenia jako

[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/*
Karthik
źródło
5
git branch -vv

pokazuje dokładnie to, o co prosisz. Pokazuje lokalne oddziały wraz z odpowiednimi zdalnymi oddziałami, które śledzą.

Jarl
źródło
2

Dodaj te runy do [alias]sekcji pliku .gitconfig:

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

Musiałem znaleźć odpowiednią gałąź zdalną (jeśli istnieje) dla każdej gałęzi lokalnej w pętli działającej na liście gałęzi lokalnych. Skończyło się na tym, że:

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

To nie wyświetli nic (pusty ciąg) dla gałęzi lokalnych, które nie mają odpowiadającej gałęzi zdalnej („someremote / somebranch”).

Ville
źródło
-1

Wypróbuj git branch z opcjami :

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

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

W przeciwnym razie sprawdź swój .git/config.

Andrzej
źródło
3
Pokazują gałęzie, ale nie rozumiem, który z nich śledzi.
PJ.