Odpowiedzi:
Bardzo porcelanowe polecenie, niezbyt dobre, jeśli chcesz tego do skryptu:
git branch -vv # doubly verbose!
Zauważ, że w git 1.8.3 ta gałąź nadrzędna jest wyświetlana na niebiesko (patrz „ Co to jest śledzenie tej gałęzi (jeśli w ogóle) w git? ”)
Jeśli chcesz uzyskać czysty wynik, zobacz odpowiedź arcresu - używa polecenia porcelany, które, jak sądzę, nie istniało w momencie, gdy pisałem tę odpowiedź, więc jest nieco bardziej zwięzłe i działa z gałęziami skonfigurowanymi do rebase, a nie tylko scalania.
git remote show origin
Zamień „origin” na dowolną nazwę pilota.
git remote show
polecenie faktycznie łączy się ze zdalnym repozytorium ... i dlatego zawiedzie, jeśli zdarzy się, że jesteś offline lub nie możesz połączyć się z repozytorium z jakiegokolwiek powodu ...
git remote show -n origin
aby uzyskać pewne informacje, nawet w trybie offline. Z dokumentacji zdalnej git : „Przy opcji -n zdalne głowy nie są najpierw pytane o git ls-remote <nazwa>; zamiast tego używane są informacje buforowane.”
git remote show | xargs git remote show -n
aby wyświetlić połączone informacje o śledzeniu dla wszystkich pilotów.
Jeśli spojrzysz na stronę podręcznika git-rev-parse
, zobaczysz następującą składnię:
<branchname>@{upstream}
Npmaster@{upstream}
,@{u}
Sufiks
@{upstream}
do nazwy gałęzi (skrócona forma<branchname>@{u}
) odnosi się do gałęzi, na której odgałęzienie określone przez nazwę gałęzi jest ustawione. Brakująca nazwa gałęzi jest domyślnie ustawiona na bieżącą.
Aby znaleźć górę oddziału master
, wykonaj następujące czynności:
git rev-parse --abbrev-ref master@{upstream}
# => origin/master
Aby wydrukować informacje dla każdego oddziału, możesz zrobić coś takiego:
while read branch; do
upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
if [[ $? == 0 ]]; then
echo $branch tracks $upstream
else
echo $branch has no upstream configured
fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)
# Output:
# master tracks origin/master
# ...
Jest to czystsze niż ręczne analizowanie referencji i konfiguracji.
done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)
Zwróć uwagę na dwie gwiazdki na końcu wzorca globu.
git rev-parse --abbrev-ref HEAD@{upstream}
wydaje się działać dobrze dla obecnego oddziału. To także tworzy miły alias git.
while
Składnia pętli wygląda nieco dziwne dla mnie. Możesz po prostu użyć, git for-each-ref ... | while read branch; do ...
który nie wymaga FIFO i działa w tej samej kolejności, co napisane polecenia.
git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
Alternatywą dla odpowiedzi kubi jest obejrzenie .git/config
pliku, który pokazuje konfigurację lokalnego repozytorium:
cat .git/config
git config --get-regex branch
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
pokaże wiersz dla każdego oddziału lokalnego. Oddział śledzenia będzie wyglądał następująco:
master <- origin/master
Bez śledzenia będzie wyglądać następująco:
test <-
git branch -vv
. 🙏
git config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
Dla aktualnej gałęzi, oto dwie dobre opcje:
% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
lub
% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline
Ta odpowiedź znajduje się również tutaj na nieco inne pytanie, które (błędnie) zostało oznaczone jako duplikat.
git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads
.
W przypadku bieżącego oddziału można również powiedzieć git checkout
(bez żadnego oddziału). Jest to brak operacji z efektami ubocznymi, aby wyświetlić informacje o śledzeniu, jeśli istnieją, dla bieżącej gałęzi.
$ git checkout
Your branch is up-to-date with 'origin/master'.
git checkout .
, co nie jest żadną opcją.
Używam tego aliasu
git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'
następnie
git track
Na podstawie odpowiedzi Oliviera Refalo
if [ $# -eq 2 ]
then
echo "Setting tracking for branch " $1 " -> " $2
git branch --set-upstream $1 $2
else
echo "-- Local --"
git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
echo "-- Remote --"
REMOTES=$(git remote -v)
if [ "$REMOTES" != '' ]
then
echo $REMOTES
fi
fi
Pokazuje tylko lokalnie ze skonfigurowaną ścieżką.
Napisz go na skrypcie o nazwie git-track na swojej ścieżce, a otrzymasz polecenie git track
Bardziej rozbudowana wersja na https://github.com/albfan/git-showupstream
git config --get-regexp "branch\.$current_branch\.remote"
poda nazwę śledzonego pilota
git config --get-regexp "branch\.$current_branch\.merge"
poda nazwę oddziału, który jest śledzony.
Musisz zastąpić $ current_branch nazwą swojej aktualnej gałęzi. Możesz uzyskać to dynamicznie za pomocągit rev-parse --abbrev-ref HEAD
Poniższy mini-skrypt łączy te rzeczy. Umieść go w pliku o nazwie git-tracking
, spraw , by był wykonywalny i upewnij się, że znajduje się na twojej ścieżce.
wtedy możesz powiedzieć
$ git tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>
zwróć uwagę, że nazwa oddziału zdalnego może różnić się od nazwy oddziału lokalnego (choć zazwyczaj nie jest). Na przykład:
$git tracking
xxx_xls_xslx_thing -> origin/totally_bogus
jak widać w kodzie, kluczem do tego jest wyodrębnienie danych z konfiguracji git. Po prostu używam sed, aby usunąć zbędne dane.
#!/bin/sh
current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
sed -e "s/^.* //" -e "s/refs\/.*\///")
echo "$current_branch -> $remote/$remote_branch"