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”.


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

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.


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



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.


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.


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/*

5
git branch -vv

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


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:]]//"'

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


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


3
Pokazują gałęzie, ale nie rozumiem, który z nich śledzi.
PJ.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.