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”.
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”.
Odpowiedzi:
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 origin
komendę, 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
git fetch
lub git pull
aktualizacje 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.
git remote show remote-name
odnoszą 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
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.
git branch -lvv
pokaz tylko lokalne oddziały z poprzedzającym może być przydatna
git branch -vv
działa dla mnie ...
Jeremy Bouse ilustruje sposób git remote show
wyś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-ref
zamiast 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-ref
Nauczył 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>.remote
i git config branch.<name>.merge
(prawdopodobnie używając git for-each-ref
do zbudowania poleceń dla każdej nazwy lokalnego oddziału).
git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
Dla danej branży, można korzystać git rev-parse
z @{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.
git rev-parse --symbolic-full-name HEAD
kontra git rev-parse --symbolic-full-name HEAD@{u}
, dzięki!
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.
set -e
, ale zwykle trzymam się jawnego sprawdzania. Ale w tym przypadku jest naprawdę lepiej.
git version 1.9.4
. Echos nic :(
.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/*
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”).